背景
容器式运行的应用类似于“黑盒”,默认不会配置探针时 所以kublet只会监视pod的存活状态, 但是无法检查是否处于正常的服务
- 对于pod不处理请求的情况无法检查 不能执行一些高级的检查,
- 例如资源耗尽导致服务无法接受更多的请求
为了便于k8s对其进行监测,云原生应用应该输出用于监视自身的API
- 包括健康状态、指标、分布式跟踪和日志等
- 最基本要提供用于健康状态监测的API
应用监控
参考time.geekbang.org/column/arti…
在pod之上 添加一个探针, kubelet通过探针去检查应用 将检查结果传送给apiserver
pod的启动流程 & pod状态转换
流程
- schduler调度环节 先绑定节点
- kubelet接管
- 准备CNI CSI CRI
- 下载镜像
- 启动pod中的所有container
- 功能探测
- 启动探针 检查完成后退出
- 存活探针 长期运行 类似loop
- 监测pod是否健康
- 就绪探针
Pod支持的监测类型(健康探针)
startup Probe
启动探针,用来检查应用是否已经启动成功
- 适合那些有大量初始化工作要做,启动很慢的应用
liveness Probe
存活探针,用来检查应用是否正常运行,是否存在死锁、死循环
- 周期性的检查 类似守护进程会一直尝试检查
- 如果探测失败 例如slepp 5,10,15 直到第三次检查还是失败 就会退出
readiness Probe
就绪探针,用来检查应用是否可以接收流量,是否能够对外提供服务。
默认 不配置的话kublet会粗略的监听pod 只关心pod是否running
!!! 注意 生产环境必须配置livereadline探针 防止pod启动时立刻被service监听到 立马分配流量, pod中的应用可能还没有启动完毕 就接收到了流量
监测机制(适用于每一种探针)
- Exec Action:执行一个 Linux 命令看状态码,根据指定命令的结果状态码判定,
- TcpSocket Action:使用TCP协议尝试连接容器的指定端口,根据相应TCP套接字连接建立状态判定
- HTTPGet Action:连接端口并发送 HTTP GET 请求, 根据指定https/http服务URL的响应结果判定
配置参数
| 参数 | 解释 |
|---|---|
| initialDelaySeconds | 等容器启动一段时间后 再进行检查 |
| periodSeconds | 执行探测动作的时间间隔,默认是 10 秒探测一次 |
| timeoutSeconds | 探测动作的超时时间,如果超时就认为探测失败,默认是 1 秒。successThreshold: 连续几次探测成功才认为是正常,对于 startupProbe 和 livenessProbe 来说它只能是 1 |
| failureThreshold | 连续探测失败几次才认为是真正发生了异常,默认是 3 次。 |
探针的配置示例
同时定义了三种探针
- startup使用Exec Action
- liveness和readiness使用HTTPGet Action
测试效果
- liveness
- URL "/livez" 支持以POST方法为livez参数设定不同值,非OK值都以5xx响应码响应;
- readiness
- URL "/readyz" 支持以POST方法为readyz参数设定不同值,非OK值都以5xx响应码响应;
apiVersion: v1
kind: Pod
metadata:
name: pod-probe-demo
namespace: default
spec:
containers:
- name: demo
image: ikubernetes/demoapp:v1.0
imagePullPolicy: IfNotPresent
startupProbe:
exec:
command: [ '/bin/sh','-c','test','"$(curl -s 127.0.0.1/livez)"=="OK"' ]
initialDelaySeconds: 0
failureThreshold: 3
periodSeconds: 2
livenessProbe:
httpGet:
path: '/livez'
port: 80
scheme: HTTP
initialDelaySeconds: 3
timeoutSeconds: 2
readinessProbe:
httpGet:
path: '/readyz'
port: 80
scheme: HTTP
initialDelaySeconds: 15
timeoutSeconds: 2
restartPolicy: Always
测试
临时人为设置相应码
curl -XPOST -d 'livez=FAILD' $ip/livez
curl -I $ip/livez