文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

[云原生] Kubernetes(k8s)健康检查详解与实战演示(就绪性探针 和 存活性探针)

2024-12-13 15:56

关注

官方文档:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/Kubernetes(k8s)环境部署可以参考我这篇文章:Kubernetes(k8s)最新版最完整版环境部署+master高可用实现(k8sV1.24.1+dashboard+harbor)

1)k8s中的探针种类

1、就绪检查(readinessProbe,就绪探针)

readiness probes​ 准备就绪检查,通过readiness是否准备接受流量,准备完毕加入到Endpoint,否则剔除。如果容器不提供就绪探针,则默认状态为 Success。

2、存活检查(livenessProbe,存活探针)

liveness probes​ 在线检查机制,检查应用是否可用,如死锁,无法响应,异常时将根据restartPolicy来设置 Pod 状态会自动重启容器,如果容器不提供存活探针,则默认状态为 Success。

restartPolicy有三个可选值:

3、启动检查(startupProbe,启动探针,1.17 版本新增)

就绪、存活两种探针的区别:

readinessProbe 和 livenessProbe 可以使用相同探测方式,只是对 Pod 的处置方式不同。

2)k8s中的三种探测方式

每种探测机制支持三种健康检查方法,分别是命令行exec,httpGet和tcpSocket,其中exec通用性最强,适用与大部分场景,tcpSocket适用于TCP业务,httpGet适用于web业务。

探针探测结果有以下值:

二、readinessProbe(就绪性探针)

三、livenessProbe(存活性探针)

四、实战演示

常用的探针可选参数:

参数名称

默认值

最小值

描述

initialDelaySeconds

0秒

0秒

探测延迟时长,容器启动后多久开始进行第一次探测工作。

periodSeconds

10秒

1秒

探测频度,频率过高会对pod带来较大的额外开销,频率过低则无法及时反映容器产生的错误。

timeoutSeconds

1秒

1秒

探测的超时时长。

failureThreshold

3

1

处于成功状态时,探测连续失败几次可被认为失败。

successThreshold

1

1

处于失败状态时,探测连续成功几次,被认为成功。

1)exec方式

cat >exec-liveness.yaml<<EOF
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
# 为了测试方便,指定调度机器
nodeName: local-168-182-110
containers:
- name: liveness
image: registry.aliyuncs.com/google_containers/busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
EOF

解释:

/bin/sh -c "touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 600"

创建 Pod:

# 最好先拉取镜像,如果是使用docker,就换成docker就行
crictl pull registry.aliyuncs.com/google_containers/busybox

kubectl apply -f exec-liveness.yaml

【问题】ERRO[0000] unable to determine image API version: rpc error: code = Unavailable desc = connection error: desc = “transport: Error while dialing dial unix /var/run/dockershim.sock: connect: no such file or directory”【解决】原因:未配置endpoints

crictl config runtime-endpoint unix:///run/containerd/containerd.sock
crictl config image-endpoint unix:///run/containerd/containerd.sock

查看

kubectl describe pod liveness-exec

【现象】30s之后检查失败后就重启pod了,又正常了。

2)httpGet 方式

cat >http-liveness.yaml<<EOF
apiVersion: v1
kind: Pod
metadata:
name: liveness-httpget
namespace: default
spec:
# 为了测试方便,指定调度机器
nodeName: local-168-182-110
containers:
- name: liveness-httpget-container
image: nginx
imagePullPolicy: IfNotPresent
ports:
- name: nginx
containerPort: 80
livenessProbe:
httpGet:
port: nginx
path: /index.html
initialDelaySeconds: 1
periodSeconds: 3
timeoutSeconds: 10
EOF

解释:

执行并查看

crictl pull nginx
kubectl apply -f http-liveness.yaml
kubectl describe pod liveness-httpget

删除 Pod 的 index.html 文件

kubectl exec -it liveness-httpget -- rm -rf /usr/share/nginx/html/index.html
# 再查看
kubectl describe pod liveness-httpget
kubectl get pod liveness-httpget

HTTP Probes 允许针对 httpGet 配置额外的字段:

你可以通过为探测设置 .httpHeaders 来重载默认的头部字段值;例如:

livenessProbe:
httpGet:
httpHeaders:
- name: Accept
value: application/json

startupProbe:
httpGet:
httpHeaders:
- name: User-Agent
value: MyUserAgent

3)tcpSocket 方式

