kubernetes 探针

Kubernetes,可以通过探针配置运行状况检查,以确定每个 Pod 的状态。

默认情况下,Kubernetes 会观察 Pod 生命周期,并在容器从挂起(pending)状态转移到成功(succeeded)状态时,将流量路由到 Pod。Kubelet 会监控崩溃的应用程序,并重新启动 Pod 进行恢复。

Kubernetes 的探针有三种类型:

  • 就绪探针(Readiness Probe):判断容器是否已经就绪

  • 存活探针(Liveness Probe):判断容器内的应用程序是否正常,若不正常,K8s 将会重新重启容器。

  • 启动探针(Startup Probe):判断容器内的应用是否启动完成(在启动探针判断成功前,就绪探针和存活探针将不会执行)

LivenessProbe: 周期性检测, 检测未通过时,kubelet 会根据restartPolicy 的定义来决定是否重启该容器,未定义时只要容器未退出,即为健康;

ReadnessProbe: 周期性检测, 检测未通过时,与该pod关联的service会将该pod从service的后端可用列表中删除,直到此容器就绪后再次加入,未定义时只要容器未终止,即为就绪;

为什么需要容器探针?

容器探针可以确保您的容器在任何时候都处于可预测的状态。

如果没有容器探针,那么容器对于K8S平台而言,就处于一个黑盒状态。下面是没有使用容器探针可能出现的一些case:

  • 容器未启动,负载均衡就把流量转发给容器,导致请求大量异常

  • 容器内服务不可用/发生异常,负载均衡把流量转发给容器,导致请求大量异常

  • 容器已经不正常工作(如容器死锁导致的应用程序停止响应),K8S平台本身无法感知,不能即时低重启容器。

常用命令详解

# 参数
spec:
  containers:
  - name: demo
    image: demo
    livenessProbe:
      exec: <Object>  #命令式探针
		command:   <[]string> #命令
 	  httpGet: <Object> #http get 类型探针
		path:  /
		port: <IntOrString> -required- 
		scheme:   <string> #可用http或https
      tcpSocket: <Object> #tcp socket 类型探针
		host: <string> #可不指定,默认探测当前pod ip
		port: <IntOrString> --required
	  initialDelaySeconds: <integer> #发起初次探针请求后延迟时长表示在容器启动后等待n秒后开始执行首次探测
      periodSeconds: <integer> #请求周期表示每隔n秒进行一次探测。
	  timeoutSeconds: <integer> #超时时长表示探针在n秒内必须完成,否则将视为失败。
      successThreshold: <integer>  #成功阈值表示在连续n次探测成功,即为健康
      failureThreshold: <integer> #失败时长表示在连续n次探测失败后,Kubernetes 将重启容器。

每种状态各支持三种探针:

  • Exec: 直接执行命令,命令成功返回即为成功

  • httpGet: 向指定端口发送请求,如果返回2xx,3xx响应码即为成功

  • tcpSocket 向指定端口发送握手包,探测端口是否打开,正常打开即为成功

例如:

apiVersion: v1
kind: Pod
metadata:
  name: goproxy
  labels:
    app: goproxy
spec:
  containers:
  - name: goproxy
    image: registry.k8s.io/goproxy:0.1
    ports:
    - containerPort: 8080
    readinessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 15
      periodSeconds: 10
    livenessProbe:
      tcpSocket:
		host:10.244.1.5 
        port: 8080
      initialDelaySeconds: 15
      periodSeconds: 20