上一节的例子中,我们用Init容器去检测service是否能被成功解析,这似乎不是一个好主意。因为Init容器能成功检测并不代表后面的业务容器也能,所以最好的情况就是有专门的模块不停去检测,这个模块就是我们这一节要学习到的探针。
我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。
探针
探针(Probe)是由kubelet对容器进行的定期诊断。注意,探针的目标是容器而不是pod。
探针可以执行如下三种操作:
-
ExecAction
在容器内执行指定命令,如果命令退出时返回码为0,则认为成功 -
TCPSocketAction
对指定容器的IP+端口进行TCP检测,类似于telnet操作,如果端口为开,则认为成功 -
HTTPGetAction
对指定的容器IP地址进行GET请求,如果HTTP响应码大于等于200且小于400,则认为成功
每次探测都会返回如下三种结果之一:
- 容器通过探测
- 容器未通过探测
- 未知,即探测本身失败
然后根据探测方式又可以分为如下两类
- readinessProbe
就绪探针,指示容器是否准备好服务请求。如果失败,该pod将会从所有匹配的service中被移除。如果容器不提供就绪探针,则默认为Success。对应容器的ready状态。
- livenessProbe
存活探针,指示容器是否正在运行。如果失败,则kubelet会杀死容器,并根据restartPolicy决定是否重启容器。如果容器不提供存活探针,则默认为Succes。对应pod的running状态以及restart次数。
探针实例操作
下面分别针对两种探针做一下实例操作
下面所有操作的源码都被托管在github:
https://github.com/Victor2Code/centos-k8s-init/tree/master/test%20yaml/Pod%20Lifecycle%20-%20Probe
readinessProbe操作
通过yaml文件test-readiness-httpget.yaml
来创建一个带就绪探针的pod
apiVersion: v1
kind: Pod
metadata:
name: test-readiness-httpget
namespace: default
labels:
app: myapp
version: v1
spec:
containers:
- name: mynginx
image: nginx
imagePullPolicy: IfNotPresent
readinessProbe:
httpGet:
port: 80
path: /fake_index.html
initialDelaySeconds: 1
periodSeconds: 3
可以看到主容器使用nginx镜像,如果访问pod_ip:80/fake_index.html
的返回码不在200到400之间则认为容器还没有就绪
创建容器,查看状态
[root@k8s-master k8s-test]# kubectl apply -f test-readiness-httpget.yaml
pod/test-readiness-httpget created
[root@k8s-master k8s-test]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
curl-6bf6db5c4f-kljp4 1/1 Running 1 2d2h