k8s对pod的健康检查
liveness和readiness欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导
liveness和readiness
思考:在以容器方式部署一组有依赖关系的服务时,如何保证某一个服务启动前,其上一个服务已经处于就绪状态?否则该服务可能因为依赖关系而导致启动失败,容器退出。
针对此类问题,kubernetes提供了探针
的方式对容器进行健康检查。
探针的分类
k8s提供的探针分别为livenessProbe
和readinessProbe
,各node节点的kubelet根据探针的内容定期对容器执行探测,以达到对容器状态的判断。
探针功能说明
livenessProbe & readinessProbe
livenessProbe:用于判断容器是否存活(STATUS是否为Running状态)。若存活探测失败,则kubelet会kill掉该容器,并根据容器所设置的重启策略进行下一步操作,
默认情况下,若未设置livenessProbe,则kubelet认为livenessProbe探针返回值为success。
readinessProbe:用于判断容器服务是否可用(STATUS是否为Ready状态),达到Ready状态的容器可以进行接收请求。若就绪探测失败,则端点控制器(endpoints)将从与pod匹配的所有service中删除该pod的ip地址。
设置了该探针后,初始延迟之前探针的状态为Failure;
如果未设置该探针,则默认状态为Success。
端点控制器:
可配置的实现方式
livenessProbe和readinessProbe均可配置以下三种方式,满足常用的探测需求:
- ExecAction:在容器内部执行指定命令,若该命令退出时的状态码为
0
,则表示容器正常。 - TCPSocketAction:对容器的IP和端口进行TCP检查,若能够建立TCP连接,则表示容器正常。
- HTTPGetAction:对容器的IP、端口、访问路径执行HTTP Get方法,若HTTP返回的状态码>=200 and <400 则表示容器正常。
每种方式下均可配置以下探针执行时的参数:
参数 | 类型 | 说明 |
---|---|---|
failureThreshold | <integer> | 当上一次探测结果为成功时,需要连续探测多少次失败,才视为探测结果失败。默认为3次,最少为1次 |
initialDelaySeconds | <integer> | 容器启动多少秒后,启动第一次探测 |
periodSeconds | <integer> | 执行探测的频率,默认为10s,最少为1s |
successThreshold | <integer> | 当上一次探测结果为失败时,需要连续探测多少次成功,才视为探测结果成功。默认为1,且为了容器的正常启动必须设置为1 |
timeoutSeconds | <integer> | 探测超时的秒数,默认为1s,最小为1s |
探测结果
探测结果分为3种:
- 成功:容器通过探测
- 失败:容器未通过探测
- 未知:不会采取任何行动,容器会挂死,等待探测完成。
探针的使用
readinessProbe和livenessProbe(不限),这里仅介绍探针在yaml文件中的书写方式。
exec方式
$ cat > liveness.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: liveness
labels:
name: liveness
spec:
containers:
- name: liveness
image: busybox
imagePullPolicy: IfNotPresent
args:
- /bin/sh
- -c
- echo ok > /tmp/health; sleep 10; rm -fr /tmp/health; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/health
failureThreshold: 3
initialDelaySeconds: 15
timeoutSeconds: 1
periodSeconds: 3
EOF
当livenessProbe探测失败时,重新启动容器。
tcpSocket
$ cat > redis.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: redis
spec:
restartPolicy: OnFailure
containers:
- name: redis
image: redis
imagePullPolicy: IfNotPresent
ports:
- name: redis
containerPort: 3306
livenessProbe:
tcpSocket:
port: 3307
initialDelaySeconds: 5
timeoutSeconds: 1
EOF
httpGet
$ cat > nginx.yaml < EOF
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: harbor.gdgbpx.com/bestmem/nginx:1.18.0
livenessProbe:
httpGet:
port: 80
path: /index1.html
EOF
事例yaml文件主要采用了livenessProbe探针,readinessProbe写法类似,主要是探测失败时,会从端点控制器中剔除相关pod并重启。
还可以通过readinessGates
自定义探针,进行探测,具体可通过kubectl explain pod.spec.readinessGates
查看。
更多推荐
所有评论(0)