容器探针

一、了解

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

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

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

  • Success(成功):容器通过了诊断。
  • Failure(失败):容器未通过诊断。
  • Unknown(未知):诊断失败,因此不会采取任何行动。

⭐️ 针对运行中的容器,kubelet 可以选择是否执行以下三种探针,以及如何针对探测结果作出反应:

  • livenessProbe:指示容器是否正在运行。如果存活态探测失败,则 kubelet 会杀死容器, 并且容器将根据其重启策略决定未来。如果容器不提供存活探针, 则默认状态为 Success
  • readinessProbe:指示容器是否准备好为请求提供服务。如果就绪态探测失败, 端点控制器将从与 Pod 匹配的所有服务的端点列表中删除该 Pod 的 IP 地址。 初始延迟之前的就绪态的状态值默认为 Failure。 如果容器不提供就绪态探针,则默认状态为 Success。只有 readiness成功,main C才能被宣布能够对外正常访问。
  • startupProbe: 指示容器中的应用是否已经启动。如果提供了启动探针,则所有其他探针都会被 禁用,直到此探针成功为止。如果启动探测失败,kubelet 将杀死容器,而容器依其 重启策略进行重启。 如果容器没有提供启动探测,则默认状态为 Success

二、探针实列 livenessPobre

1️⃣ 编写 yaml文档,创建 livenessPobre

[root@master ~]# cat pod/liveness-pod.yaml 
apiVersion: v1
kind:  Pod
metadata:
  name: liveness-test
  labels:
    version: v1
spec:
  containers:
 - name: liveness-pod
   image: centos
   imagePullPolicy: IfNotPresent
   command: ['/bin/sh','-c','touch /opt/1; sleep 1; rm -rf /opt/1 sleep3600']
   livenessProbe:
     exec:
       command: ['test','-e','/opt/1']
     timeoutSeconds: 1 ##超时时间
     initialDelaySeconds: 1 ##容器启动后多少秒在启动检测
     periodSeconds: 3 ##探测时间

2️⃣ 创建

 [root@master ~]# kubectl create -f pod/liveness-pod.yaml  pod/liveness-test created

3️⃣ 查看,可以看见重启了好多次达到6次就达到阈值就没有在重启了

 [root@master ~]# kubectl get pod 
NAME            READY   STATUS             RESTARTS   AGE
liveness-test   0/1     CrashLoopBackOff   5          5m23s
[root@master ~]# kubectl get pod
NAME            READY   STATUS             RESTARTS   AGE
liveness-test   0/1     CrashLoopBackOff   6          7m9s

三、readinessPobre

1️⃣ 编写yaml文档

apiVersion: v1
kind: Pod
metadata:
  name: readiness-pod
  labels:
    version: v1
spec:
  containers:
  - name: readiness-test
    image: harbor.tanc.com/library/nginx
    imagePullPolicy: IfNotPresent
    readinessProbe:
      httpGet:
        port: 80
        path: /index1.html
      timeoutSeconds: 2
      periodSeconds: 3
      initialDelaySeconds: 1

2️⃣执行后查看可以看到没有ready但是在运行

[root@master ~]# kubectl get pod
NAME            READY   STATUS    RESTARTS   AGE
readiness-pod   0/1     Running   0          12s

3️⃣ 查看日志

kubectl log readiness-pod
10.244.1.1 - - [18/Aug/2021:11:15:15 +0000] "GET /index1.html HTTP/1.1" 404 153 "-" "kube-probe/1.15" "-"