pod的生命周期--探针

目录

容器探针

探测方式

实现一个探针

1. 就绪检测     

httpget的方式

2. 存活检测 

livenessProbe-exec(exec的获取方案)

livenessProbe-httpget(httpget的获取方案)

livenessProbe-tcp(tcp方案)

3. 并行检测

启动、退出动作


容器探针

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

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

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

Ø 成功:容器通过了诊断。

Ø 失败:容器未通过诊断。

Ø 未知:诊断失败,因此不会采取任何行动

探测方式

livenessProbe :指示容器是否正在运行,即会跟随我们整个容器的生命周期。如果存活探测失败,则 kubelet 会杀死容器,并且容器将受到其 重启策略 的影响。如果容器不提供存活探针,则默认状态为 Success。

(livenessProbe会持续循环的检测容器里面的应用程序或者什么资源可不可以用,如果不可用的话,kubelet就会把这个容器杀死,杀死之后,若我们的重启策略为always,整个pod就会重启)

readinessProbe :指示容器是否准备好服务请求。如果就绪探测失败,端点控制器将从与 Pod 匹配的所有 Service 的端点中删除该 Pod 的 IP 地址。初始延迟之前的就绪状态默认为 Failure 。如果容器不提供就绪探针,则默认状态为 Success。readinessPorbe检测成功之后,我们的mainC才会被外部访问,不然就会是failure。

实现一个探针

1. 就绪检测     

httpget的方式

[root@master1 test]# cat readness-httpGet.yaml 
apiVersion: v1
kind: Pod
metadata:       #元素信息
  name: readiness-httpget-pod     #这个pod的名字
  namespace: default
spec:                 #详细信息
  containers:
  - name: readiness-httpget-container     #容器的名字
    image: nginx:alpine
    imagePullPolicy: IfNotPresent     #镜像下载策略
    readinessProbe:             #就绪检测
      httpGet:                   #检测方案,httpget方案
        port: 80                 #检测是80端口
        path: /index1.html        #检测路径,nginx的根目录下有个index1.html文件,有的话检测成功
      initialDelaySeconds: 1      #检测延时,1秒之后检测
      periodSeconds: 3             #3秒以后重新检测
[root@master1 test]# 

结果显示如下:readness-httpGet.yaml 里面的

[root@master1 test]# kubectl get pod 
NAME                    READY   STATUS    RESTARTS   AGE
myapp-pod               1/1     Running   1          13h
readiness-httpget-pod   0/1     Running   0          3m47s
[root@master1 test]# 

查看一下pod的events信息

教程中 nginx:alpine这个镜像在根目录下面没有index1.html 这个文件,因此创建完pod之后,就绪检测没有通过,所以READY那里为零。若要检测成功就去修改一下即可

[root@master1 test]# kubectl exec -it readiness-httpget-pod sh 
/ # cd /usr/share/nginx/html/
/usr/share/nginx/html # ls
50x.html    index.html
/usr/share/nginx/html # echo "11111" > index1.html 
/usr/share/nginx/html # exit
[root@master1 test]# kubectl get pod 
NAME                    READY   STATUS    RESTARTS   AGE
myapp-pod               1/1     Running   1          13h
readiness-httpget-pod   1/1     Running   0          6m15s
[root@master1 test]# 

注意:readness-httpGet.yaml 这个文件的path不是根目录的意思啊,这个是nginx的默认访问目录,我们可以看看nginx的配置文件

2. 存活检测 

livenessProbe-exec(exec的获取方案)

[root@master1 test]# cat live-exec.yaml 
apiVersion: v1
kind: Pod
metadata:         #元素信息
  name: liveness-exec-pod     #这个pod的名字
  namespace: default
spec:                #详细信息
  containers:        #容器
  - name: liveness-exec-container     #容器的名字
    image: busybox
    imagePullPolicy: IfNotPresent        #
    command: ["/bin/sh","-c","touch /tmp/live ; sleep 60; rm -rf /tmp/live; sleep3600"]
    livenessProbe:              #liveness和readyiness绑定在同一个容器下
      exec:
        command: ["test","-e","/tmp/live"]    #检测live文件是否存在
      initialDelaySeconds: 1
      periodSeconds: 3
[root@master1 test]# 

创建结果如下

[root@master1 test]# kubectl apply -f  live-exec.yaml
pod/liveness-exec-pod created
[root@master1 test]# 
[root@master1 test]# kubectl get pod -w
NAME                READY   STATUS    RESTARTS   AGE
liveness-exec-pod   1/1     Running   0          5s

liveness-exec-pod   0/1     Error     0          61s
liveness-exec-pod   1/1     Running   1          63s
^C[root@master1 test]# 

 刚开始create pod的时候是没问题的,但是60s之后就有问题了,因为上面的是 rm -rf /tmp/live,这个文件被删除了,然后我们的存活检测到这个文件没有了,就会重启pod,然后会重新touch。

livenessProbe-httpget(httpget的获取方案)

[root@master1 test]# cat live-httpget.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: liveness-httpget-pod
  namespace: default
