当前位置:   article > 正文

CKA备考实验 | liveness probe_livenessprobe 多条命令

livenessprobe 多条命令

书籍来源:《CKA/CKAD应试指南:从Docker到Kubernetes完全攻略》

一边学习一边整理老师的课程内容及实验笔记,并与大家分享,侵权即删,谢谢支持!

附上汇总贴:CKA备考实验 | 汇总_热爱编程的通信人的博客-CSDN博客


liveness探测到某个pod运行有问题的话,就会通过重启pod来解决问题。所谓的重启,本质上就是把这个pod删除,然后创建出来一个同名的pod。

command探测方式

command的探测方式是,在容器内部执行一条命令,如果这个命令的返回值为零,即命令正确执行了,则认为容器是正常的,如果返回值为非零,则认为容器出现了问题,然后通过重启来解决问题。

本章所涉及的文件全部放在一个probe目录里。

步骤1:创建目录probe并进入此目录。

  1. ##########实操验证##########
  2. [root@vms10 ~]# mkdir probe
  3. [root@vms10 ~]# cd probe/
  4. [root@vms10 probe]#

本章所有的实验均在命名空间nsprobe里操作,创建并切换至命名空间nsprobe。

  1. ##########实操验证##########
  2. [root@vms10 probe]# kubectl create ns nsprobe
  3. namespace/nsprobe created
  4. [root@vms10 probe]# kubens nsprobe
  5. Context "kubernetes-admin@kubernetes" modified.
  6. Active namespace is "nsprobe".
  7. [root@vms10 probe]#

步骤2:按前面讲过的知识,用kubectl run创建pod所需的yaml文件liveness1.yaml,并做适当的修改之后,内容如下。

  1. ##########实操验证##########
  2. [root@vms10 probe]# cat liveness1.yaml
  3. apiVersion: v1
  4. kind: Pod
  5. metadata:
  6. labels:
  7. test: liveness
  8. name: liveness-exec
  9. spec:
  10. containers:
  11. - name: liveness
  12. image: busybox
  13. imagePullPolicy: IfNotPresent
  14. args:
  15. - /bin/sh
  16. - -c
  17. - touch /tmp/healthy ; sleep 30; rm -rf /tmp/healthy ; sleep 1000
  18. livenessProbe:
  19. exec:
  20. command:
  21. - cat
  22. - /tmp/healthy
  23. initialDelaySeconds: 5 #容器启动的5s内不探测
  24. periodSeconds: 5 #每5s探测一次
  25. [root@vms10 probe]#

在pod启动之后会创建/tmp/healthy,30s之后删除它,然后等待1000s。如果不探测的话,则此pod会等待1000s之后,才会终止。

但是这里定义了liveness Probe,探测/tmp/healthy是不是存在,如果存在,则认为这个容器是正常的,如果发现不存在,则认为这个容器出问题了,会通过重启pod来解决问题。

探测这个文件的方式是通过命令cat /tmp/healthy来判断,如果查看成功,则返回值为零(注:不是文件内容为0),认为此pod没问题。如果这个文件不存在,则命令执行失败,返回值为非零,则为容器出问题了。

这里在liveness Probe中写了2个参数。

(1)initialDelaySeconds:在pod的启动多少秒内不探测,因为有的pod启动时间比较久,pod都没启动起来就探测是没有任何意义的。

(2)periodSeconds:指的是探测的间隔,每隔多久去探测一次。

还有如下2个重要参数。

(1)successThreshold:探测失败后,最少连续探测成功多少次才被认定为成功,默认是1,对于liveness必须是1,最小值是1。

(2)failureThreshold:探测失败后kubernetes的重试次数,默认值是3,最小值是1。

上面的例子里是pod启动的5s不探测,然后每隔5s探测一次。

步骤3:创建pod。

  1. ##########实操验证##########
  2. [root@vms10 probe]# kubectl apply -f liveness1.yaml
  3. pod/liveness-exec created
  4. [root@vms10 probe]#

步骤4:查看pod的运行状况。

  1. ##########实操验证##########
  2. [root@vms10 probe]# kubectl get pods
  3. NAME READY STATUS RESTARTS AGE
  4. liveness-exec 1/1 Running 0 17s
  5. [root@vms10 probe]#

