1)Pod三种探针

ExecAction:在容器内执行一个命令,如果返回值为0,则认为容器健康。
TCPSocketAction:通过TCP连接检查容器内的端口是否通的,如果是通的就认为容器健康。
HTTPGetAction:通过应用程序暴露的API地址检查程序是否正常,如果状态码为200~400之间,则认为容器健康。

2) 探针检查参数配置

  1. initialDelaySeconds: 60 # 初始化时间
  2. timeoutSeconds: 2 # 超时时间
  3. periodSeconds: 5 # 检测间隔
  4. successThreshold: 1 # 检查成功为1次表示就绪
  5. failureThreshold: 2 # 检测失败2次表示未就绪

3)k8s中的启动探针startupProbe

  判断容器内的应用程序是否已启动,如果提供了启动探测,则禁用所有其他探测,直到它成功为止。如果启动探测失败,kubelet将杀死容器,容器将服从其重启策略。如果容器没有提供启动探测,则默认状态为成功。

那么在什么时候会用startupProbe呢?
正常情况下,我们会在pod template中配置livenessProbe来探测应用程序是否正常运行,如果异常则会触发restartPolicy重启Pod(因为默认情况下restartPolicy设置的是always)
如下:

livenessProbe:
  httpGet:
    path: /test
    prot: 80
  failureThreshold: 1
  initialDelay:10
  periodSeconds: 10

容器启动10s后每10s检查一次,允许失败的次数是1次。如果失败次数超过1则会触发restartPolicy
但是有时候会存在特殊情况,比如服务A启动时间很慢,需要60s。这个时候如果还是用上面的探针就会进入死循环,因为上面的探针10s后就开始探测,这时候我们服务并没有起来,发现探测失败就会触发restartPolicy。这时候有的朋友可能会想到把initialDelay调成60s不就可以了?但是我们并不能保证这个服务每次起来都是60s,假如新的版本起来要70s,甚至更多的时间,我们就不好控制了。有的朋友可能还会想到把失败次数增加,如果设置了failureThreshold=5,那么就需要5*10s=50s的时间,在现在大家追求快速发现、快速定位、快速响应的时代是不被允许的

在这时候我们把startupProbelivenessProbe结合起来使用就可以很大程度上解决我们的问题。

如下:

livenessProbe:
  httpGet:
    path: /test
    prot: 80
  failureThreshold: 1
  initialDelay:10
  periodSeconds: 10

startupProbe:
  httpGet:
    path: /test
    prot: 80
  failureThreshold: 10
  initialDelay:10
  periodSeconds: 10
 上面的配置是只有`startupProbe`探测成功后再交给`livenessProbe`。我们`startupProbe`配置的是`10*10s`,也就是说只要应用在100s内启动都是OK的,而且应用挂掉了10s就会发现问题

4) LivenessProbe探测

目的: 用于探测容器是否运行,如果探测失败,kubelet辉根据配置的重启策略进行处理,若没有配置该探针,默认为success

LivenessProbe 探针使用示例

4.1)通过exec方式做健康探测

apiVersion: v1
kind: Pod
metadata:
  name: liveness-exec
  labels:
    app: liveness
spec:
  containers:
  - name: liveness
    image: busybox
    args:                       #创建测试探针探测的文件
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
    livenessProbe:
      initialDelaySeconds: 10   #延迟检测时间
      periodSeconds: 5          #检测时间间隔
      exec:
        command:
        - cat
        - /tmp/healthy

4.2) 通过httpGet方式

  • 任何大于或等于200且小于400的代码表示探测成功。
  • 任何其他代码表示失败。

httpGet探测方式有如下可选的控制字段:

  • scheme: 用于连接host的协议,默认为HTTP。
  • host: 要连接的主机名,默认为Pod IP,可以在http request head中设置host头部。
  • port: 容器上要访问端口号或名称。
  • path: http服务器上的访问URI。
  • httpHeaders: 自定义HTTP请求headers,HTTP允许重复headers。
    apiVersion: v1
    kind: Pod
    metadata:
    name: liveness-http
    labels:
      test: liveness
    spec:
    containers:
    - name: liveness
      image: mydlqclub/springboot-helloworld:0.0.1
      livenessProbe:
        initialDelaySeconds: 20   #延迟加载时间
        periodSeconds: 5          #重试时间间隔
        timeoutSeconds: 10        #超时时间设置
        httpGet:
          scheme: HTTP
          port: 8081
          path: /actuator/health
    
    4.3) 通过tcp方式
apiVersion: v1
kind: Pod
metadata:
  name: liveness-tcp
  labels:
    app: liveness
spec:
  containers:
  - name: liveness
    image: nginx
    livenessProbe:
      initialDelaySeconds: 15
      periodSeconds: 20
      tcpSocket:
        port: 80

5)ReadinessProbe探测
目的: 用于判断容器内的程序是否健康,它的返回值如果为success,那么就代表这个容器已经完成启动,当检测失败后,将 Pod 的 IP:Port 从对应的 EndPoint 列表中删除