一、K8S 探针简介
容器内应用的监测机制,根据不同的探针来判断容器应用当前的状态, 并可做出不同应对方式
二、测试配置文件
此处配置的服务为 Nginx 的样例, 其中配置 为 StartupProbe
探针, 另外两种配置举一反三
完整配置文件nginx-po.yaml
如下
三、K8s 探针的3种类型
1. startupProbe
k8s 1.16 版本新增的探针,用于判断应用程序是否已经启动了。
当配置了 startupProbe 后,会先禁用其他探针,直到 startupProbe
成功后,其他探针才会继续。
作用:由于有时候不能准确预估应用一定是多长时间启动成功,因此配置另外两种方式不方便配置初始化时长来检测,而配置了 statupProbe 后,只有在应用启动成功了,才会执行另外两种探针,可以更加方便的结合使用另外两种探针使用。
探测方式1 - HTTP 请求探测
生产环境用的较多的方式,发送 HTTP 请求到容器内的应用程序,如果接口返回的状态码在 200~400 之间,则认为容器健康。
startupProbe:
httpGet:
path: /index.html
port: 80
failureThreshold: 3 # 失败多少次才算真正失败
periodSeconds: 10 # 间隔时间
successThreshold: 1 # 成功次数
timeoutSeconds: 5 # 超时时间
测试步骤
- 正常状态下
1) 修改yaml文件中的startupProbe
配置为以上HTTP的配置参数
2) 根据配置文件创建pod, pod名为 nginx-po
kubectl create -f nginx-po.yaml
3) 查看pod
kubectl get po
4) 查看pod描述
kubectl describe po nginx-po
- 异常状态下
startupProbe:
httpGet:
path: /test.html # 注意将 path修改为不存在的路径
port: 80
1) 修改yaml文件中的startupProbe
配置为以上 HTTP
的配置参数
2) 根据配置文件创建pod, pod名为 nginx-po
kubectl create -f nginx-po.yaml
3) 查看pod
kubectl get po
等待一段时间, 以上我们发现pod并未成功启动
4) 查看pod描述
kubectl describe po nginx-po
探测方式2 - TCPSocket 端口探测
通过 tcp 连接监测容器内端口是否开放,如果开放则证明该容器健康
startupProbe:
tcpSocket:
port: 80
failureThreshold: 3 # 失败多少次才算真正失败
periodSeconds: 10 # 间隔时间
successThreshold: 1 # 成功次数
timeoutSeconds: 5 # 超时时间
测试步骤
- 正常状态下
1) 修改yaml文件中的startupProbe
配置为以上 TCPSocket
的配置参数
2) 根据配置文件创建pod, pod名为 nginx-po
kubectl create -f nginx-po.yaml
3) 查看pod
kubectl get po
4) 查看pod描述
kubectl describe po nginx-po
- 异常状态下
startupProbe:
tcpSocket:
port: 8899 # 注意将 port 修改为其他不用的端口
1) 修改yaml文件中的startupProbe
配置为以上 HTTP
的配置参数
2) 根据配置文件创建pod, pod名为 nginx-po
kubectl create -f nginx-po.yaml
3) 查看pod
kubectl get po
等待一段时间, 以上我们发现 pod 并未成功启动
4) 查看pod描述
kubectl describe po nginx-po
探测方式3 - ExecAction 命令探测
在容器内部执行一个命令,如果返回值为 0,则任务容器是健康的。
startupProbe:
exec:
# 以下为需要执行的命令, 一组命令其中空格以 `- +命令`换行 分割, 如下列完整命令为: sh -c echo 'success' > /init.txt;
command:
- sh
- -c
- "echo 'success' > /init.txt; " # 该命令含义为: 将`success` 文字内容写入 /init.txt 文件中
failureThreshold: 3 # 失败多少次才算真正失败
periodSeconds: 10 # 间隔时间
successThreshold: 1 # 成功次数
timeoutSeconds: 5 # 超时时间
测试步骤
- 正常状态下
1) 修改yaml文件中的startupProbe
配置为以上 exec
的配置参数
2) 根据配置文件创建pod, pod名为 nginx-po
kubectl create -f nginx-po.yaml
3) 查看pod
kubectl get po
4) 查看pod描述
kubectl describe po nginx-po
5) 验证命令是否执行成功, 使用exec -it nginx-po bash
进入容器查看/init.txt
文件是否存在
[root@k8s-master pods]# exec -it nginx-po bash
-bash: exec: -i: invalid option
exec: usage: exec [-cl] [-a name] [command [arguments ...]] [redirection ...]
[root@k8s-master pods]# kubectl exec -it nginx-po bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@nginx-po:/usr/share/nginx/html# cat /init.txt
success
root@nginx-po:/usr/share/nginx/html#
综上, 命令执行成功, pod启动成功
- 异常状态下
startupProbe:
exec:
command:
- sh
- -c
- "sleep 6; echo 'success' > /init.txt; " # *注意* : 这里增加了 `sleep 5;` 睡眠6秒模拟超时大于了配置的5秒
failureThreshold: 3 # 失败多少次才算真正失败
periodSeconds: 10 # 间隔时间
successThreshold: 1 # 成功次数
timeoutSeconds: 5 # 超时时间
1) 修改yaml文件中的startupProbe
配置为以上 命令行
的配置参数
2) 根据配置文件创建pod, pod名为 nginx-po
kubectl create -f nginx-po.yaml
3) 查看pod
kubectl get po
我们多等待一段时间, 以上我们发现 pod 并未成功启动, 且重试了多次
4) 查看pod描述
kubectl describe po nginx-po
2. LivenessProbe
用于探测容器中的应用是否运行,如果探测失败,kubelet 会根据配置的重启策略进行重启,若没有配置,默认就认为容器启动成功,不会执行重启策略。
配置与用法以及测试步骤 跟以上StartupProbe
相似, 不同之处是会配置的重启策略进行重启
livenessProbe:
failureThreshold: 5
# 可以配置各三种探测方式的任意一种
httpGet:
path: /health
port: 8080
scheme: HTTP
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
3. ReadinessProbe
用于探测容器内的程序是否健康,它的返回值如果返回 success,那么就认为该容器已经完全启动,并且该容器是可以接收外部流量的。
配置与用法以及测试步骤 跟以上StartupProbe
相似, 不同之处是根据启动状态控制外部流量的访问(启动成功外部则可以访问, 否则不允许外部流量访问)
livenessProbe:
failureThreshold: 5
# 可以配置各三种探测方式的任意一种
httpGet:
path: /health
port: 8080
scheme: HTTP
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
四、配置参数
initialDelaySeconds: 60 # 初始化时间
timeoutSeconds: 2 # 超时时间
periodSeconds: 5 # 监测间隔时间
successThreshold: 1 # 检查 1 次成功就表示成功
failureThreshold: 2 # 监测失败 2 次就表示失败