kubernetes-pod启动流程、探针类型、探测机制、参数解释、探针配置示例

1,671 阅读3分钟

背景

容器式运行的应用类似于“黑盒”,默认不会配置探针时 所以kublet只会监视pod的存活状态, 但是无法检查是否处于正常的服务

  • 对于pod不处理请求的情况无法检查 不能执行一些高级的检查,
  • 例如资源耗尽导致服务无法接受更多的请求

为了便于k8s对其进行监测,云原生应用应该输出用于监视自身的API

  • 包括健康状态、指标、分布式跟踪和日志等
  • 最基本要提供用于健康状态监测的API

应用监控

参考time.geekbang.org/column/arti…

image.png

在pod之上 添加一个探针, kubelet通过探针去检查应用 将检查结果传送给apiserver

pod的启动流程 & pod状态转换

image.png

流程

  • schduler调度环节 先绑定节点
  • kubelet接管
    • 准备CNI CSI CRI
    • 下载镜像
    • 启动pod中的所有container
    • 功能探测
      • 启动探针 检查完成后退出
      • 存活探针 长期运行 类似loop
        • 监测pod是否健康
      • 就绪探针

Pod支持的监测类型(健康探针)

startup Probe

启动探针,用来检查应用是否已经启动成功

  • 适合那些有大量初始化工作要做,启动很慢的应用

liveness Probe

存活探针,用来检查应用是否正常运行,是否存在死锁、死循环

  • 周期性的检查 类似守护进程会一直尝试检查
  • 如果探测失败 例如slepp 5,10,15 直到第三次检查还是失败 就会退出

readiness Probe

就绪探针,用来检查应用是否可以接收流量,是否能够对外提供服务。

默认 不配置的话kublet会粗略的监听pod 只关心pod是否running

!!! 注意 生产环境必须配置livereadline探针 防止pod启动时立刻被service监听到 立马分配流量, pod中的应用可能还没有启动完毕 就接收到了流量

监测机制(适用于每一种探针)

  • Exec Action:执行一个 Linux 命令看状态码,根据指定命令的结果状态码判定,
  • TcpSocket Action:使用TCP协议尝试连接容器的指定端口,根据相应TCP套接字连接建立状态判定
  • HTTPGet Action:连接端口并发送 HTTP GET 请求, 根据指定https/http服务URL的响应结果判定

配置参数

参数解释
initialDelaySeconds等容器启动一段时间后 再进行检查
periodSeconds执行探测动作的时间间隔,默认是 10 秒探测一次
timeoutSeconds探测动作的超时时间,如果超时就认为探测失败,默认是 1 秒。successThreshold: 连续几次探测成功才认为是正常,对于 startupProbe 和 livenessProbe 来说它只能是 1
failureThreshold连续探测失败几次才认为是真正发生了异常,默认是 3 次。

探针的配置示例

同时定义了三种探针

  • startup使用Exec Action
  • liveness和readiness使用HTTPGet Action

测试效果

  • liveness
    • URL "/livez" 支持以POST方法为livez参数设定不同值,非OK值都以5xx响应码响应;
  • readiness
    • URL "/readyz" 支持以POST方法为readyz参数设定不同值,非OK值都以5xx响应码响应;
apiVersion: v1
kind: Pod
metadata:
  name: pod-probe-demo
  namespace: default
spec:
  containers:
    - name: demo
  image: ikubernetes/demoapp:v1.0
  imagePullPolicy: IfNotPresent
  startupProbe:
    exec:
      command: [ '/bin/sh','-c','test','"$(curl -s 127.0.0.1/livez)"=="OK"' ]
    initialDelaySeconds: 0
    failureThreshold: 3
    periodSeconds: 2
  livenessProbe:
    httpGet:
      path: '/livez'
      port: 80
      scheme: HTTP
    initialDelaySeconds: 3
    timeoutSeconds: 2
  readinessProbe:
    httpGet:
      path: '/readyz'
      port: 80
      scheme: HTTP
    initialDelaySeconds: 15
    timeoutSeconds: 2
  restartPolicy: Always

测试

临时人为设置相应码

curl -XPOST -d 'livez=FAILD' $ip/livez
curl -I $ip/livez

image.png