k8s六Pod生命周期

Posted 攻城狮白玉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s六Pod生命周期相关的知识,希望对你有一定的参考价值。

目录

前言

什么是探针

探测方式

检测探针-就绪检测

新建资源清单

调整就绪状态

检测探针-存活检测

存活检测-exec方式

存活检测-httpGet方式

存活检测-TCP方式

启动、退出动作

总结

写在后面


前言

上一篇文章【k8s】五、Pod生命周期(一),我们介绍了容器的生命周期,以及详细介绍了Init Containers和通过动手实践加深对于Init Containers的理解。限于篇幅原因,在生命周期图里面的start、stop、readiness、liveness都没有详细说。各位同学就通过本文来一起学习Pod生命周期剩下的知识点。

大家一起来温习下面这张Pod生命周期图。

本图描述了在容器环境初始化完成之后,pod从创建到退出,中间这段时间经历的过程;

如果还没有k8s实验环境的同学,可以翻看我之前的文章

【k8s】一、基础实验环境准备

【k8s】二、containerd的安装

【k8s】三、k8s集群的初始化

什么是探针

探针是由kubelet对容器执行时的定期诊断。要执行诊断,kubelet调用由容器实现额Handler。有三种类型的处理程序:

  • ExecAction:在容器内执行指定命令。如果命令退出时返回码为0,则认为诊断成功。
  • TCPSocketAction:对指定端口上的容器的IP地址进行TCP检查。如果端口打开,则诊断被认为是成功的。
  • HTTPGetAction:对指定的端口和路径上的容器IP地址执行HTTP Get请求。如果响应的状态码大于等于200且小于400,则诊断被认为是成功的。

每次探测都将获得以下三种结果之一:

  • 成功:容器通过了诊断
  • 失败:容器未通过诊断
  • 未知:诊断失败,因此不会采取任何行动。

探测方式

livenessProbe:知识容器是否正在运行。如果存活加测失败,则kubelet会杀死容器,并且容器将受到其重启策略的影响。如果容器不提供存活探针,则默认状态为Success

readinessProbe:指示容器是否准备好服务请求。如果就绪探测失败,端点(Node)控制器将从与Pod匹配的所有Service的端点(Node)中删除该Pod的IP地址。初始延迟之前的就绪状态默认为Failure。如果容器不提供就绪探针,则默认状态为Success。readiness就绪检测通过后,容器状态改变为READY

检测探针-就绪检测

接下来我们通过一个实验来了解一下就绪检测探针readinessProbe。

我们新建了一个Pod,里面有一个带有nginx的容器。这个容器通过http方式的get请求去访问baiyu.html。如果访问成功,则容器就绪。

新建资源清单

# readiness-probe.yaml
# author: 攻城狮白玉
apiVersion: v1
kind: Pod
metadata:
  name: readiness-httpget-pod
  namespace: baiyu-learn-k8s
spec:
  containers:
  - name: readiness-httpget-container
    image: nginx:1.23.1
    imagePullPolicy: IfNotPresent
    readinessProbe:
      httpGet:
        port: 80
        path: /baiyu.html
        scheme: HTTP
      initialDelaySeconds: 1
      periodSeconds: 3
  • initialDelaySeconds延时1秒后开始检测
  • periodSeconds整理表示每3秒重试一次

新建完readiness-probe.yaml资源文件后,通过命令启动

kubectl apply -f readiness-probe.yaml

查看Pod状态

kubectl get pod -o wide -n baiyu-learn-k8s

如图所示,当前的Pod已经处于running状态,但是就绪状态还是为0。这是因为我们的容器里面访问不到baiyu.html这个网页。

调整就绪状态

现在我们进入容器内部,在nginx容器中增加baiyu.html文件

进入容器内部

kubectl exec readiness-httpget-pod -n baiyu-learn-k8s -it /bin/bash

在容器内部执行下列命令

# 进入nginx网页目录
cd /usr/share/nginx/html/
# 新建一个baiyu.html文件
echo "I am baiyu" > baiyu.html
# 退出容器
exit

完成上述步骤之后,你再执行查看Pod状态的命令时就会发现,READY状态已经变为1了。如下图所示。

 

检测探针-存活检测

我们讲完了就绪探针,那写下来便再一起学习存活检测探针。顾名思义,就是检测你Pod里面的容器是否存活。

存活检测-exec方式

# liveness-exec.yaml
# author: 攻城狮白玉
apiVersion: v1
kind: Pod
metadata:
  name: liveness-exec-pod
  namespace: baiyu-learn-k8s