spec:
  containers:
  - name: liveness-httpget-container
    image: nginx:alpine
    imagePullPolicy: IfNotPresent
    ports:            #定义了一个ports
    - name: http       #名字叫做http
      containerPort: 80         #端口是80
    livenessProbe:
      httpGet:                   
       port: http               #httpGet的方案是检测我们的80
       path: /index.html         #检测index.html这个文件是否存在
      initialDelaySeconds: 1       #延时1秒之后检测
      periodSeconds: 3              #检测的重复次数是3秒一次
      timeoutSeconds: 10            #超时时间,超过10s就失败了
[root@master1 test]# 

运行一下,可以正常访问到

[root@master1 test]# kubectl get pod  -o wide
NAME                   READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
liveness-httpget-pod   1/1     Running   0          11s   10.244.0.39   master1   <none>           <none>
[root@master1 test]# wget 10.244.0.39
--2021-08-20 11:54:51--  http://10.244.0.39/
正在连接 10.244.0.39:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:612 [text/html]
正在保存至: “index.html”

100%[==============================================================>] 612         --.-K/s 用时 0s      

2021-08-20 11:54:51 (61.2 MB/s) - 已保存 “index.html” [612/612])

[root@master1 test]# 

若我们此时删除index.html文件,liveness到了检测时间,就会重启改pod

[root@master1 test]# kubectl exec -it liveness-httpget-pod -- rm -rf /usr/share/nginx/html/index.html 
[root@master1 test]# kubectl get pod 
NAME                   READY   STATUS    RESTARTS   AGE
liveness-httpget-pod   1/1     Running   0          3m16s
[root@master1 test]# kubectl get pod  -w
NAME                   READY   STATUS    RESTARTS   AGE
liveness-httpget-pod   1/1     Running   0          3m19s
liveness-httpget-pod   1/1     Running   1          3m23s
^C[root@master1 test]# 

livenessProbe-tcp(tcp方案)

[root@master1 test]# cat live-tcp.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: probe-tcp
spec:
  containers:
  - name: nginx
    image: nginx:alpine
    livenessProbe:
      initialDelaySeconds: 5      #延时检测时间
      timeoutSeconds: 1
      tcpSocket:
        port: 8080
      periodSeconds: 3
[root@master1 test]# 

运行结果:

[root@master1 test]# kubectl get pod  -w
NAME        READY   STATUS    RESTARTS   AGE
probe-tcp   1/1     Running   0          3s
probe-tcp   1/1     Running   1          16s
probe-tcp   1/1     Running   2          28s
^C[root@master1 test]# 

分析:pod创建之后,先等5秒,再检测连接8080端口,8080端口无反应,超时时间为1秒,就会退出再重新检测。

3. 并行检测

我们还可以把上面的放在一起检测

[root@master1 test]# cat live-read-httpget.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: liveness-httpget-pod
  namespace: default
spec:
  containers:
  - name: liveness-httpget-container
    image: nginx:alpine
    imagePullPolicy: IfNotPresent
    ports:           
    - name: http       
      containerPort: 80
    readinessProbe:
      httpGet:             
        port: 80    
        path: /index1.html
      initialDelaySeconds: 1
      periodSeconds: 3          
    livenessProbe:
      httpGet:                   
        port: http   
        path: /index.html
      initialDelaySeconds: 1
      periodSeconds: 3   
      timeoutSeconds: 10
[root@master1 test]# 

刚开始创建的状态不是ready

[root@master1 test]# kubectl get pod
NAME                   READY   STATUS    RESTARTS   AGE
liveness-httpget-pod   0/1     Running   0          2s

当我们进入容器之中,创建一个index1.html文件,就处于ready状态

[root@master1 test]# kubectl exec -it liveness-httpget-pod sh 
/ # echo "11111" > /usr/share/nginx/html/index1.html
/ # exit
[root@master1 test]# kubectl get pod
NAME                   READY   STATUS    RESTARTS   AGE
liveness-httpget-pod   1/1     Running   0          62s

上面这个容器在启动得到时候,1秒之后进行我们的就绪检测,检测我们的index1.html文件存在,不存在的话,就3秒之后再检测一下,如果有的话就进行我们的ready状态。

liveness的话,是同时进行检测的,唯一的区别就是,不存活的话就直接重启pod了。

而readinessProbe就绪检测只是改变状态是不是ready。

启动、退出动作

[root@master1 test]# cat start-stop.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: lifecycle-demo
spec:
  containers:
  - name: lifecycle-demo-container
    image: nginx:alpine
    lifecycle:
     postStart:      #启动的时候运行的一条命令,运行的命令就是下面echo
      exec:
       command: ["/bin/sh", "-c", "echo Hello from the postStart handler >/usr/share/message"]
     preStop:        #容器退出时执行的命令
      exec:
       command: ["/bin/sh", "-c", "echo Hello from the poststop handler >/usr/share/message"]
[root@master1 test]# 

运行结果如下:

[root@master1 test]# kubectl get pod  
NAME             READY   STATUS    RESTARTS   AGE
lifecycle-demo   1/1     Running   0          3s
[root@master1 test]# 
[root@master1 test]# kubectl exec -it lifecycle-demo -- cat /usr/share/message
Hello from the postStart handler
[root@master1 test]# 

这个的作用可以应用于我们的数据库,当我们的数据要退出的时候,可以让它在退出之前执行一个命令,一般来讲执行一个保存数据的命令,来保证我们的数据不会丢失。

补充一个pod的几种状态,可以参考这篇博文

https://blog.csdn.net/wuli_smbug/article/details/103767136

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值