Kubernetes实践之深入掌握Pod——Pod健康检查和服务可用性检查

Pod健康检查和服务可用性检查

Kubernetes对Pod的健康状态可以通过两类探针来检查:

(1)LivenessProbe探针:用于判断容器是否存活(Running状态),如果LivenessProbe探针探测到容器不健康,则kubelet将杀掉该容器,并根据容器的重启策略做相应的处理。
(2)ReadinessProbe探针:用于判断容器服务是否可用(Ready状态),达到Ready状态的Pod才可以接收请求。对于被Service管理的 Pod,Service与Pod Endpoint的关联关系也将基于Pod是否Ready进行设置。如果在运行过程中Ready状态变为False,则系统自动将其从Service 的后端Endpoint列表中隔离出去,后续再把恢复到Ready状态的Pod加回 后端Endpoint列表。

对于LivenessProbe和ReadinessProbe用法都一样,拥有相同的参数和相同的监测方式。

  • initialDelaySeconds:用来表示初始化延迟的时间,也就是告诉监测从多久之后开始运行,单位是秒
  • timeoutSeconds: 用来表示监测的超时时间,如果超过这个时长后,则认为监测失败

 LivenessProbe和ReadinessProbe均可配置以下三种实现方式

例子中只使用livenessProbe更换只需要改为readinessProbe:

(1)ExecAction:在容器内部执行一个命令,如果该命令的返回码为0,则表明容器健康

在下面的例子中,通过执行“cat /tmp/health”命令来判断一个容器运行是否正常。在该Pod运行后,将在创建/tmp/health文件10s后删除该文 件,而LivenessProbe健康检查的初始探测时间(initialDelaySeconds)为 15s,探测结果是Fail,将导致kubelet杀掉该容器并重启它

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-exec
spec:
  containers:
  - name: liveness
    image: busybox
	command: ["sh", "-c"]
    args:
    - /bin/sh
    - -c
    - echo ok > /tmp/health; sleep 10; rm -rf /tmp/health; sleep 600
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/health
      initialDelaySeconds: 15
      timeoutSeconds: 1

[root@lab-26 ~]# kubectl apply -f /data/k8s-yaml/test/dp.yaml

(2)TCPSocketAction:通过容器的IP地址和端口号执行TCP检 查,如果能够建立TCP连接,则表明容器健康

在下面的例子中,通过与容器内的localhost:80建立TCP连接进行健康检查:

apiVersion: v1
kind: Pod
metadata:
  name: pod-with-healthcheck2
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80
    livenessProbe:
      tcpSocket:
        port: 80
      initialDelaySeconds: 30
      timeoutSeconds: 1

(3)HTTPGetAction:通过容器的IP地址、端口号及路径调用HTTP Get方法,如果响应的状态码大于等于200且小于400,则认为容器健康

 在下面的例子中,kubelet定时发送HTTP请求到 localhost:80/_status/healthz来进行容器应用的健康检查(文件是之前build镜像创建的

apiVersion: v1
kind: Pod
metadata:
  name: pod-with-healthcheck
spec:
  containers:
  - name: nginx
    imagePullPolicy: Never
    image: harbor.op.com/public/nginx-hralthz:latest
    ports:
    - containerPort: 80
    livenessProbe:
      httpGet:
        path: /healthz
        port: 80
      initialDelaySeconds: 10
      timeoutSeconds: 1

[root@lab-26 ~]# kubectl apply -f /data/k8s-yaml/test/dp.yaml

[root@lab-26 ctchat]# kubectl get pod -owide
NAME                    READY   STATUS    RESTARTS   AGE     IP              NODE       NOMINATED NODE   READINESS GATES
dapi-test-pod-volume    1/1     Running   0          6h41m   172.152.106.4   minikube              
pod-with-healthcheck    1/1     Running   0          44s     172.152.106.6   minikube              
pod-with-healthcheck2   1/1     Running   0          68m     172.152.106.7   minikube              
[root@lab-26 ctchat]# curl http://172.152.106.6/healthz
ok

 

Kubernetes实践之深入掌握Pod——Pod健康检查和服务可用性检查

上一篇:HashSet中实现不插入重复的元素


下一篇:更好的理解HTTP和HTTPS