Kubernetes探针

TOC

K8S探针是什么?

探针就是Kubernetes对于应用服务的检测,主要由kubelet对容器执行的定期诊断,来判断应用是否处于存活状态,服务是否可用。
K8S探针一共有三种:livenessProbereadinessProbestartupProbe。探测的方式也有三种:exechttpGettcpSocket,探测方式可以运用在所有探针中,但是一个探针中只能有一种探测方式。

探针工作内容:
和微服务的心跳检测类似,每隔一段时间,检测这个容器是否还正常工作,检测状态分为三种,每次检测,都会得到其中一种状态,k8s会根据检测到的不同状态,对容器进行不同的处理。

  • 成功:容器通过了诊断。
  • 失败:容器未通过诊断。
  • 未知:诊断失败,因此不会采取任何行动。

探针类型

livenessProbe

存活性探针,判断容器是否正在运行。

探测策略

  • 如果探测失败,则kubelet会杀死容器,并且容器将根据restartPolicy来设置Pod状态。
  • 如果容器不提供存活探针,则默认状态为Success

容器重启策略

容器的容器策略由资源清单中的restartPolicy字段来配置进行控制。
restartPolicy字段可设置的值:AlwaysOnFailureNerver

  • Always:表示一旦不管以何种方式终止运行,kubelet都将重启
  • OnFailure:表示只有Pod以非0退出码退出才重启
  • Nerver:表示不再重启该Pod

失败的容器由kubelet以五分钟为上限的指数退避延迟(10秒,20秒,40秒…)重新启动,并在成功执行十分钟后重置。

readinessProbe

就绪性探针,用于判断容器是否准备好接受请求的准备。
探测策略:

  • 如果探测失败,端点控制器将从与Pod匹配的所有service endpoints中剔除删除该Pod的IP地址。
  • 初始延迟之前的就绪状态默认为Failure
  • 如果容器不提供就绪探针,则默认状态为Success

温馨提示:一旦就绪探针不通过检测,可能服务状态处于running状态,但是READY却是0/1的情况。

startupProbe

启动探针,检测容器中的应用是否已经启动。
探测策略:

  • 主要针对于不能确定具体启动时间的应用。如果匹配了startupProbe探测,则在startupProbe状态为Success之前,其他所有探针都处于无效状态,直到它成功后其他探针才起作用。如果startupProbe失败,kubelet将杀死容器,容器将根据restartPolicy来重启。
  • 如果容器不提供启动探针,则默认状态为Success

探针配置字段

每种探针下面都可以加上以下字段来设置探针的策略。
可配置字段:

  • initialDelaySeconds:指定的这个秒以后才执行探测
  • timeoutSeconds:探测超时,到了超时时间探测还没返回结果说明失败
  • successThreshold:成功阈值,连续几次成才算成功
  • failureThreshold:失败阈值,连续几次失败才算真失败
  • periodSeconds:每隔几秒来运行这个

探针使用规则

以上的三种探针可以同时存在,一般情况下都是同时一起使用三种探针。
同时存在的规则顺序:
规则顺序是startupProbe会最先启动,并且启动探针只检测一次,剩下的两种只要你的pod存在就会一直去检测,然后在readinessProbe检测成功之前,Pod的running状态是不会变成ready状态。

补充说明:如果容器不提供任何探针的情况下,则默认状态都为Success。

探针的探测机制

exec

通过在容器内执行指定命令,来判断命令退出时返回的状态码,如果为 0 表示正常。
【示例】

spec:
  ......
  template:
    ......
    spec:
      containers:
	  - name: nginx
        startupProbe:
          ......
          #exec方式
          exec:
            command: ["/bin/sh","-c","curl http://localhost:80"]

httpGet

通过对容器的 IP 地址、端口和 URL 路径来发送 GET 请求;如果响应的状态码在 200 ~ 399 间,表示正常。
【示例】

spec:
  ......
  template:
    ......
    spec:
      containers:
	  - name: nginx
		startupProbe:
		  ......
		  #httpGet方式
		  httpGet:
			port: 80
			path: /

tcpSocket

通过对容器的 IP 地址和指定端口,进行 TCP 检查,如果端口打开,表示正常。
【示例】

spec:
  ......
  template:
    ......
    spec:
      containers:
      - name: nginx
        startupProbe:
          ......
          #tcpSocket方式
          tcpSocket:
            port: 80

探针的配置示例

资源清单编写如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  minReadySeconds: 5
  strategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.23.1
        ports:
        - containerPort: 80
        #启动探针
        startupProbe:
          initialDelaySeconds: 20
          timeoutSeconds: 5
          successThreshold: 1
          failureThreshold: 10
          periodSeconds: 10
          #exec方式
          exec:
            command: ["/bin/sh","-c","curl http://localhost:80"]
        #就绪探针
        readinessProbe:
          initialDelaySeconds: 20
          timeoutSeconds: 5
          successThreshold: 1
          failureThreshold: 10
          periodSeconds: 10
          #httpGet方式
          httpGet:
            port: 80
            path: /
        #存活探针
        livenessProbe:
          initialDelaySeconds: 20
          timeoutSeconds: 5
          successThreshold: 1
          failureThreshold: 10
          periodSeconds: 10
          #tcpSocket方式
          tcpSocket:
            port: 80

其中下面配置参数的含义,需要通过以下参数来配置探针的效果

注意:这里分别用了K8S探针的三种不同类型和不同方式来展示,可通过自行需求配置