在创建好pod之后,探针开始探测是否能查看/tmp/healthy,如果能看到(返回值为0),说明pod里的程序还是正常运行的。

过了30s之后,/tmp/healthy被删除,那么探针再次探测的时候发现/tmp/healthy这个文件不存在了(返回值为非0),认为pod里的程序出了问题(此时pod的状态为running),就要重启pod来解决问题。

  1. ##########实操验证##########
  2. [root@vms10 probe]# kubectl get pods
  3. NAME READY STATUS RESTARTS AGE
  4. liveness-exec 1/1 Running 0 25s
  5. [root@vms10 probe]#

步骤5:检查pod里的/tmp/healthy是否还存在。

  1. ##########实操验证##########
  2. [root@vms10 probe]# kubectl exec liveness-exec -- ls /tmp/
  3. healthy
  4. [root@vms10 probe]#

从结果来看,这个文件现在还存在,因为要等待30s才会执行删除操作。

步骤6:再次检查pod里/tmp/healthy是否还存在。

  1. ##########实操验证##########
  2. [root@vms10 probe]# kubectl get pods
  3. NAME READY STATUS RESTARTS AGE
  4. liveness-exec 1/1 Running 0 30s
  5. [root@vms10 probe]# kubectl exec liveness-exec -- ls /tmp/
  6. [root@vms10 probe]#

可以看到,此时pod里的/tmp/healthy已经不存在了。

大概经过75s之后,pod自动重启,此时pod里又多了这个文件。

  1. ##########实操验证##########
  2. [root@vms10 probe]# kubectl get pods
  3. NAME READY STATUS RESTARTS AGE
  4. liveness-exec 1/1 Running 1 85s
  5. [root@vms10 probe]# kubectl exec liveness-exec -- ls /tmp/
  6. healthy
  7. [root@vms10 probe]#

按照预测,第30s的时候/tmp/healthy就被删除了,然后重试3次(每次间隔5s),大概在第45s的时候就会重启,为什么要到75s呢?原因在于前面提到了关闭pod时有30s的宽限期。

步骤7:删除此pod。

  1. ##########实操验证##########
  2. [root@vms10 probe]# kubectl delete pod liveness-exec
  3. pod "liveness-exec" deleted
  4. [root@vms10 probe]#

读者可以按前面讲过的知识,自行在pod里添加terminationGracePeriodSeconds: 0,可以看到pod会在第45s、46s左右开始重启。

liveness probe httpGet探测方式

httpGet的方式,指的是HTTP协议的数据包能否通过指定的端口访问到指定的文件,如果能访问到,则认为容器是正常的,如果访问不到,则认为pod是不正常的。

步骤1:按前面讲过的知识,用kubectl run创建pod所需的yaml文件liveness2.yaml,做适当的修改之后内容如下。

  1. ##########实操验证##########
  2. [root@vms10 probe]# cat liveness2.yaml
  3. apiVersion: v1
  4. kind: Pod
  5. metadata:
  6. labels:
  7. test: liveness
  8. name: liveness-http
  9. spec:
  10. containers:
  11. - name: liveness
  12. image: nginx
  13. imagePullPolicy: IfNotPresent
  14. livenessProbe:
  15. failureThreshold: 3
  16. httpGet:
  17. path: /index.html
  18. port: 80
  19. scheme: HTTP
  20. initialDelaySeconds: 10
  21. periodSeconds: 10
  22. successThreshold: 1
  23. [root@vms10 probe]#

这里创建一个名字为liveness-http的pod,系统通过httpGet的方式,查看是否能通过端口80访问到/usr/share/nginx/html/index.html,如果能,则认为此pod是正常工作的,如果不能,则认为pod出现了问题,就要重启pod来解决问题(所谓重启,就是删除pod重新创建)。

步骤2:创建此pod。

  1. ##########实操验证##########
  2. [root@vms10 probe]# kubectl apply -f liveness2.yaml
  3. pod/liveness-http created
  4. [root@vms10 probe]#

