系列目录
kubernetes 提供了 livenessProbe(可用性探针)和 readinessProbe(就绪性探针)对容器的健康性进行检测, 当然这仅仅简单的关于可用性方面的探测, 实际上我们不仅仅要对容器进行健康检测, 还要对容器内布置的应用进行健康性检测, 这不在本篇讨论之列, 后面会有专门篇幅来讨论结合 APM 工具, grafana 和 prometheus 的应用检测预警机制.
pod 生命周期阶段
Pending: 表示集群系统正在创建 Pod, 但是 Pod 中的 container 还没有全部被创建, 这其中也包含集群为 container 创建网络, 或者下载镜像的时间;
Running: 表示 pod 已经运行在一个节点商量, 并且所有的 container 都已经被创建. 但是并不代表所有的 container 都运行, 它仅仅代表至少有一个 container 是处于运行的状态或者进程出于启动中或者重启中;
Succeeded: 所有 Pod 中的 container 都已经终止成功, 并且没有处于重启的 container;
Failed: 所有的 Pod 中的 container 都已经终止了, 但是至少还有一个 container 没有被正常的终止(其终止时的退出码不为 0)
对于 liveness probes 的结果也有几个固定的可选项值:
Success: 表示通过检测
Failure: 表示没有通过检测
Unknown: 表示检测没有正常进行
Liveness Probe 的种类:
ExecAction: 在 container 中执行指定的命令. 当其执行成功时, 将其退出码设置为 0;
TCPSocketAction: 执行一个 TCP 检查使用 container 的 IP 地址和指定的端口作为 socket. 如果端口处于打开状态视为成功;
HTTPGetAcction: 执行一个 HTTP 默认请求使用 container 的 IP 地址和指定的端口以及请求的路径作为 url, 用户可以通过 host 参数设置请求的地址, 通过 scheme 参数设置协议类型 (HTTP,HTTPS) 如果其响应代码在 200~400 之间, 设为成功.
当前 kubelet 拥有两个检测器, 他们分别对应不通的触发器(根据触发器的结构执行进一步的动作):
Liveness Probe: 表示 container 是否处于 live 状态. 如果 LivenessProbe 失败, LivenessProbe 将会通知 kubelet 对应的 container 不健康了. 随后 kubelet 将 kill 掉 container, 并根据 RestarPolicy 进行进一步的操作. 默认情况下 LivenessProbe 在第一次检测之前初始化值为 Success, 如果 container 没有提供 LivenessProbe, 则也认为是 Success;
ReadinessProbe: 表示 container 是否以及处于可接受 service 请求的状态了. 如果 ReadinessProbe 失败, endpoints controller 将会从 service 所匹配到的 endpoint 列表中移除关于这个 container 的 IP 地址. 因此对于 Service 匹配到的 endpoint 的维护其核心是 ReadinessProbe. 默认 Readiness 的初始值是 Failure, 如果一个 container 没有提供 Readiness 则被认为是 Success.
对于 LivenessProbe 和 ReadinessProbe 用法都一样, 拥有相同的参数和相同的监测方式.
initialDelaySeconds: 用来表示初始化延迟的时间, 也就是告诉监测从多久之后开始运行, 单位是秒
periodSeconds: 检测的间隔时间, kubernetes 每隔一段时间会检测一次, 默认为 10 秒, 最小为 1 秒
timeoutSeconds: 用来表示监测的超时时间, 如果超过这个时长后, 则认为监测失败
当前对每一个 Container 都可以设置不同的 restartpolicy, 有三种值可以设置:
Always: 只要 container 退出就重新启动
OnFailure: 当 container 非正常退出后重新启动
Never: 从不进行重新启动
如果 restartpolicy 没有设置, 那么默认值是 Always. 如果 container 需要重启, 仅仅是通过 kubelet 在当前节点进行 container 级别的重启.
最后针对 LivenessProbe 如何使用, 请看下面的几种方式, 如果要使用 ReadinessProbe 只需要将 livenessProbe 修改为 readinessProbe 即可:
- apiVersion: v1
- kind: Pod
- metadata:
- name: probe-exec
- namespace: coocla
- spec:
- containers:
- - name: nginx
- image: nginx
- livenessProbe:
- exec:
- command:
- - cat
- - /tmp/health
- initialDelaySeconds: 5
- timeoutSeconds: 1
- ---
- apiVersion: v1
- kind: Pod
- metadata:
- name: probe-http
- namespace: coocla
- spec:
- containers:
- - name: nginx
- image: nginx
- livenessProbe:
- httpGet:
- path: /
- port: 80
- host: www.baidu.com
- scheme: HTTPS
- initialDelaySeconds: 5
- timeoutSeconds: 1
- ---
- apiVersion: v1
- kind: Pod
- metadata:
- name: probe-tcp
- namespace: coocla
- spec:
- containers:
- - name: nginx
- image: nginx
- livenessProbe:
- initialDelaySeconds: 5
- timeoutSeconds: 1
- tcpSocket:
- port: 80
检测方式
exec - 命令
在用户容器内执行一次命令, 如果命令执行的退出码为 0, 则认为应用程序正常运行, 其他任务应用程序运行不正常.
- ......
- livenessProbe:
- exec:
- command:
- - cat
- - /home/laizy/test/hostpath/healthy
- ......
- TCPSocket
将会尝试打开一个用户容器的 Socket 连接(就是 IP 地址: 端口). 如果能够建立这条连接, 则认为应用程序正常运行, 否则认为应用程序运行不正常.
HTTPGet
调用容器内 web 应用的 Web hook, 如果返回的 HTTP 状态码在 200 和 399 之间, 则认为应用程序正常运行, 否则认为应用程序运行不正常. 每进行一次 HTTP 健康检查都会访问一次指定的 URL.
- ......
- httpGet: #通过 httpget 检查健康, 返回 200-399 之间, 则认为容器正常
- path: / #URI 地址
- port: 80 #端口号
- #host: 127.0.0.1 #主机地址
- scheme: HTTP #支持的协议, http 或者 https
- httpHeaders:'' #自定义请求的 header
- ......
部署实例
cat <<EOF> inessprobe.YAML
- apiVersion: v1
- kind: ReplicationController
- metadata:
- name: inessprobe
- labels:
- project: lykops
- App: inessprobe
- version: v1
- spec:
- replicas: 6
- selector:
- project: lykops
- App: inessprobe
- version: v1
- name: inessprobe
- template:
- metadata:
- labels:
- project: lykops
- App: inessprobe
- version: v1
- name: inessprobe
- spec:
- restartPolicy: Always
- containers:
- - name: inessprobe
- image: Web:apache
- imagePullPolicy: Never
- command: ['sh',"/etc/run.sh" ]
- ports:
- - containerPort: 80
- name: httpd
- protocol: TCP
- readinessProbe:
- httpGet:
- path: /
- port: 80
- scheme: HTTP
- initialDelaySeconds: 120
- periodSeconds: 15
- timeoutSeconds: 5
- livenessProbe:
- httpGet:
- path: /
- port: 80
- scheme: HTTP
- initialDelaySeconds: 180
- timeoutSeconds: 5
- periodSeconds: 15
- EOF
- cat <<EOF> inessprobe-svc.YAML
- apiVersion: v1
- kind: Service
- metadata:
- name: inessprobe
- labels:
- project: lykops
- App: inessprobe
- version: v1
- spec:
- selector:
- project: lykops
- App: inessprobe
- version: v1
- ports:
- - name: http
- port: 80
- protocol: TCP
- EOF
- kubectl create -f inessprobe-svc.YAML
- kubectl create -f inessprobe.YAML
参数说明:
initialDelaySeconds: 容器启动后第一次执行探测是需要等待多少秒.
periodSeconds: 执行探测的频率. 默认是 10 秒, 最小 1 秒.
timeoutSeconds: 探测超时时间. 默认 1 秒, 最小 1 秒.
successThreshold: 探测失败后, 最少连续探测成功多少次才被认定为成功. 默认是 1. 对于 liveness 必须是 1. 最小值是 1.
failureThreshold: 探测成功后, 最少连续探测失败多少次才被认定为失败. 默认是 3. 最小值是 1.
来源: https://www.cnblogs.com/tylerzhou/p/11042274.html