AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
[TOC] # Pod 健康检查(探针)和重启策略 Pod 的探针分为`liveness`和`readiness`探针 存活探针 和 就绪探针 * liveness 为容器存活探针 * readiness 为容器就绪探针(可读性) ## 存活探针 (liveness) 根据官网api手册,查到liveness提供三种探测方法 * exec :执行命令的检测方式 * httpGet :根据http请求返回的检测方式 * tcpSocket :检查容器TCP状态,如果能连接则正常(eg:连接数据库3389) ### exec 方式示例 ~~~ apiVersion: v1 kind: Pod metadata: labels: test: liveness name: liveness-exec spec: containers: - name: liveness args: - /bin/sh - -c - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600 image: busybox livenessProbe: exec: command: - cat - /tmp/healthy initialDelaySeconds: 5 # 容器启动完成后,等待5秒再开始检测 periodSeconds: 5 #每间隔5秒检测一次 ~~~ 上面的yaml做了两件事情 * 定义一个pod,这个pod会在启动时,创建`/tmp/healthy`的文件,然后等待30秒后,删除这个文件 * 每隔5秒,就会执行`cat /tmp/healthy`命令,如果检测到执行命令失败,则这个Pod将会重启 因为一开始创建容器的时候,是有`/tmp/healthy`文件的,但是30秒后,这个文件将会被删除,随后检测失败,这个容器再次被重启,如此循环 ![](https://img.kancloud.cn/34/a5/34a5ce2da5224538d23a6e4f0d3c0330_1027x588.png) 重启的次数 ![](https://img.kancloud.cn/14/c5/14c57031f660e1da0ecc591c93ad60ff_883x52.png) ### httpGet 方式示例 httpGet的方式是检查返回码,而不是检测某个具体的端口,例如8080 ~~~ apiVersion: v1 kind: Pod metadata: labels: test: liveness name: liveness-http spec: containers: - name: liveness image: registry.cn-shenzhen.aliyuncs.com/zwh-kolla/liveness (官方测试用的镜像,我下载到了阿里云上) args: - /server livenessProbe: httpGet: path: /healthz port: 8080 httpHeaders: - name: Custom-Header value: Awesome initialDelaySeconds: 3 periodSeconds: 3 ~~~ **任何大于或等于200且小于400的代码表示成功,任何其他代码表示失败。** `periodSeconds`:指定kubelet应每3秒执行一次活跃度探测 `initialDelaySeconds`:告诉kubelet应该在执行第一次探测之前等待3秒`name: Custom-Header`和`value: Awesome`:获取http返回文本信息中的内容 查看api文档,httpGet检测方式,有以下字段可以设置: * host:要连接的主机名,默认为Pod IP,可以在http request head中设置host头部。 * scheme: 用于连接host的协议,默认为HTTP。 * path:http服务器上的访问URI。 * httpHeaders:自定义HTTP请求headers,HTTP允许重复headers。 * port: 容器上要访问端口号或名称。 ## 就绪探针 (readiness) ### TCP 方式示例 针对检测某一个指定的端口 ~~~ apiVersion: v1 kind: Pod metadata: name: goproxy labels: app: goproxy spec: containers: - name: goproxy image: k8s.gcr.io/goproxy:0.1 ports: - containerPort: 8080 readinessProbe: tcpSocket: port: 8080 initialDelaySeconds: 5 periodSeconds: 10 livenessProbe: tcpSocket: port: 8080 initialDelaySeconds: 15 periodSeconds: 20 ~~~ 这个示例中,使用了两个探针`readinessProbe`和`livenessProbe` * 第一步:使用`readinessProbe`字段,容器启动完成5秒后,每隔10秒访问一次8080端口,能访问则容器正常。 * 第二步:使用`livenessProbe`字段,容器启动完成15秒后,每隔20秒访问一次8080端口,能访问则容器正常。 #### readinessProbe和livenessProbe区别 两种配对Pod的处置方式不同 * 就绪探针`readinessProbe`探测失败时,就绪探针不会删除或重启Pod,而是会显示“未就绪”状态 * 存活探针`livenessProbe`探测失败时,则Kill容器并根据Pod的重启策略来决定作出对应的措施 还是上面TCP的示例片段 ~~~ readinessProbe: tcpSocket: port: 8080 initialDelaySeconds: 5 periodSeconds: 10 livenessProbe: tcpSocket: port: 8080 initialDelaySeconds: 15 periodSeconds: 20 ~~~ ### 探针其他可选字段 (详情可以查看官网API文档) `initialDelaySeconds`:Pod启动后延迟多久才进行检查,单位:秒。 `periodSeconds`:检查的间隔时间,默认为10,单位:秒。 `timeoutSeconds`:探测的超时时间,默认为1,单位:秒。 `successThreshold`:探测失败后认为成功的最小连接成功次数,默认为1,在Liveness探针中必须为1,最小值为1。 `failureThreshold`:探测失败的重试次数,重试一定次数后将认为失败,在readiness探针中,Pod会被标记为未就绪,默认为3,最小值为1 ### 使用命名的端口 可以使用命名的ContainerPort作为HTTP或TCP liveness检查: ~~~ ports: - name: liveness-port containerPort: 8080 hostPort: 8080 livenessProbe: httpGet: path: /healthz port: liveness-port ~~~ ## 重启策略 根据`restartPolicy`来定义重启策略 1)`Always`:但凡 Pod 对象终止就将其重启,此为默认设定。 2)`OnFailure`:仅在 Pod 对象出现错误时方才将其重启。 3)`Never`: 从不重启。 Pod 的重启,只会在当前同一节点上尝试重启 Pod。 只有第一次重启是立刻执行,后面需要重启时,kubelet 会延迟时间进行,且反复 的重启操作的延迟时长依次为 10秒、20秒、40秒、80秒、160秒和300秒,300秒是最大延迟时长。