一、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 次就表示失败
最后修改:2023 年 07 月 20 日
如果觉得我的文章对你有用,请点个赞吧~