第八章 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将容器设置为不可用。
- 二者独立执行,没有依赖。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/