spec:
  containers:
  - name: liveness-exefc-container
    image: busybox:1.32
    imagePullPolicy: IfNotPresent
    command: ["/bin/sh","-c","touch /tmp/live ;sleep 60; rm -rf /tmp/live; sleep 3600"]
    livenessProbe:
      exec:
        command: ["test","-e","/tmp/live"]
      initialDelaySeconds: 1
      periodSeconds: 3

因为容器时新建了一个/tmp/live文件后60s删除。因此,容器前60秒的存活检测是正常的,当60秒过后,/tmp/live文件删除之后,存活检测失败,于是容器重启。

存活检测-httpGet方式

# liveness-httpget.yaml
# author: 攻城狮白玉
apiVersion: v1
kind: Pod
metadata:
  name: liveness-httpget-pod
  namespace: baiyu-learn-k8s
spec:
  containers:
  - name: liveness-httpget-container
    image: nginx:1.23.1
    imagePullPolicy: IfNotPresent
    ports:
    - name: http
      containerPort: 80
    livenessProbe:
      httpGet:
        port: 80
        path: /index.html
      initialDelaySeconds: 1
      periodSeconds: 3
      timeoutSeconds: 10

此时我们发现容器是正常访问的。

接着我们删掉nginx中的index.html文件

kubectl exec liveness-httpget-pod -n baiyu-learn-k8s -it -- rm -rf /usr/share/nginx/html/index.html

观察Pod的状态

kubectl get pod liveness-httpget-pod -n baiyu-learn-k8s -o wide -w

我们会发现,当存活探针http请求不到index.html时,Pod会重新启动,此时我们会发现restart计数变为1了。

存活检测-TCP方式

nginx容器的端口是80端口,因此下面这个资源清单执行之后,存活检测是检查的80端口,因此Pod会一直处于成功状态。

# liveness-tcp.yaml
# author: 攻城狮白玉
apiVersion: v1
kind: Pod
metadata:
  name: liveness-tcp-pod
  namespace: baiyu-learn-k8s
spec:
  containers:
  - name: nginx
    image: nginx:1.23.1
    imagePullPolicy: IfNotPresent
    livenessProbe:
      initialDelaySeconds: 5
      periodSeconds: 3
      timeoutSeconds: 1
      tcpSocket:
        port: 80

而下面的资源清单,检测的是8001端口,而nginx默认监听这个端口,因此是处于一直重启的阶段。

# liveness-tcp-failed.yaml
# author: 攻城狮白玉
apiVersion: v1
kind: Pod
metadata:
  name: liveness-tcp-failed-pod
  namespace: baiyu-learn-k8s
spec:
  containers:
  - name: nginx
    image: nginx:1.23.1
    imagePullPolicy: IfNotPresent
    livenessProbe:
      initialDelaySeconds: 5
      periodSeconds: 3
      timeoutSeconds: 1
      tcpSocket:
        port: 8001

如下图所示,两个Pod,一个一直运行,另外一个因为tcp检测不到的缘故,一直重启。

启动、退出事件

k8s在容器启动之后如果要做点配置之类的 ,可以使用postStart

k8s在容器结束前立即发送 preStop 事件

# liveness-tcp-failed.yaml
# author: 攻城狮白玉
apiVersion: v1
kind: Pod
metadata:
  name: start-stop-demo
  namespace: baiyu-learn-k8s
spec:
  containers:
  - name: lifecycle-demo-container
    image: nginx:1.23.1
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh","-c","echo 这是容器启动前执行的 > /usr/share/message"]
      preStop:
        exec:
          command: ["/bin/sh","-c","echo 这是容器停止前执行的 > /usr/share/message"]

总结

至此,通过两篇文章的时间,大体向各位同学介绍了K8s容器的全生命周期。通过本文的学习,我们进一步理解了容器生命周期的内容。并通过实验加深了对于两个探针,以及启动停止事件的理解。接下来的文章,我会开始介绍k8s中的控制器和service。

写在后面

如果觉得有用的话,麻烦一键三连支持一下攻城狮白玉,并把本文分享给更多的小伙伴。你的简单支持,我的无限创作动力。

以上是关于k8s六Pod生命周期的主要内容,如果未能解决你的问题,请参考以下文章

k8s的Pod状态和生命周期管理

再战 k8s:Pod 生命周期与重启策略

Kubernetes(k8s)之Pod生命周期

K8S系列Pod详解

k8s五Pod生命周期

k8s五Pod生命周期