pod的生命周期

1、pod定义:pod是k8s中最小的资源管理组件,也是最小化运行容器化应用的资源管理对象。pod是一个抽象的概念,可以理解为一个或多个容器化应用的集合,通常在一个pod中运行一个容器(最常用的方式),在一个pod中可以同时运行多个容器,在一个pod中可以同时封装几个需要耦合的互相协作的容器,这些容器共享资源,也可以互相协作组成一个service单位对外提供访问。不论运行一个还是多个容器,k8s管理的都是pod而不是容器

一个pod内的容器必须都运行在同一个节点上,基于现在容器技术的要求,最常见的是一个pod运行一个容器,一个容器只运行一个进程,主要为了横向扩展,方便扩缩容,还为了解耦,一个pod内运行多个容器,耦合度太高,一旦一个进程失败,整个pod将全部失败。通过一个容器运行一个pod的方式实现解耦,基于pod可以创建多个副本,实现高可用和负载均衡,便于管理,简单直观

2、pod内的容器共享网络资源和存储资源,由pause提供共享资源的机制

pause容器是基础容器,也称为父容器,管理pod内容器的共享操作,还管理容器的生命周期,k8s提供pause容器两大核心功能:

(1)为pod内的所有容器提供一个命名空间

(2)启动容器内的pid命名空间,每个pod中都有一个pid为1的进程(pause进程),包括分配资源、回收僵尸进程(pause进程管理每个pod内的所有进程)

注:创建pod时,先创建pause,再拉取镜像生成容器,最后形成pod

kubelet管理节点上的容器,pause管理pod内的容器

pod的生命周期_第1张图片pause容器共享两种资源,网络资源和存储资源。每个pod会分配一个集群内部的唯一的IP地址,pod内的容器共享网络(pod在集群内部的IP地址和端口),pod内部的容器可以使用localhost互相通信,pod中的容器与外部通信时,从共享的资源当中进行分配。比如宿主机的端口映射

pod可以指定多个共享的volume,pod内的容器共享这些volume,volume可以实现数据的持久化,防止pod重新构建之后文件消失

3、pause容器的特点【面试题】

(1)创建pod就会创建pause

(2)pause容器共享网络资源和存储资源

总结:

每个pod都有一个基础容器pause容器

pause容器对应的镜像属于k8s集群的一部分,创建集群就会有pause这个基础镜像

pod里面包含了一个或多个相关的容器(应用)

pod的生命周期_第2张图片4、pause的作用

(1)pod内部有一组容器,挂了一个,整个pod就失效了吗?引入pause机制,代表整个容器的组的状态,可以解决对pod内部整体状态的判断

(2)pod内的容器共享IP地址,共享挂载卷,解决容器内网络通信问题和容器内文件共享问题

5、pod的分类

(1)自主式pod

特点:不会自我修复,若pod内容器进程终止或被删除或因缺少资源被驱逐,该pod无法自愈

(2)控制器管理pod

特点:可以滚动升级、自愈(自动重启)、管理pod的数量以及pod的扩缩容

6、pod的生命周期【面试题。必问】

pending

挂起状态

pod已被创建,但尚未被分配到运行的node节点。一直处于pending状态,会导致节点资源不够,需等待其他pod的调度

running

运行状态

pod已被分配到node节点,pod内部所有容器都已经启动,运行状态正常、稳定

completed(successed)

正常退出状态

容器内部的进程运行完毕,正常退出,没有发生错误

failed

非正常退出状态

pod中的容器非正常退出,发生错误,需要通过查看详情和日志来定位问题

unkown

由于某些原因,k8s无法获取pod的状态

(一般是apiserver出现问题。少见)

terminating

终止中,pod正在被删除,里面的容器正在终止。终止过程中,资源回收,垃圾清理以及终止过程中需要执行的命令需要一些时间

pod的生命周期_第3张图片创建pod的容器分类

第一步:基础容器pause

第二步:初始化容器init(自定义)

第三步:业务容器

注:基础容器和初始化容器全部成功启动后才启动业务容器

7、实验。如何自定义初始化容器以及容器创建顺序

pod的生命周期_第4张图片

pod的生命周期_第5张图片

pod的生命周期_第6张图片

注:①在pod启动过程中,容器按照初始化容器先启动,每个容器都必须在下一个容器启动之前成功退出

②若运行失败,会按照容器的重启策略(always、never、onfailure非正常退出重启)进行指定动作

③所有的init容器没有成功之前,pod不会进入ready状态。init容器与service无关,不能对外提供访问

④重启pod,所有的init容器一定会重新执行

⑤基于deployment创建的pod,若修改init容器的spec(参数),只限制于镜像,修改其他字段不生效

⑥每个容器的名称都唯一,不能重复

pod的生命周期_第7张图片

pod的生命周期_第8张图片

8、init容器的作用

环境变量

  1. 可以在创建的过程中为业务容器定制相关的代码和工具
  2. init容器独立于业务容器,是单独构建的镜像,对业务容器不产生任何安全影响
  3. init容器能以不同于pod内应用容器的文件系统视图、secrets权限。应用容器无法访问secrets权限

总结:

init容器提供应用容器运行之前的先决条件,提供一种阻塞机制(延迟机制)来控制应用容器的启动,只有前置条件满足才会创建pod内的应用容器

  1. pod的重启策略

pod的重启策略(基于容器的在状态)

Always

只要容器退出,总是重启,不论容器的状态码是否正常(默认策略。在deployment的yaml文件中重启策略只能是always)

Never

只要容器退出,不论容器的状态码是否正常都不重启

OnFailure

只有容器状态码非0时才会重启容器,正常退出不重启

重启策略不会影响 Pod 本身的终止状态。只要 Pod 中至少有一个容器在运行,就认为 Pod 处于“正在运行”阶段。如果 Pod 中的所有容器都退出,则 Pod 会过渡到“已完成”或“失败”阶段,具体取决于最后一个容器的退出状态

验证onfailure

pod的生命周期_第9张图片

正常退出

pod的生命周期_第10张图片

非正常退出

pod的生命周期_第11张图片

pod的生命周期_第12张图片

pod的生命周期_第13张图片

你可能感兴趣的:(kubernetes,容器,云原生)