Kubernetes(8)Health Check

Kubernetes(8)Health Check

强大的自愈能力是Kubernetes这类容器编排引擎的一个重要特性。自愈的默认实现方式是自动重启发生故障的容器。除此之外,用户还可以利用Liveness和Readiness探测机制设置更精细的健康检查,进而实现如下需求:
(1)零停机部署。
(2)避免部署无效的镜像。
(3)更加安全的滚动升级。
下面通过实践学习Kubernetes的Health Check功能

默认的健康检查
我们首先学习Kubernetes默认的健康检查机制:每个容器启动时
都会执行一个进程,此进程由Dockerfile的CMD或ENTRYPOINT指
定。如果进程退出时返回码非零,则认为容器发生故障,Kubernetes
就会根据restartPolicy重启容器

基本的健康检查

# 下面我们模拟一个容器发生故障的场景
[k8s@server1 ~]$ cat 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
Pod的restartPolicy设置为OnFailure,默认为Always。sleep 10; exit 1模拟容器启动10秒后发生故障。
执行kubectl apply创建Pod,命名为healthcheck

# 可看到容器当前已经重启了
[k8s@server1 ~]$ kubectl apply -f healthcheck.yml 
pod/healthcheck created
[k8s@server1 ~]$ kubectl get pod healthcheck 
NAME          READY   STATUS    RESTARTS   AGE
healthcheck   1/1     Running   0          8s
[k8s@server1 ~]$ kubectl get pod healthcheck
NAME          READY   STATUS             RESTARTS   AGE
healthcheck   0/1     CrashLoopBackOff   4          3m34s
"""
在上面的例子中,容器进程返回值非零,Kubernetes则认为容器
发生故障,需要重启。有不少情况是发生了故障,但进程并不会退
出。比如访问Web服务器时显示500内部错误,可能是系统超载,也
可能是资源死锁,此时httpd进程并没有异常退出,在这种情况下重启
容器可能是最直接、最有效的解决方案,那我们如何利用Health
Check机制来处理这类场景呢?
答案就是Liveness探测。
"""

Liveness探测

Liveness探测让用户可以自定义判断容器是否健康的条件。如果
探测失败,Kubernetes就会重启容器

[k8s@server1 ~]$ cat 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
   livenessProbe:
     exec:
       command:
       - cat
       - /tmp/healthy
     initiaDelaySeconds: 10
     periodSeconds: 5

"""
启动进程首先创建文件/tmp/healthy,30秒后删除,在我们的设定
中,如果/tmp/healthy文件存在,则认为容器处于正常状态,反之则发
生故障

livenessProbe部分定义如何执行Liveness探测:
(1)探测的方法是:通过cat命令检查/tmp/healthy文件是否存
在。如果命令执行成功,返回值为零,Kubernetes则认为本次
Liveness探测成功;如果命令返回值非零,本次Liveness探测失败。
(2)initialDelaySeconds:10指定容器启动10s之后开始执行
Liveness探测,我们一般会根据应用启动的准备时间来设置。比如某
个应用正常启动要花30秒,那么initialDelaySeconds的值就应该大于
30
(3)periodSeconds:5指定每5秒执行一次Liveness探测。
Kubernetes如果连续执行3次Liveness探测均失败,则会杀掉并重启容
器
"""
[k8s@server1 ~]$ kubectl apply -f liveness.yml 
error: error validating "liveness.yml": error validating data: ValidationError(Pod.spec.containers[0].livenessProbe): unknown field "initiaDelaySeconds" in io.k8s.api.core.v1.Probe; if you choose to ignore these errors, turn validation off with --validate=false
[k8s@server1 ~]$ kubectl
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值