存活性探测:kubelet通过存活性探测pod的状态(应用是否可用、是否hang住无法提供服务等等),来判断何时重启pod,并根据restartPolicy的重启策略进行动作,提升pod中应用的可用性。
就绪性探测:kubelet通过就绪性探测(pod提供提供服务必要条件已存在),来标记该pod的就绪状态是否能够作为service的后端调度分发流量,当 Pod 还没有准备好时,会在Service 的负载均衡器中被剔除。
容器生命周期回调:在pod启动后(PostStart)和停止前(PreStop),pod可以通过暴露的两个回调函数搞一些事情。
pod的存活性探测支持三种方式:
引用官方示例:
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: liveness
image: k8s.gcr.io/busybox
args: # 启动运行命令
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
livenessProbe: #存活探测
exec: #执行命令返回值为0表示成功,其它值kubelet会kill掉pod,并按重启策略动作
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5 # 第一次探测前应该等待的时间
periodSeconds: 5 #执行探测间隔
引用官方示例:
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-http
spec:
containers:
- name: liveness
image: k8s.gcr.io/liveness
args:
- /server
livenessProbe:
httpGet:
path: /healthz
port: 8080
httpHeaders:
- name: Custom-Header
value: Awesome
initialDelaySeconds: 3
periodSeconds: 3
HTTP模式的存活性探测,会通过GET方法请求执行的资源,返回状态码范围区间为[200-400)表示成功,其它为失败,同样kubelet会kill掉pod,并按照重启策略restartPolicy动作
与HTTP模式相似,只不过通信模式变成了套接字连接
引用官方示例:
apiVersion: v1
kind: Pod
metadata:
name: goproxy
labels:
app: goproxy
spec:
containers:
- name: goproxy
image: k8s.gcr.io/goproxy:0.1
ports:
- containerPort: 8080
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
...
ports:
- name: liveness-port
containerPort: 8080
hostPort: 8080
livenessProbe:
httpGet:
path: /healthz
port: liveness-port
failureThreshold: 1
periodSeconds: 10
startupProbe: # pod启动探测
httpGet:
path: /healthz
port: liveness-port
failureThreshold: 30 # 失败阈值30次
periodSeconds: 10
应用程序将会有最多 5 分钟(30 次* 10 = 300s) 的时间来完成它的启动。 一旦启动探测成功一次,存活探测任务就会接管对容器的探测,对容器死锁可以快速响应。 如果启动探测一直没有成功,容器会在 300 秒后被杀死,并且根据 restartPolicy 来设置 Pod 状态。
与存活性探测一样有三种模式:command 、HTTP、TCP Socket,使用的配置都一致,不再过多赘述
示例:
...
startupProbe: # pod启动探测
httpGet:
path: /healthz
port: liveness-port
failureThreshold: 3
periodSeconds: 10
HTTP Probes 可以在 httpGet 上配置额外的字段:
对于 HTTP 探测,kubelet 发送一个 HTTP 请求到指定的路径和端口来执行检测。 除非 httpGet 中的 host 字段设置了,否则 kubelet 默认是给 Pod 的 IP 地址发送探测。 如果 scheme 字段设置为了 HTTPS,kubelet 会跳过证书验证发送 HTTPS 请求。 大多数情况下,不需要设置host 字段。 这里有个需要设置 host 字段的场景,假设容器监听 127.0.0.1,并且 Pod 的 hostNetwork 字段设置为了 true。那么 httpGet 中的 host 字段应该设置为 127.0.0.1。 可能更常见的情况是如果 Pod 依赖虚拟主机,就不应该设置 host 字段,而是应该在 httpHeaders 中设置 Host。
对于 TCP Socket 探测,kubelet 在节点上(不是在 Pod 里面)建立探测连接, 这意味着不能在 host 参数上配置服务名称,因为 kubelet 不能解析服务名称。
注:在k8s集群中对重要的pod很有必要配置存活性和就绪性探测来最大程度保证pod的可用性