步骤3:查看pod运行状态。

  1. ##########实操验证##########
  2. [root@vms10 probe]# kubectl get pods
  3. NAME READY STATUS RESTARTS AGE
  4. liveness-http 1/1 Running 0 28s
  5. [root@vms10 probe]#

如果没有意外,pod里的/usr/share/nginx/html/index.html会一直存在,那么liveness-html也会一直正常运行,不会重启。

步骤4:在另外的终端里进入此pod,并删除/usr/share/nginx/index。

  1. ##########实操验证##########
  2. [root@vms10 probe]# kubectl exec -it liveness-http -- bash
  3. root@liveness-http:/# rm -rf /usr/share/nginx/html/index.html
  4. root@liveness-http:/#
  5. root@liveness-http:/# exit
  6. exit
  7. [root@vms10 probe]#

步骤5:切换到第一个终端。

  1. ##########实操验证##########
  2. [root@vms10 ~]# kubectl get pods
  3. NAME READY STATUS RESTARTS AGE
  4. liveness-http 1/1 Running 1 97s
  5. [root@vms10 ~]#

因为探测不到/usr/share/nginx/html/index.html,所以通过重启pod来解决问题,这里的AGE是50s,它取决于删除index.html的时间。

步骤6:再次查看此pod里/usr/share/nginx/html/里的内容。

  1. ##########实操验证##########
  2. [root@vms10 probe]# kubectl exec -it liveness-http -- ls /usr/share/nginx/html
  3. 50x.html index.html
  4. [root@vms10 probe]#

重启之后也恢复了index.html。

步骤7:删除此pod。

  1. ##########实操验证##########
  2. [root@vms10 probe]# kubectl delete pod liveness-http
  3. pod "liveness-http" deleted
  4. [root@vms10 probe]#

liveness probe tcpSocket探测方式

tcpSocket的探测方式是指,能否和指定的端口建立tcp三次握手,如果能,则探测通过,认为pod没问题,否则认为pod有问题,这里不会探测某个文件是否存在。下面的例子里,我们把探测的端口设置为808。

步骤1:按前面讲过的知识,用kubectl run创建pod所需的yaml文件liveness3.yaml,做适当的修改之后内容如下。

  1. ##########实操验证##########
  2. [root@vms10 probe]# cat liveness3.yaml
  3. apiVersion: v1
  4. kind: Pod
  5. metadata:
  6. labels:
  7. test: liveness
  8. name: liveness-tcp
  9. spec:
  10. containers:
  11. - name: liveness
  12. image: nginx
  13. imagePullPolicy: IfNotPresent
  14. livenessProbe:
  15. failureThreshold: 3
  16. tcpSocket:
  17. port: 808
  18. initialDelaySeconds: 5
  19. periodSeconds: 5
  20. [root@vms10 probe]#

nginx运行的端口为80,但是我们探测的却是808端口,这自然是要探测失败的。从第5s开始探测,探测会失败,然后每隔5s探测1次,如果连续探测3次都失败(大概在第15s)就更开始重启pod。

步骤2:创建此pod。

  1. ##########实操验证##########
  2. [root@vms10 probe]# kubectl apply -f liveness3.yaml
  3. pod/liveness-tcp created
  4. [root@vms10 probe]#

步骤3:检查pod的运行状态。

  1. ##########实操验证##########
  2. [root@vms10 probe]# kubectl get pods
  3. NAME READY STATUS RESTARTS AGE
  4. liveness-tcp 1/1 Running 0 17s
  5. [root@vms10 probe]#

步骤4:再次检查pod的运行状态。

  1. ##########实操验证##########
  2. [root@vms10 probe]# kubectl get pods
  3. NAME READY STATUS RESTARTS AGE
  4. liveness-tcp 1/1 Running 1 30s
  5. [root@vms10 probe]#

从这里可以看到,大概在第16s的时候已经开始重启了,第7s的时候已经重启完成。

步骤5:删除此pod。

  1. ##########实操验证##########
  2. [root@vms10 probe]# kubectl delete pod liveness-tcp
  3. pod "liveness-tcp" deleted
  4. [root@vms10 probe]#
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/247405
推荐阅读
相关标签
  

闽ICP备14008679号