【学习笔记08】每天5分钟,玩转kubernetes-08(Health Check)

第八章 Health Check

8.1 默认的健康检查

每个容器启动时会执行一个进程,此进程由Dockerfile的CMD或ENTRYPOINT指定。如果进程退出时返回码非零,则认为容器发生故障,K8s就会根据restartPolicy.
如果容器进程返回非零,K8s就认为容器发生故障,需要重启。
可是有时候,容器发生了故障,但是容器并不退出。

编写Pod配置

vim healthcheck.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: healthcheck
  name: healthcheck
spec:
  restartPolicy: OnFailure
  containers:
  - name: healthcheck
    image: busybox
    args: 
    - /bin/sh
    - -c
    - sleep 10; exit 1

测试

 $kubectl apply -f healthcheck.yml 
 $kubectl get pods healthcheck
NAME          READY   STATUS   RESTARTS   AGE
healthcheck   0/1     Error    3          112s

#删除pod healthcheck
$kubectl delete pod healthcheck

8.2 Liveness探测

Liveness探测让用户可以自定义判断容器是否健康的条件。如果探测失败,K8是就会重启容器。
开始30秒,/tmp/healthy文件存在,cat 命令返回0,liveness探测成功,

vim liveness.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness
spec:
  restartPolicy: OnFailure
  containers:
  - name: liveness
    image: busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600         # 创建文件,30秒后删除
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy                           # 如果文件存在,则认为容器处于正常状态,反之则发生故障;
      initialDelaySeconds: 10                    # 容器启动10秒后开始探测             
      periodSeconds: 5                           # 每5秒执行一次探测
#执行
kubectl apply -f liveness.yml 

kubectl describe pod liveness

$kubectl describe pod liveness
  Warning  Unhealthy  0s (x9 over 2m40s)   kubelet, k8s-node-122132072  Liveness probe failed: cat: can't open '/tmp/healthy': No such file or directory
  Normal   Killing    0s (x3 over 2m30s)   kubelet, k8s-node-122132072  Container liveness failed liveness probe, will be restarted

$ kubectl get pods liveness
NAME       READY   STATUS    RESTARTS   AGE
liveness   1/1     Running   3          4m8s

8.3 Readiness探测

liveness探测,告诉k8s通过重启来自愈。
Readiness探测:告诉k8s什么时候可以将容器加入到Service负载均衡池中,对外提供服务。

vim readiness.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: readiness   #修改
  name: readiness #修改
spec:
  restartPolicy: OnFailure
  containers:
  - name: readiness
    image: busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
    readinessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 10
      periodSeconds: 5

readiness布署

kubectl apply -f readiness.yml 
$ kubectl get pods readiness
NAME        READY   STATUS    RESTARTS   AGE
readiness   0/1     Running   0          87s
$kubectl describe pod readiness
  Normal   Pulling    112s               kubelet, k8s-node-122132073  Pulling image "busybox"
  Normal   Pulled     103s               kubelet, k8s-node-122132073  Successfully pulled image "busybox"
  Normal   Created    103s               kubelet, k8s-node-122132073  Created container readiness
  Normal   Started    103s               kubelet, k8s-node-122132073  Started container readiness
  Warning  Unhealthy  3s (x14 over 68s)  kubelet, k8s-node-122132073  Readiness probe failed: cat: can't open '/tmp/healthy': No such file or directory

liveness 和 Readiness 比较:
1)默认情况二者都是看容器退出时返回值是否为0,来判断是否失败。
2)二者的配置方法完全相同,不同的是探测失败后的处理:Liveness重启容器;Readiness将容器设置为不可用。

  1. 二者独立执行,没有依赖。Liveness探测判断容器是否需要重启来自愈; Readiness探测容器是否已经准备好对外提供服务。

8.4 Health Check在Scale up中的应用

当执行scale up(扩容)的时候,新的副本添加到service的负载均衡中,与已有副本一起处理客户请求。应用启动通常需要一个准备阶段,比如加载缓存、连接数据库等,从容器启动到真正提供服务需要一段时间。可以通过Readiness探测判断容器是否就绪,避免将请求发到没有准备好的backend.

readinessProbe:
  httpGet:
    scheme: HTTP                   
    path: /healthy                 # 访问路径
    port: 8080                     # 指定端口
    initialDealySeconds: 10        # 容器启动10秒后开始探测
    periodSeconds: 5               # 每隔5秒探测一次

8.5 Health check 在滚动更新中的应用

$ kubectl get deployment
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
httpd     2         2         2            0           6s

DESIRED:  期望有多少个副本
CURRENT: 当前副本数目,  旧的 +  新的
UP-TO-DATE: 已经完成更新的副本数
AVAILABLE: 状态是READY可以提供服务的副本数

参考:

  • 【目录】每天5分钟,玩转kubernetes
  • https://kubernetes.io/zh/docs/tutorials/

你可能感兴趣的:(【学习笔记08】每天5分钟,玩转kubernetes-08(Health Check))