k8s 启动探针生存探针&就绪探针

k8s 启动探针&存活探针&就绪探针

因为k8s中采用大量的异步机制、以及多种对象关系设计上的解耦,当应用实例数 增加/删除、或者应用版本发生变化触发滚动升级时,系统并不能保证应用相关的service、ingress配置总是及时能完成刷新。

kubelet 使用启动探针,来检测应用是否已经启动。如果启动就可以进行后续的探测检查。慢容器一定指定启动探针。一直在等待启动 ,启动探针 成功以后就不用了,剩下存活探针和就绪探针持续运行 。

启动探针 startupProbe: 判断容器内的应用程序是否已启动,k8s v1.16加入

//未设置:默认状态为成功
//设置: 禁用所有其他探测,直到它成功为止。如果启动探测失败,kubelet将杀死容器,容器将服从其重启策略

就绪探针 readinessProbe: 保证应用不会不可用的提供给用户

//未设置:默认此容器就绪
//设置: 必须通过检测后,标记为就绪

存活探针 livenessProbe: 确保应用容器的正常存活

//未设置:容器只要有前台进程即存活
//设置,通过手段(tcp.http.exec)探测容器内部服务是否异常

存活,就绪探针的区别

面试时经常被问到,存活探针和就绪探针有什么区别?
存活探针检查失败,会重启容器
就绪探针检查失败,会将Pod移出服务,确保服务中的Pod都是可用的

探针处理程序和结果

探针是由kubelet对容器执行的定期诊断,要执行诊断,kubelet调用由容器实现的Handler,有三种类型的处理程序

  • ExecAction: 在容器内部执行指定命令,如果命令退出时返回码为0,则认为诊断成功
  • TCPSocketAction:对指定端口上的容器的Ip地址进行TCP检查,如果端口打开,则诊断被认为是成功的
  • HTTPGetAction: 对指定的端口和路径上的容器的Ip地址执行Http Get请求,如果响应的状态码大于等于200且小于400,则认为是成功的

每次探测都将获得以下三种结果之一:

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

启动探针

apiVersion: v1
kind: Pod
metadata:
  name: post-test
spec:
  containers:
  - name: post-test
    image: nginx
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "mkdir -p  /app;echo test > /app/test"]
    startupProbe:
      exec:
        command:  ["/bin/sh","-c","cat /app/test"]  ## 返回不是0,那就是探测失败
      initialDelaySeconds: 20 ## 指定的这个秒以后才执行探测
      periodSeconds: 5  ## 每隔几秒来运行这个
      timeoutSeconds: 5  ##探测超时,到了超时时间探测还没返回结果说明失败
      successThreshold: 1 ## 成功阈值,连续几次成才算成功
      failureThreshold: 3 ## 失败阈值,连续几次失败才算真失败

存活探针

livenessProbe: 指定容器是否正在运行,如果存活探测失败,则kubelet则会杀死容器,并且容器将会受到其重启策略的影响,如果容器不提供存活探针,则默认状态为Success

livenessProbe-exec
apiVersion: v1
kind: Pod
metadata:
  name: liveness-exec-pod
  namespace: default
spec:
  containers:
  - name: liveness-exec-container
    image: harbor.hongfu.com/library/busybox:v1
    imagePullPolicy: IfNotPresent
    command: ["/bin/sh","-c","touch /tmp/live ; sleep 60; rm -rf /tmp/live; sleep
3600"]
    livenessProbe:
      exec:
        command: ["test","-e","/tmp/live"]
      initialDelaySeconds: 1
      periodSeconds: 3
livenessProbe-httpget
apiVersion: v1
kind: Pod
metadata:
  name: liveness-httpget-pod
  namespace: default
spec:
  containers:
  - name: liveness-httpget-container
    image: harbor.hongfu.com/library/myapp:v1
    imagePullPolicy: IfNotPresent
    ports:
    - name: http
      containerPort: 80
    livenessProbe:
      httpGet:
        port: 80
        path: /index.html
      initialDelaySeconds: 1
      periodSeconds: 3
      timeoutSeconds: 3
livenessProbe-tcp
apiVersion: v1
kind: Pod
metadata:
  name: probe-tcp
spec:
  containers:
  - name: nginx
    image: harbor.hongfu.com/library/myapp:v1
    livenessProbe:
      initialDelaySeconds: 5
      timeoutSeconds: 1
      tcpSocket:
        port: 80

就绪探针

readinessProbe: 指示容器是否准备好服务请求,如果就绪探测失败,端点控制器将从与pod匹配的所有service的端点中删除该Pod的Ip地址,初始延迟之前的就绪状态为Failure,如果容器不提供就绪探针,则默认状态为Success

apiVersion: v1
kind: Pod
metadata:
  name: readiness-httpget-pod
  namespace: default
  labels:
    app: myapp
spec:
  containers:
  - name: readiness-httpget-container
    image: wangyanglinux/myapp:v1
    imagePullPolicy: IfNotPresent
    readinessProbe:
      httpGet:
        port: 80
        path: /index1.html
      //1秒后开始检测
      initialDelaySeconds: 1
      //后每3秒探测一次
      periodSeconds: 3

启动、退出动作

apiVersion: v1
kind: Pod
metadata:
  name: lifecycle-demo
spec:
  containers:
  - name: lifecycle-demo-container
    image: harbor.hongfu.com/library/myapp:v1
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
      preStop:
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the poststop handler > /usr/share/message"]
posted @ 2022-06-17 17:19  liwenchao1995  阅读(481)  评论(0编辑  收藏  举报