上次一起学习了pod的2个钩子函数:PostStart 和 PreStop。PostStart是容器创建后执行的(异步的),PreStop是容器终止之前执行的(同步的)。其实容器还有个强大功能,就是健康检查功能。原来在做web开发的时候,都是通过shell脚本或者开发个小应用检测应用是否存在,是否挂了。其实对于k8s的这种编排工具自带了对pod的健康检查配置,这个很方便。
用过nginx的老铁,应该都知道nginx就有健康检查的机制,当服务不可用负载均衡。负载均衡帮助解决单台服务器的访问压力,同时提高了系统的高可用性,而健康检查常常作为当前实例是否“可用”的判断标准。即:当系统发现某台实例健康检查不通过,负载均衡器将不会把流量导向该实例。
可以用来检查容器内应用的存活的情况来,如果检查失败会杀掉容器进程,是否重启容器则取决于Pod的[重启策略]。
检查容器内的应用是否能够正常对外提供服务,如果探测失败,则Endpoint Controller会将这个Pod的IP从服务中删除。
Kubelet通过调用Pod中容器的[Handler]来执行检查的动作,Handler有三种类型。
每种检查动作都可能有三种返回状态。
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: liveness
image: docker.io/nginx
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
vi liveness.yaml
kubectl apply -f liveness.yaml
kubectl describe pod liveness-exec
服务自动重启下。通过健康检查。
已经重启了5次了
创建一个Apache服务器,通过访问 index 来判断服务是否存活。通过手工删除这个文件的方式,可以导致检查失败,从而重启容器。
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
vi http.yaml
kubectl apply -f http.yaml
kubectl describe pod liveness-http
删除index文件,报404http服务
kubectl exec -it liveness-http -- /bin/bash
cd htdocs/
rm index.html
exit
kubectl get pod
apiVersion: v1
kind: Pod
metadata:
name: goproxy
labels:
app: goproxy
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
TCP 检查的配置与 HTTP 检查非常相似。此示例同时使用了 readiness 和 liveness probe。容器启动后5秒钟,kubelet将发送第一个 readiness probe。这将尝试连接到端口8080上的 goproxy 容器。如果探测成功,则该 Pod 将被标记为就绪。Kubelet 将每隔10秒钟执行一次该检查。除了 readiness probe之外,该配置还包括 liveness probe。容器启动15秒后,kubelet 将运行第一个 liveness probe。就像readiness probe一样,这将尝试连接到 goproxy 容器上的8080端口。如果 liveness probe 失败,容器将重新启动。
PS:这里socket端口的方式没有演示,只是提供了源码跟http基本一样的。这就是存活探针和可读性探针的使用方法,pod的这个健康检查对提高应用程序的稳定性健壮性很有必要,一般线上的程序都需要部署这2个参数 liveness probe 和 readiness probe。pod 是一个逻辑单位,可以包含 n 个 container,他们共享 something。docker的container 就是单个container。