k8s六Pod生命周期
Posted 攻城狮白玉
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s六Pod生命周期相关的知识,希望对你有一定的参考价值。
目录
前言
上一篇文章【k8s】五、Pod生命周期(一),我们介绍了容器的生命周期,以及详细介绍了Init Containers和通过动手实践加深对于Init Containers的理解。限于篇幅原因,在生命周期图里面的start、stop、readiness、liveness都没有详细说。各位同学就通过本文来一起学习Pod生命周期剩下的知识点。
大家一起来温习下面这张Pod生命周期图。
本图描述了在容器环境初始化完成之后,pod从创建到退出,中间这段时间经历的过程;
如果还没有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生命周期的主要内容,如果未能解决你的问题,请参考以下文章