Docker容器和K8s添加Health Check (2)

redis

#!/bin/bash set -eo pipefail host="$(hostname -i || echo '127.0.0.1')" if ping="$(redis-cli -h "$host" ping)" && [ "$ping" = 'PONG' ]; then exit 0 fi exit 1 K8s中的健康检查

实际上,我们用的更多的是使用k8s的健康检查来标注容器是否健康。

k8s利用 LivenessReadiness 探测机制设置更精细的健康检查,进而实现如下需求:

零停机部署。

避免部署无效的镜像。

更加安全的滚动升级。

每个容器启动时都会执行一个进程,此进程由 Dockerfile 的 CMD 或 ENTRYPOINT 指定。如果进程退出时返回码非零,则认为容器发生故障,Kubernetes 就会根据 restartPolicy 重启容器。

在创建Pod时,可以通过liveness和readiness两种方式来探测Pod内容器的运行情况。liveness可以用来检查容器内应用的存活的情况来,如果检查失败会杀掉容器进程,是否重启容器则取决于Pod的重启策略。readiness检查容器内的应用是否能够正常对外提供服务,如果探测失败,则Endpoint Controller会将这个Pod的IP从服务中删除。

探针的检测方法有三种:

exec:执行一段命令

HTTPGet:通过一个http请求得到返回的状态码

tcpSocket:测试某个端口是否可以连通

每种检查动作都可能有三种返回状态。

Success,表示通过了健康检查

Failure,表示没有通过健康检查

Unknown,表示检查动作失败

Container Exec

nginx_pod_exec.yaml:

apiVersion: v1 kind: Pod metadata: name: test-exec labels: app: web spec: containers: - name: nginx image: 192.168.56.201:5000/nginx:1.13 ports: - containerPort: 80 args: - /bin/sh - -c - touch /tmp/healthy;sleep 30;rm -rf /tmp/healthy;sleep 600 livenessProbe: exec: command: - cat - /tmp/healthy initialDelaySeconds: 5 periodSeconds: 5

本例创建了一个容器,通过检查一个文件是否存在来判断容器运行是否正常。容器运行30秒后,将文件删除,这样容器的liveness检查失败从而会将容器重启。

HTTP Health Check apiVersion: v1 kind: Pod metadata: labels: test: liveness app: httpd name: liveness-http spec: containers: - name: liveness image: docker.io/httpd ports: - containerPort: 80 livenessProbe: httpGet: path: /index.html port: 80 httpHeaders: - name: X-Custom-Header value: Awesome initialDelaySeconds: 5 periodSeconds: 5

本例通过创建一个服务器,通过访问 index 来判断服务是否存活。通过手工删除这个文件的方式,可以导致检查失败,从而重启容器。

[root@devops-101 ~]# kubectl exec -it liveness-http /bin/sh # # ls bin build cgi-bin conf error htdocs icons include logs modules # ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 11:39 ? 00:00:00 httpd -DFOREGROUND daemon 6 1 0 11:39 ? 00:00:00 httpd -DFOREGROUND daemon 7 1 0 11:39 ? 00:00:00 httpd -DFOREGROUND daemon 8 1 0 11:39 ? 00:00:00 httpd -DFOREGROUND root 90 0 0 11:39 ? 00:00:00 /bin/sh root 94 90 0 11:39 ? 00:00:00 ps -ef # # cd /usr/local/apache2 # ls bin build cgi-bin conf error htdocs icons include logs modules # cd htdocs # ls index.html # rm index.html # command terminated with exit code 137 [root@devops-101 ~]# kubectl describe pod liveness-http Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 1m default-scheduler Successfully assigned default/liveness-http to devops-102 Warning Unhealthy 8s (x3 over 18s) kubelet, devops-102 Liveness probe failed: HTTP probe failed with statuscode: 404 Normal Pulling 7s (x2 over 1m) kubelet, devops-102 pulling image "docker.io/httpd" Normal Killing 7s kubelet, devops-102 Killing container with id docker://liveness:Container failed liveness probe.. Container will be killed and recreated. Normal Pulled 1s (x2 over 1m) kubelet, devops-102 Successfully pulled image "docker.io/httpd" Normal Created 1s (x2 over 1m) kubelet, devops-102 Created container Normal Started 1s (x2 over 1m) kubelet, devops-102 Started container TCP Socket

这种方式通过TCP连接来判断是否存活,Pod编排示例。

apiVersion: v1 kind: Pod metadata: labels: test: liveness app: node name: liveness-tcp spec: containers: - name: goproxy image: docker.io/googlecontainer/goproxy:0.1 ports: - containerPort: 8080 readinessProbe: tcpSocket: port: 8080 initialDelaySeconds: 5 periodSeconds: 10 livenessProbe: tcpSocket: port: 8080 initialDelaySeconds: 15 periodSeconds: 20 readiness 检查实例

另一种 readiness配置方式和liveness类似,只要修改livenessProbe改为readinessProbe即可。

一些参数解释

initialDelaySeconds:检查开始执行的时间,以容器启动完成为起点计算

periodSeconds:检查执行的周期,默认为10秒,最小为1秒

timeoutSeconds:检查超时的时间,默认为1秒,最小为1秒

successThreshold:从上次检查失败后重新认定检查成功的检查次数阈值(必须是连续成功),默认为1

failureThreshold:从上次检查成功后认定检查失败的检查次数阈值(必须是连续失败),默认为1

httpGet的属性

host:主机名或IP

scheme:链接类型,HTTP或HTTPS,默认为HTTP

path:请求路径

httpHeaders:自定义请求头

port:请求端口

参考

https://docs.docker.com/compose/startup-order/

https://github.com/docker-library/healthcheck

https://www.cnblogs.com/cocowool/p/kubernetes_container_probe.html

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppydd.html