您现在的位置是:首页 >技术杂谈 >k8s就绪探测readinessProbe和存活探测livenessProbe网站首页技术杂谈

k8s就绪探测readinessProbe和存活探测livenessProbe

l386913 2023-05-12 20:08:53
简介k8s应用更新虽然是滚动升级方式,但是很多后端程序启动都比较久,容器起来了,但是服务未起来,而k8s只要容器起来了就会移除掉旧的容器,这种情况就会导致在更新发版的时候应用访问失败。failureThreshold: 探测失败的重试次数,重试一定次数后将认为失败,在 readiness 探针中,Pod会被标记为未就绪,默认为 3,最小值为 1。加了就绪检测后,执行kubectl apply更新时候,新的pod启动一会,就绪检测没问题后才会把旧的pod移除掉。3、readinessProbe使用场景。

1、livenessProbe简介
存活指针,判断Pod(中的应用容器)是否健康,可以理解为健康检查。我们使用livenessProbe来定期的去探测,如果探测成功,则Pod状态可以判定为Running;如果探测失败,可kubectl会根据Pod的重启策略来重启容器。

如果未给Pod设置livenessProbe,则默认探针永远返回Success。

当我们执行kubectl get pods命令,输出信息中STATUS一列我们可以看到Pod是否处于Running状态。

2、readinessProbe简介
就绪指针,就绪的意思是已经准备好了,Pod的就绪我们可以理解为这个Pod可以接受请求和访问。我们使用readinessProbe来定期的去探测,如果探测成功,则Pod 的Ready状态判定为True;如果探测失败,Pod的Ready状态判定为False。

与livenessProbe不同的是,kubelet不会对readinessProbe的探测情况有重启操作。

当我们执行kubectl get pods命令,输出信息中READY一列我们可以看到Pod的READY状态是否为True。

3、readinessProbe使用场景
k8s应用更新虽然是滚动升级方式,但是很多后端程序启动都比较久,容器起来了,但是服务未起来,而k8s只要容器起来了就会移除掉旧的容器,这种情况就会导致在更新发版的时候应用访问失败。这时候就需要配置readinessProbe就绪检测,保证新的pod已经能正常使用了才会移除掉旧的pod。

4、livenessProbe使用场景
有些后端应用在出现某些异常的时候会有假死的情况,这种情况容器依然是running状态,但是应用是无法访问的,所以需要加入存活探测livenessProbe来避免这种情况的发生。

5、使用方法

          #readinessProbe就绪探测,用于判断容器是否启动完成
          readinessProbe:
            tcpSocket:
              port: 8080
            initialDelaySeconds: 5
            periodSeconds: 10
          #存活探测,用于判断容器是否存活(running状态)
          livenessProbe:
            tcpSocket:
              port: 8080
            initialDelaySeconds: 15
            periodSeconds: 20 

6、使用例子
在加入就绪检测前,刚执行kubectl apply 更新就可以看到容器运行起来了,已经在移除旧的pod了
加了就绪检测后,执行kubectl apply更新时候,新的pod启动一会,就绪检测没问题后才会把旧的pod移除掉
在nacos服务列表里也可以看到,在更新应用时,健康实例数是不变的。

apiVersion: apps/v1
kind: Deployment  
metadata:  
  name: @APP_NAME@
  labels:  
    app: @APP_NAME@
spec:  
  replicas: @REPLICAS@
  revisionHistoryLimit: 10
  selector:  
    matchLabels:  
      app: @APP_NAME@
  template:  
    metadata:  
      labels:  
        app: @APP_NAME@
        armsPilotAutoEnable: "on"
        armsPilotCreateAppName: @APP_NAME@
        one-agent.jdk.version: "OpenJDK11"
    spec:
      imagePullSecrets:  
      - name: osale-secret    
      containers:  
      - name: @APP_NAME@
        image: ${IMAGE}
        ports:  
        - containerPort: @targetPort@
          protocol: TCP  
        imagePullPolicy: IfNotPresent
        readinessProbe:
          tcpSocket:
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
        livenessProbe:
          tcpSocket:
            port: 8080
          initialDelaySeconds: 15
          periodSeconds: 20
        volumeMounts:
          - name: logs
            mountPath: /gemdale/logs
          - name: data
            mountPath: /gemdata/share/
      volumes:
        - name: logs
          hostPath:
            type: DirectoryOrCreate 
            path: /data/logs/test/@APP_NAME@ 
        - name: data
          hostPath:
            type: DirectoryOrCreate 
            path: /gemdata/share/ 
      ###############################
 
---  
apiVersion: v1  
kind: Service  
metadata:  
  name: @APP_NAME@
  labels:  
    app: @APP_NAME@
spec:  
  ports:  
    - port: @port@
      targetPort: @targetPort@
      @NodePort@
  selector:  
    app: @APP_NAME@
  type: @PORT_TYPE@  

7.Pod探针相关的属性:

探针(Probe)有许多可选字段,可以用来更加精确的控制Liveness和Readiness两种探针的行为

initialDelaySeconds: Pod启动后首次进行检查的等待时间,单位“秒”。

periodSeconds: 检查的间隔时间,默认为10s,单位“秒”。

timeoutSeconds: 探针执行检测请求后,等待响应的超时时间,默认为1s,单位“秒”。

successThreshold:连续探测几次成功,才认为探测成功,默认为 1,在 Liveness 探针中必须为1,最小值为1。

failureThreshold: 探测失败的重试次数,重试一定次数后将认为失败,在 readiness 探针中,Pod会被标记为未就绪,默认为 3,最小值为 1

两种探针区别:

ReadinessProbe 和 livenessProbe 可以使用相同探测方式,只是对 Pod 的处置方式不同:

readinessProbe 当检测失败后,将 Pod 的 IP:Port 从对应的 EndPoint 列表中删除。

livenessProbe 当检测失败后,将杀死容器并根据 Pod 的重启策略来决定作出对应的措施。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。