赞
踩
书籍来源:《CKA/CKAD应试指南:从Docker到Kubernetes完全攻略》
一边学习一边整理老师的课程内容及实验笔记,并与大家分享,侵权即删,谢谢支持!
附上汇总贴:CKA备考实验 | 汇总_热爱编程的通信人的博客-CSDN博客
liveness探测到某个pod运行有问题的话,就会通过重启pod来解决问题。所谓的重启,本质上就是把这个pod删除,然后创建出来一个同名的pod。
command的探测方式是,在容器内部执行一条命令,如果这个命令的返回值为零,即命令正确执行了,则认为容器是正常的,如果返回值为非零,则认为容器出现了问题,然后通过重启来解决问题。
本章所涉及的文件全部放在一个probe目录里。
步骤1:创建目录probe并进入此目录。
- ##########实操验证##########
- [root@vms10 ~]# mkdir probe
- [root@vms10 ~]# cd probe/
- [root@vms10 probe]#
本章所有的实验均在命名空间nsprobe里操作,创建并切换至命名空间nsprobe。
- ##########实操验证##########
- [root@vms10 probe]# kubectl create ns nsprobe
- namespace/nsprobe created
- [root@vms10 probe]# kubens nsprobe
- Context "kubernetes-admin@kubernetes" modified.
- Active namespace is "nsprobe".
- [root@vms10 probe]#
步骤2:按前面讲过的知识,用kubectl run创建pod所需的yaml文件liveness1.yaml,并做适当的修改之后,内容如下。
- ##########实操验证##########
- [root@vms10 probe]# cat liveness1.yaml
- apiVersion: v1
- kind: Pod
- metadata:
- labels:
- test: liveness
- name: liveness-exec
- spec:
- containers:
- - name: liveness
- image: busybox
- imagePullPolicy: IfNotPresent
- args:
- - /bin/sh
- - -c
- - touch /tmp/healthy ; sleep 30; rm -rf /tmp/healthy ; sleep 1000
- livenessProbe:
- exec:
- command:
- - cat
- - /tmp/healthy
- initialDelaySeconds: 5 #容器启动的5s内不探测
- periodSeconds: 5 #每5s探测一次
- [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。
- ##########实操验证##########
- [root@vms10 probe]# kubectl apply -f liveness1.yaml
- pod/liveness-exec created
- [root@vms10 probe]#
步骤4:查看pod的运行状况。
- ##########实操验证##########
- [root@vms10 probe]# kubectl get pods
- NAME READY STATUS RESTARTS AGE
- liveness-exec 1/1 Running 0 17s
- [root@vms10 probe]#
在创建好pod之后,探针开始探测是否能查看/tmp/healthy,如果能看到(返回值为0),说明pod里的程序还是正常运行的。
过了30s之后,/tmp/healthy被删除,那么探针再次探测的时候发现/tmp/healthy这个文件不存在了(返回值为非0),认为pod里的程序出了问题(此时pod的状态为running),就要重启pod来解决问题。
- ##########实操验证##########
- [root@vms10 probe]# kubectl get pods
- NAME READY STATUS RESTARTS AGE
- liveness-exec 1/1 Running 0 25s
- [root@vms10 probe]#
步骤5:检查pod里的/tmp/healthy是否还存在。
- ##########实操验证##########
- [root@vms10 probe]# kubectl exec liveness-exec -- ls /tmp/
- healthy
- [root@vms10 probe]#
从结果来看,这个文件现在还存在,因为要等待30s才会执行删除操作。
步骤6:再次检查pod里/tmp/healthy是否还存在。
- ##########实操验证##########
- [root@vms10 probe]# kubectl get pods
- NAME READY STATUS RESTARTS AGE
- liveness-exec 1/1 Running 0 30s
- [root@vms10 probe]# kubectl exec liveness-exec -- ls /tmp/
- [root@vms10 probe]#
可以看到,此时pod里的/tmp/healthy已经不存在了。
大概经过75s之后,pod自动重启,此时pod里又多了这个文件。
- ##########实操验证##########
- [root@vms10 probe]# kubectl get pods
- NAME READY STATUS RESTARTS AGE
- liveness-exec 1/1 Running 1 85s
- [root@vms10 probe]# kubectl exec liveness-exec -- ls /tmp/
- healthy
- [root@vms10 probe]#
按照预测,第30s的时候/tmp/healthy就被删除了,然后重试3次(每次间隔5s),大概在第45s的时候就会重启,为什么要到75s呢?原因在于前面提到了关闭pod时有30s的宽限期。
步骤7:删除此pod。
- ##########实操验证##########
- [root@vms10 probe]# kubectl delete pod liveness-exec
- pod "liveness-exec" deleted
- [root@vms10 probe]#
读者可以按前面讲过的知识,自行在pod里添加terminationGracePeriodSeconds: 0,可以看到pod会在第45s、46s左右开始重启。
httpGet的方式,指的是HTTP协议的数据包能否通过指定的端口访问到指定的文件,如果能访问到,则认为容器是正常的,如果访问不到,则认为pod是不正常的。
步骤1:按前面讲过的知识,用kubectl run创建pod所需的yaml文件liveness2.yaml,做适当的修改之后内容如下。
- ##########实操验证##########
- [root@vms10 probe]# cat liveness2.yaml
- apiVersion: v1
- kind: Pod
- metadata:
- labels:
- test: liveness
- name: liveness-http
- spec:
- containers:
- - name: liveness
- image: nginx
- imagePullPolicy: IfNotPresent
- livenessProbe:
- failureThreshold: 3
- httpGet:
- path: /index.html
- port: 80
- scheme: HTTP
- initialDelaySeconds: 10
- periodSeconds: 10
- successThreshold: 1
- [root@vms10 probe]#
这里创建一个名字为liveness-http的pod,系统通过httpGet的方式,查看是否能通过端口80访问到/usr/share/nginx/html/index.html,如果能,则认为此pod是正常工作的,如果不能,则认为pod出现了问题,就要重启pod来解决问题(所谓重启,就是删除pod重新创建)。
步骤2:创建此pod。
- ##########实操验证##########
- [root@vms10 probe]# kubectl apply -f liveness2.yaml
- pod/liveness-http created
- [root@vms10 probe]#
步骤3:查看pod运行状态。
- ##########实操验证##########
- [root@vms10 probe]# kubectl get pods
- NAME READY STATUS RESTARTS AGE
- liveness-http 1/1 Running 0 28s
- [root@vms10 probe]#
如果没有意外,pod里的/usr/share/nginx/html/index.html会一直存在,那么liveness-html也会一直正常运行,不会重启。
步骤4:在另外的终端里进入此pod,并删除/usr/share/nginx/index。
- ##########实操验证##########
- [root@vms10 probe]# kubectl exec -it liveness-http -- bash
- root@liveness-http:/# rm -rf /usr/share/nginx/html/index.html
- root@liveness-http:/#
- root@liveness-http:/# exit
- exit
- [root@vms10 probe]#
步骤5:切换到第一个终端。
- ##########实操验证##########
- [root@vms10 ~]# kubectl get pods
- NAME READY STATUS RESTARTS AGE
- liveness-http 1/1 Running 1 97s
- [root@vms10 ~]#
因为探测不到/usr/share/nginx/html/index.html,所以通过重启pod来解决问题,这里的AGE是50s,它取决于删除index.html的时间。
步骤6:再次查看此pod里/usr/share/nginx/html/里的内容。
- ##########实操验证##########
- [root@vms10 probe]# kubectl exec -it liveness-http -- ls /usr/share/nginx/html
- 50x.html index.html
- [root@vms10 probe]#
重启之后也恢复了index.html。
步骤7:删除此pod。
- ##########实操验证##########
- [root@vms10 probe]# kubectl delete pod liveness-http
- pod "liveness-http" deleted
- [root@vms10 probe]#
tcpSocket的探测方式是指,能否和指定的端口建立tcp三次握手,如果能,则探测通过,认为pod没问题,否则认为pod有问题,这里不会探测某个文件是否存在。下面的例子里,我们把探测的端口设置为808。
步骤1:按前面讲过的知识,用kubectl run创建pod所需的yaml文件liveness3.yaml,做适当的修改之后内容如下。
- ##########实操验证##########
- [root@vms10 probe]# cat liveness3.yaml
- apiVersion: v1
- kind: Pod
- metadata:
- labels:
- test: liveness
- name: liveness-tcp
- spec:
- containers:
- - name: liveness
- image: nginx
- imagePullPolicy: IfNotPresent
- livenessProbe:
- failureThreshold: 3
- tcpSocket:
- port: 808
- initialDelaySeconds: 5
- periodSeconds: 5
- [root@vms10 probe]#
nginx运行的端口为80,但是我们探测的却是808端口,这自然是要探测失败的。从第5s开始探测,探测会失败,然后每隔5s探测1次,如果连续探测3次都失败(大概在第15s)就更开始重启pod。
步骤2:创建此pod。
- ##########实操验证##########
- [root@vms10 probe]# kubectl apply -f liveness3.yaml
- pod/liveness-tcp created
- [root@vms10 probe]#
步骤3:检查pod的运行状态。
- ##########实操验证##########
- [root@vms10 probe]# kubectl get pods
- NAME READY STATUS RESTARTS AGE
- liveness-tcp 1/1 Running 0 17s
- [root@vms10 probe]#
步骤4:再次检查pod的运行状态。
- ##########实操验证##########
- [root@vms10 probe]# kubectl get pods
- NAME READY STATUS RESTARTS AGE
- liveness-tcp 1/1 Running 1 30s
- [root@vms10 probe]#
从这里可以看到,大概在第16s的时候已经开始重启了,第7s的时候已经重启完成。
步骤5:删除此pod。
- ##########实操验证##########
- [root@vms10 probe]# kubectl delete pod liveness-tcp
- pod "liveness-tcp" deleted
- [root@vms10 probe]#
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。