cat >tcp-liveness-readiness.yaml<<EOF
apiVersion: v1
kind: Pod
metadata:
name: liveness-readiness-tcpsocket
labels:
app: liveness-readiness-tcpsocket
spec:
# 为了测试方便,指定调度机器
nodeName: local-168-182-110
containers:
- name: liveness-readiness-tcpsocket
image: nginx
ports:
- containerPort: 80
readinessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 15
periodSeconds: 20
EOF

解释:

kubectl apply -f tcp-liveness-readiness.yaml
kubectl get pod liveness-readiness-tcpsocket
kubectl describe pod liveness-readiness-tcpsocket

4)使用命名端口

对于 HTTP 或者 TCP 存活检测可以使用命名的 port。

ports:
- name: nginx
containerPort: 80
hostPort: 80

livenessProbe:
httpGet:
path: /index.html
port: nginx

完整版配置

ports:
- name: nginx
containerPort: 80
hostPort: 80

# readinessProbe,就绪探针
livenessProbe:
httpGet:
path: /index.html
port: nginx
# 延迟多久后开始探测
initialDelaySeconds: 10
# 执行探测频率() 【 每隔秒执行一次 】
periodSeconds: 10
# 超时时间
timeoutSeconds: 1
# 处于成功状态时,探测连续失败几次可被认为失败。
failureThreshold: 3
# 处于失败状态时,探测连续成功几次,被认为成功。
successThreshold: 1

# livenessProbe,存活探针
livenessProbe:
httpGet:
path: /index.html
port: nginx
# 延迟多久后开始探测
initialDelaySeconds: 10
# 执行探测频率() 【 每隔秒执行一次 】
periodSeconds: 10
# 超时时间
timeoutSeconds: 1
# 处于成功状态时,探测连续失败几次可被认为失败。
failureThreshold: 3
# 处于失败状态时,探测连续成功几次,被认为成功。
successThreshold: 1

# startupProbe,启动探针
startupProbe:
httpGet:
path: /index.html
port: nginx
# 延迟多久后开始探测
initialDelaySeconds: 10
# 执行探测频率() 【 每隔秒执行一次 】
periodSeconds: 10
# 超时时间
timeoutSeconds: 1
# 处于成功状态时,探测连续失败几次可被认为失败。
failureThreshold: 3
# 处于失败状态时,探测连续成功几次,被认为成功。
successThreshold: 1

一般使用控制器去创建管理pod,对k8s 控制器不清晰的小伙伴,可以参考我之前的文章:Kubernetes(k8s)Deployment、StatefulSet、DaemonSet、Job、CronJob五种控制器详解

下面是一个完整版的示例:

apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-probe
spec:
replicas: 3
selector:
matchLabels:
app: deployment-probe
template:
metadata:
labels:
app: deployment-probe
spec:
containers:
- name: nginx
image: nginx:1.17.1

# readinessProbe,就绪探针
readinessProbe:
httpGet:
path: /index.html
port: nginx
# 延迟多久后开始探测
initialDelaySeconds: 10
# 执行探测频率() 【 每隔秒执行一次 】
periodSeconds: 10
# 超时时间
timeoutSeconds: 1
# 处于成功状态时,探测连续失败几次可被认为失败。
failureThreshold: 3
# 处于失败状态时,探测连续成功几次,被认为成功。
successThreshold: 1

# livenessProbe,存活探针
livenessProbe:
httpGet:
path: /index.html
port: nginx
# 延迟多久后开始探测
initialDelaySeconds: 10
# 执行探测频率() 【 每隔秒执行一次 】
periodSeconds: 10
# 超时时间
timeoutSeconds: 1
# 处于成功状态时,探测连续失败几次可被认为失败。
failureThreshold: 3
# 处于失败状态时,探测连续成功几次,被认为成功。
successThreshold: 1

# startupProbe,启动探针
startupProbe:
httpGet:
path: /index.html
port: nginx
# 延迟多久后开始探测
initialDelaySeconds: 10
# 执行探测频率() 【 每隔秒执行一次 】
periodSeconds: 10
# 超时时间
timeoutSeconds: 1
# 处于成功状态时,探测连续失败几次可被认为失败。
failureThreshold: 3
# 处于失败状态时,探测连续成功几次,被认为成功。
successThreshold: 1

执行查看

crictl pull nginx:1.17.1
kubectl apply -f deployment-probe.yaml
kubectl get pod,deploy

Kubernetes(k8s)健康检查详解与实战演示就先到这里了,健康检查会伴随所有k8s编排任务,所以非常重要,其实也不难,小伙伴有什么疑问,欢迎给我留言哦~

来源:大数据与云原生技术分享内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