目录
1, 何为健康检查
2, 探针分类
2.1,LivenessProbe 探针(存活性探测)
2.2,ReadinessProbe 探针(就绪型探测)
3, 探针实现方法
- 3.1,Container Exec
- 3.2,HTTP Check
- 3.3,TCP Socket Check
4, 探测行为参数
1, 何为健康检查
Kubernetes 架构中, 每个节点都会有 kubelet, 容器健康检查 (Container Probe) 的任务就是由 Kubelet 定期执行的.
Kubelet 会通过调用 Pod 中容器的 Handler 来执行检查动作, Handler 有以下三种类型:
ExecAction: 在容器中执行特定的命令, 命令退出返回 0(命令执行返回值:$?)表示成功
TCPSocketAction: 根据容器 IP 地址及特定的端口进行 TCP 检查, 端口访问 / 开放 / 暴露表示成功
HTTPGetAction: 根据容器 IP, 端口及访问路径发起一次 HTTP 请求, 如果返回状态码在 200 到 400 之间表示成功
每种检查动作都可能会有三种返回状态:
Success: 表示通过健康检查
Failure: 表示没有通过健康检查
Unknown: 表示检查动作失败
2, 探针分类
创建 Pod 时, 可通过 liveness 和 readiness 两种方式来探测 Pod 内容器的运行情况.
2.1,LivenessProbe 探针(存活性探测)
判断容器是否健康 (Running 状态) 并反馈给 Kubelet. 其实有很多应用长时间的后台运行后会逐渐的转为不可用状态, 并且仅能通过重启 Pod 操作恢复, 那么存活性探针机制就可以发现此类问题, 并依据探测结果结合重启策略触发后续的执行.
kubernetes 存活性探针支持的检测方法为三种: ExecAction,TCPSocketAction 和 HTTPGetAction
如果一个容器没有 LivenessProbe 探针, 那么 kubelet 就会认为该容器的 LivenessProbe 探针返回的值永远都会是 Success.
2.2,ReadinessProbe 探针(就绪型探测)
判断容器服务是否可用 (Ready 状态) 能否对外提供服务, 只有达到了 Ready 状态的 Pod 才能接收请求, 当容器里跑的业务起来之后容器的状态才能为 Ready, 负责认为容器探测失败, 如果探测失败, 则系统会将 Service 后端 Endpoint 列表中移除其 Pod IP, 后续再恢复到 Ready, 则探测成功会将其 Pod IP 加回 Endpoint 列表.
3, 探针实现方法
LivenessProbe 和 ReadinessProbe 都可配置以下三种探针实现方式:
ReadinessProbe 的配置和 LivenessProbe 类似, 只需要将 YAML 中的 livenessProbe 修改为 readinessProbe
3.1,Container Exec
创建一个容器, 通过检查一个文件是否存在来判断容器运行是否正常, 如果文件存在则会返回状态码为 0, 容器运行 30 秒后, 会将文件删除, LivenessProbe 检查失败则将重启容器.
- apiVersion: v1
- kind: Pod
- metadata:
- name: exec
- spec:
- containers:
- - name: nginx
- image: 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
检测到目录不存在
- [root@k8s-master01 health]# kubectl describe pod exec |grep "Liveness"
- Liveness: exec [cat /tmp/healthy] delay=5s timeout=1s period=5s #success=1 #failure=3
- Warning Unhealthy 4s (x3 over 14s) kubelet, k8s-node01 Liveness probe failed: cat: /tmp/healthy: No such file or directory
- 3.2,HTTP Check
创建一个 Nginx 容器, 通过访问 / index.html 来判断服务是否存活, 通过手动移除该文件的方式, 能导致检查失败, 从而重启容器
- apiVersion: v1
- kind: Pod
- metadata:
- name: httpget
- spec:
- containers:
- - name: nginx
- image: nginx:1.13
- ports:
- - containerPort: 80
- livenessProbe:
- httpGet:
- path: /index.HTML # 访问路径
- port: 80 # 容器端口
- initialDelaySeconds: 5
- periodSeconds: 5
手动将 nginx 容器的 index.HTML 文件移除
- [root@k8s-master01 health]# kubectl exec -it httpget bash
- root@httpget:/# mv /usr/share/nginx/HTML/index.HTML /tmp/
当 index.HTML 访问返回状态码不为 200 时, 就会重启容器
- [root@k8s-master01 health]# kubectl describe pod httpget |grep "Liveness"
- Liveness: http-get http://:80/index.HTML delay=5s timeout=1s period=5s #success=1 #failure=3
- Warning Unhealthy 59s (x3 over 69s) kubelet, k8s-node01 Liveness probe failed: HTTP probe failed with statuscode: 404
- 3.3,TCP Socket Check
通过对 IP 地址 (请求连接的目标 IP 地址, 默认为 Pod IP) 和端口号进行 TCP 检查, 如果可以建立 TCP 连接的话, 则认为容器健康, 它会比基于 HTTP 检测方式更加的高效(HTTP 是七层, TCP 是四层), 更节约资源, 但是精确度微低, 能建立成功并不代表页面可展示.
- apiVersion: v1
- kind: Pod
- metadata:
- name: tcpSocket
- spec:
- containers:
- - name: nginx
- image: nginx:1.13
- ports:
- - containerPort: 80
- livenessProbe:
- tcpSocket:
- port: 80
- initialDelaySeconds: 3
- periodSeconds: 3
4, 探测行为参数
- initiaDelaySeconds // 容器启动之后多久开始检测, 默认为 0 秒
- periodSeconds // 每隔多久检测一次, 默认为 10 秒, 最小为 1 秒
- failureThreshold // 检测失败几次后则认为健康检测失败, 默认为 3 次
- successThreshold // 从检测错误到成功需要几次才认为健康检测成功, 默认为 1 次
- timeoutSeconds // 执行检测命令的最长时间, 默认为 1 秒, 最小为 1 秒
httpGet 的属性
host: 主机名或 IP
scheme: 链接类型, HTTP 或 HTTPS, 默认为 HTTP
path: 请求路径
httpHeaders: 自定义请求头
port: 请求端口
来源: https://www.cnblogs.com/jasonminghao/p/12575456.html