Pod生命周期

我们一般将pod对象从创建至终的这段时间范围称为pod的生命周期,它主要包含下面的过程:

  • pod创建过程
  • 运行初始化容器(init container)过程
  • 运行主容器(main container)过程

       容器启动后钩子(post start)、容器终止前钩子(pre stop)
       容器的存活性探测(liveness probe)、就绪性探测(readiness probe)

  • pod终止过程

初始化容器

初始化容器是在pod的主容器启动之前要运行的容器,主要是做一些主容器的前置工作,它具有两大特征:
1.初始化容器必须运行完成直至结束,若某初始化容器运行失败,那么kubernetes需要重启它直到成功完成
2.初始化容器必须按照定义的顺序执行,当且仅当前一个成功之后,后面的一个才能运行初始化容器有很多的应用场景,下面列出的是最常见的几个:

  • 提供主容器镜像中不具备的工具程序或自定义代码
  • 初始化容器要先于应用容器串行启动并运行完成,因此可用于延后应用容器的启动直至其依赖的条件得到满足接下来做一个案例,模拟下面这个需求:

假设要以主容器来运行nginx,但是要求在运行nginx之前先要能够连接上mysql和redis所在服务器
为了简化测试,事先规定好mysql(192.168.xx.xx)和redis(192.168.xx.xx)服务器的地址
创建pod-initcontainer.yaml,内容如下:

apiVersion: v1
kind: Pod
metadata:
 name: pod-initcontainer
 namespace: dev
spec :
 containers:
 - name: main-container
   image: nginx:1.17.1
   ports:
   - name:nginx-port
     containerPort: 88
 initContainers:
 - name: test-mysql
   image: busybox:1.30
   command:['sh','-c','until ping 192.168.xx.xx -c 1 ; do echo waiting for mysql...;
sleep 2; done;']
 - name: test-redis
   image: busybox:1.30
   command: ['sh','-c','until ping 192.168.xx.xx -c 1 ; do echo waiting for reids...;
sleep 2; done;']

创建测试网络:

ifconfig ens33:1 192.168.xx.xx netmask 255.255.255.0 up

为了方便观察效果,加上-w滚动查看

kubectl get pod pod-initcontainer -n dev -w

钩子函数

kubernetes在主容器的启动之后和停止之前提供了两个钩子函数:

  • post start:容器创建之后执行,如果失败了会重启容器
  • pre stop :容器终止之前执行,执行完成之后容器将成功终止,在其完成之前会阻塞删除容器的操作

钩子处理器支持使用下面三种方式定义动作:

  • Exec命令:在容器内执行一次命令

lifecycle :
 postStart:
  exec:
   command:
   - cat
   - /tmp/healthy

  • TCPSocket:在当前容器尝试访问指定的socket

lifecycle:
 postStart: 
  tcpSocket: 
   port: 8080

  • HttpGet:在当前容器中向某url发起http请求

lifecycle :
 postStart:
  httpGet :
   path: /#URI地址
   port: 80 #端口号
   host: 192.168.xx.xx #主机地址
   scheme: HTTP #支持的协议,http或者https

创建pod-hook-exec.yaml文件

apiVersion: v1
kind: Pod
metadata:
 name: pod-hook-exec
 namespace: dev
spec :
 containers:
 - name: main-container
   image: nginx:1.17.1
   ports:
   - name: nginx-port
     containerPort: 88
   lifecycle :
    postStart:
     exec:# 在容器启动的时候执行一个命令,修改掉nginx的默认首页内容
      command: ["/bin/sh","-c", "echo postStart...> /usr/share/nginx/html/index.htm]"]
    preStop:
     exec:#在容器停止之前停止nginx服务
      command:["/usr/sbin/nginx","-s","quit"]

容器探测

容器探测用于检测容器中的应用实例是否正常工作,是保障业务可用性的一种传统机制。如果经过探测,实例的状态不符合预期,那么kubernetes就会把该问题实例" 摘除",不承担业务流量。kubernetes提供了两种探针来实现容器探测,分别是:

  • liveness probes:存活性探针,用于检测应用实例当前是否处于正常运行状态,如果不是,k8s会重启容器·
  • readiness probes:就绪性探针,用于检测应用实例当前是否可以接收请求,如果不能,k8s不会转发流量

livenessProbe 决定是否重启容器,readinessProbe 决定是否将请求转发给容器。

支持三种探测方式exec、tcpsocket、httpget,跟上面命令一样,直接看实例

创建pod-liveness-exec.yaml
apiVersion: v1
kind: Pod
metadata:
 name: pod-liveness-exec
 namespace: dev
spec :
 containers:
 - name: nginx
   image: nginx:1.17.1
   ports:
   - name: nginx-port
     containerPort: 80
   livenessProbe :
    exec :
     command: ["/bin/cat","/tmp/hello.txt"]# 执行一个查看文件的命令

至此,已经使用liveness Probe演示了三种探测方式,但是查看livenessProbe的子属性,会发现除了这三种方式,还有一些其他的配置,在这里一并解释下:
[root@master ~]# kubectl explain pod.spec.containers.livenessProbeFIELDS:
exec <Object>
tcpSocket<0bject>
httpGet<0bject>
initialDelaySeconds <integer> #容器启动后等待多少秒执行第一次探测
timeoutSeconds<integer>       #探测超时时间。默认1秒,最小1秒
periodSeconds<integer>        #执行探测的频率。默认是10秒,最小1秒
failureThreshold<integer>     # 连续探测失败多少次才被认定为失败。默认是3。最小值是1
successThreshold<integer>     # 连续探测成功多少次才被认定为成功。默认是1

重启策略

在上一节中,一旦容器探测出现了问题,kubernetes就会对容器所在的Pod进行重启,其实这是由pod的重启策略决定的,pod的重启策略有3种,分别如下:

  • Always:容器失效时,自动重启该容器,这也是默认值,
  • OnFailure : 容器终止运行且退出码不为0时重启
  • Never: 不论状态为何,都不重启该容器

重启策略适用于pod对象中的所有容器,首次需要重启的容器,将在其需要时立即进行重启,随后再次需要重启的操作将由kubelet延迟一段时间后进行,且反复的重启操作的延迟时长以此为10s、20s、40s、80s、160s和300s,300s是最大延迟时长。

创建pod-restartpolicy.yaml:
apiVersion: v1
kind: Pod
metadata:
 name: pod-restartpolicy
 namespace: dev
spec :
 containers:
 - name:nginx
   image: nginx:1.17.1
   ports:
   - name: nginx-port
     containerPort: 80
   livenessProbe :
    httpGet :
     scheme : HTTP
     port: 80
     path: /he110
 restartPolicy:Never # 设置重启策略为Never

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