Pod三种探针及四种探针方式

一、简介

官网:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
探针(Probe)用于检测 Pod 中容器的健康状态和生命周期管理。探针可以帮助 Kubernetes确保应用程序在运行中的健康状态,并在需要时采取适当的动作(如重启容器、将流量切换到健康的容器等)。Kubernetes对Pod的健康状态可以通过三类探针来检查:LivenessProbe、ReadinessProbe及StartupProbe,其中最主要的探针为 LivenessProbe与ReadinessProbe,kubelet会定期执行这两类探针来诊断容器的健康状况。

二、三种探针

  1. StartupProbe:用于判断容器内应用程序是否已经启动。某些应用会遇到启动比较慢的情况,例如应用程序启动时需要与远程服务器建立网络连接,或者遇到网络访问较慢等情况时,会造成容器启动缓慢, 因为这属于“有且仅有一次”的超长延时,可以通过StartupProbe探针解决该问题。如果配置了startupProbe,就会先禁止其他的探针,直到它成功为止,成功后将不在进行探测。如果探针失败,kubelet则杀死容器,并且按照预先在资源清单中设定的重启策略重启容器。(启动探针)只会在容器启动时进行健康检查,且优先级最高。如果探测成功才会继续执行其他两种方式的探针。启动探针,那么在容器的剩余生命周期中不在执行此探针。
  2. LivenessProbe:用于探测容器是否运行,如果探测失败,kubelet会根据配置的重启策略进行相应的处理。若没有配置该探针,默认就是success。(存活探针,探针失败;按照预先在资源清单中设定的重启策略重启容器)
  3. ReadinessProbe:用于判断容器服务是否可用(Ready状态),达到Ready状态的Pod才可以接收请求。并且程序已经是可以接受流量的状态。对于被Service管理的 Pod,Service与Pod Endpoint的关联关系也将基于Pod是否Ready进行设置。如果在运行过程中Ready状态变为False,则系统自动将其从Service 的后端Endpoint列表中隔离出去,后续再把恢复到Ready状态的Pod加回后端Endpoint列表。这样就能保证客户端在访问Service时不会被转发到服务不可用的Pod实例上。需要注意的是,ReadinessProbe也是定期触发执行的,存在于Pod的整个生命周期中。(就绪探针,探针失败不会重启pod)

三、四种探针方式

● ExecAction:在容器内执行一个命令,如果返回值为0,则认为容器健康。
● TCPSocketAction:通过TCP连接检查容器内的端口是否是通的,如果是通的就认为容器健康。
● HTTPGetAction:通过应用程序暴露的API地址来检查程序是否是正常的,如果状态码为200~399之间,则认为容器健康。
● gRPC探针:v1.24版本以后就可以使用内置gRPC探针,但必须先启用 GRPCContainerProbe 特性门控才能配置依赖于 gRPC 的检查机制。

四、使用案例

---
apiVersion: v1
kind: Pod
metadata: 
  name: nginx 
spec: 			
  containers: 		
  - image: registry.cn-hangzhou.aliyuncs.com/hujiaming/nginx:1.24.0
    name: nginx 
    readinessProbe: 	# 就绪探针,一种探针只能同时使用一种探针方式
        httpGet:          	# URI接口检测方式
          path: /index.html  	# 检查路径  
          port: 80
          scheme: HTTP   	# HTTP或者HTTPS 
        initialDelaySeconds: 15 	# 初始化时间,健康检查延迟执行时间
        timeoutSeconds: 3  	# 超时时间
        periodSeconds: 15 	# 检测间隔
        successThreshold: 1  # 检查成功为1次表示就绪
        failureThreshold: 2  # 检测失败2次,切断流量,用户请求则不转发到该容器
    livenessProbe: 			# 存活探针,一种探针只能同时使用一种探针方式
        tcpSocket:   		# 端口检测方式
          port : 80
        initialDelaySeconds: 15 	# 初始化时间
        timeoutSeconds: 3 			# 超时时间
        periodSeconds: 15 			# 检测间隔
        successThreshold: 1 		# 检查成功为1次表示存活
        failureThreshold: 2 		# 检测失败2次则按照重启策略重启容器
    command: 						# 容器启动命令
    - sh
    - -c
    - sleep 60;nginx -g "daemon off;"
  restartPolicy: Always  
  ---
  apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  imagePullPolicy: IfNotPresent 
  - image: registry.cn-hangzhou.aliyuncs.com/hujiaming/nginx:1.24.0
    name: nginx
    startupProbe: # 存活探针
      tcpSocket:  # 探针方式
        port: 80  # 探针端口
      initialDelaySeconds: 10 #初始化时间,健康检查延迟执行时间(随着程序启动的长久来设定)
      timeoutSeconds: 2    # 超时时间
      periodSeconds: 10    # 检测间隔
      successThreshold: l  # 检查成功为1次表示存活
      failureThreshold: 2  # 检测失败2次表示未存活
    readinessProbe:       # 就绪探针,三种检查方式同时只能使用一种。
      httpGet:            # 接口检测方式
        path: /index.html    # 检查路径
        port: 80          # 检查端口
      initialDelaySeconds: 10  # 初始化时间,健康检查延迟执行时间
      timeoutSeconds: 2     # 超时时间
      periodSeconds: 10     # 检测间隔
      successThreshold: 1  #检查成功为1次表示就绪
      failureThreshold: 2  #检测失败2次表示未就绪
    livenessProbe:        # 存活探针
      tcpSocket:          # 端口检测方式
        port: 80
      initialDelaySeconds: 10    # 初始化时间
      timeoutSeconds: 2        # 超时时间
      periodSeconds: 10        # 检测间隔
      successThreshold: l     # 检查成功为1次表示就绪
      failureThreshold: 2      # 检测失败2次表示未就绪
    command:      # 容器启动执行的命令
    - sh
    - -c
    - sleep 30;nginx -g "daemon off;"
    ports:         # 容器端口
    - containerPort: 80     # 容器端口号
  restartPolicy: Always
  ---
  ---
apiVersion: v1
kind: Pod
metadata:
  name: liveness-grpc
spec:
  containers:
  - name: etcd
    image: registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.15-0
    command: [ "/usr/local/bin/etcd", "--data-dir",  "/var/lib/etcd", "--listen-client-urls", "http://0.0.0.0:2379", "--advertise-client-urls", "http://127.0.0.1:2379", "--log-level", "debug"]
    ports:
    - containerPort: 2379
    livenessProbe:
      grpc:
        port: 2379
      initialDelaySeconds: 10 #初始化时间,健康检查延迟执行时间(随着程序启动的长久来设定)
      timeoutSeconds: 2    # 超时时间
      periodSeconds: 10    # 检测间隔
      successThreshold: 1  # 检查成功为1次表示存活
      failureThreshold: 2  # 检测失败2次表示未存活

$ kubectl create -f  etcd-grpc.yaml

$ kubectl logs -f liveness-grpc
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