K8S之pod生命周期
Pod的基本概念
-
最小的部署单元
-
一组容器的集合
-
一个Pod中的容器共享网络命名空间和存储卷
-
Pod是短暂的
Pod存在的意义
- Pod为亲密性应用而存在
亲密性应用场景:
- 两个应用之间发生文件交互
- 两个应用之间通过lo或socket通信
- 两个应用之间需要频发的调用
Pod声明周期
Pod的生命周期是通过Replication Controller来管理的。Pod的生命周期过程包括:通过模板进行定义,然后分配到一个Node上运行,在Pod所含容器运行结束后Pod也结束。在整个过程中,Pod处于一下4种状态之一:
- Pending:Pod定义正确,提交到Master,但其所包含的容器镜像还未完成创建。通常Master对Pod进行调度需要一些时间,之后Node对镜像进行下载也需要一些时间;正在初始化中的Pod处于Pending状态
- Running:Pod已被分配到某个Node上,且其包含的所有容器镜像都已经创建完成,并成功运行起来;
- Succeeded:Pod中所有容器都成功终止,并且不会被重启,这是Pod的一种最终状态(所有容器都以“0”的状态退出);
- Failed:Pod中所有容器都结束了,至少有一个容器以非0状态退出。
- Unknown:因为某些原因无法取得 Pod 的状态,通常是因为与 Pod 所在主机通信失败。
Kubernetes为Pod设计了一套独特的网络配置,包括:为每个Pod分配一个IP地址,使用Pod名作为容器间通信的主机名等。另外,不建议在Kubernetes的一个Pod内运行相同应用的多个实例。
Pod生命周期的几个阶段
1.当kubectl创建指令下达到api接口,被调度到kubelet上,kubelet首先调用CRI完成容器环境的初始化。
2.开始进入pod的生命周期,pod开始创建。
3.首先进行Pause基础容器创建,Pause负责网络和存储卷的共享等基础操作。
4.如果定义了Init容器,先进行Init容器(Init C)的创建,Init容器叫初始化容器,可以做一些初始化的操作,比如生成一些应用容器需要的文件。Init C只是用来初始化的,在初始化完成后Init C就会死亡,并不会跟随一直跟随pod的生命周期存在。Init C可以是多个,它不是必须的,也可以没有。多个Init C不能并行运行,一个Init C完成后,才能进行下一个Init C的构建。如果Init容器失败,k8s会不断重启该Pod,直到Init容器运行成功为止。然而,如果pod对应的restartPolicy为Never,那么它不会重启。在所有的nit容器没有成功之前,Pod将不会变成Ready状态。Init容器的端口将不会在Service中进行聚集。
需要注意的是:Init容器具有与应用程序容器分离的单独镜像,所以它们的启动相关代码具有如下优势:
- 他们可以包含并运行实用工具,但是出于安全考虑,是不建议在应用程序容器镜像中包含这些实用工具的
- 它们可以包含实用工具和定制化代码来安装,但是不能出现在应用程序镜像中
- 应用程序镜像可以分离出创建和部署的角色,而没有必要联合它们构建一个单独的镜像。
- Linux Namespace,所以相对应用程序容器来说具有不同的文件系统视图。因此,它们能够具有访问Secret的权限,而应用程序容器则不能。
- 它们必须在应用程序容器启动之前运行完成,而应用程序容器是并行运行的,所以Init容器能够提供了一种简单的阻塞或延迟应用容器的启动的方法,直到满足了一组先决条件。
5.开始创建主容器(Main C)
6.主容器Main C运行过程中,如果定义了start操作,首先进行一个start操作。
7.然后如果定义了readiness就绪检测,就执行readiness就绪检测,readiness检测成功完成后,pod才会显示running,才会对外提供服务。
8.如果定义了liveness存活检测,也会同时开始执行,如果liveness检测失败,kubelet杀死该Pod,然后根据重启策略restartPolicy决定是否对pod执行重启。若容器中不包含liveness探针,则kubelet认为该pod的liveness探针返回值永远是success。liveness存活检测是持续过程,一直持续到stop操作完成之后,Main C结束之前。
9.主容器Main C结束退出时,如果定义了stop操作,则先进行stop操作,stop操作完成以后才允许退出。
init实例:
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: harbor.hongfu.com/library/busybox:v1
command: ['sh', '-c',