k8s 启动探针生存探针&就绪探针
目录
k8s 启动探针&存活探针&就绪探针
因为k8s中采用大量的异步机制、以及多种对象关系设计上的解耦,当应用实例数 增加/删除、或者应用版本发生变化触发滚动升级时,系统并不能保证应用相关的service、ingress配置总是及时能完成刷新。
kubelet 使用启动探针,来检测应用是否已经启动。如果启动就可以进行后续的探测检查。慢容器一定指定启动探针。一直在等待启动 ,启动探针 成功以后就不用了,剩下存活探针和就绪探针持续运行 。
启动探针 startupProbe: 判断容器内的应用程序是否已启动,k8s v1.16加入
//未设置:默认状态为成功
//设置: 禁用所有其他探测,直到它成功为止。如果启动探测失败,kubelet将杀死容器,容器将服从其重启策略
就绪探针 readinessProbe: 保证应用不会不可用的提供给用户
//未设置:默认此容器就绪
//设置: 必须通过检测后,标记为就绪
存活探针 livenessProbe: 确保应用容器的正常存活
//未设置:容器只要有前台进程即存活
//设置,通过手段(tcp.http.exec)探测容器内部服务是否异常
存活,就绪探针的区别
面试时经常被问到,存活探针和就绪探针有什么区别?
存活探针检查失败,会重启容器
就绪探针检查失败,会将Pod移出服务,确保服务中的Pod都是可用的
探针处理程序和结果
探针是由kubelet对容器执行的定期诊断,要执行诊断,kubelet调用由容器实现的Handler,有三种类型的处理程序
- ExecAction: 在容器内部执行指定命令,如果命令退出时返回码为0,则认为诊断成功
- TCPSocketAction:对指定端口上的容器的Ip地址进行TCP检查,如果端口打开,则诊断被认为是成功的
- HTTPGetAction: 对指定的端口和路径上的容器的Ip地址执行Http Get请求,如果响应的状态码大于等于200且小于400,则认为是成功的
每次探测都将获得以下三种结果之一:
- 成功: 容器通过了诊断
- 失败: 容器未通过诊断
- 位置: 诊断失败,因此不会采取任何行动
启动探针
apiVersion: v1
kind: Pod
metadata:
name: post-test
spec:
containers:
- name: post-test
image: nginx
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "mkdir -p /app;echo test > /app/test"]
startupProbe:
exec:
command: ["/bin/sh","-c","cat /app/test"] ## 返回不是0,那就是探测失败
initialDelaySeconds: 20 ## 指定的这个秒以后才执行探测
periodSeconds: 5 ## 每隔几秒来运行这个
timeoutSeconds: 5 ##探测超时,到了超时时间探测还没返回结果说明失败
successThreshold: 1 ## 成功阈值,连续几次成才算成功
failureThreshold: 3 ## 失败阈值,连续几次失败才算真失败
存活探针
livenessProbe: 指定容器是否正在运行,如果存活探测失败,则kubelet则会杀死容器,并且容器将会受到其重启策略的影响,如果容器不提供存活探针,则默认状态为Success
livenessProbe-exec
apiVersion: v1
kind: Pod
metadata:
name: liveness-exec-pod
namespace: default
spec:
containers:
- name: liveness-exec-container
image: harbor.hongfu.com/library/busybox:v1
imagePullPolicy: IfNotPresent
command: ["/bin/sh","-c","touch /tmp/live ; sleep 60; rm -rf /tmp/live; sleep
3600"]
livenessProbe:
exec:
command: ["test","-e","/tmp/live"]
initialDelaySeconds: 1
periodSeconds: 3
livenessProbe-httpget
apiVersion: v1
kind: Pod
metadata:
name: liveness-httpget-pod
namespace: default
spec:
containers:
- name: liveness-httpget-container
image: harbor.hongfu.com/library/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
livenessProbe:
httpGet:
port: 80
path: /index.html
initialDelaySeconds: 1
periodSeconds: 3
timeoutSeconds: 3
livenessProbe-tcp
apiVersion: v1
kind: Pod
metadata:
name: probe-tcp
spec:
containers:
- name: nginx
image: harbor.hongfu.com/library/myapp:v1
livenessProbe:
initialDelaySeconds: 5
timeoutSeconds: 1
tcpSocket:
port: 80
就绪探针
readinessProbe: 指示容器是否准备好服务请求,如果就绪探测失败,端点控制器将从与pod匹配的所有service的端点中删除该Pod的Ip地址,初始延迟之前的就绪状态为Failure,如果容器不提供就绪探针,则默认状态为Success
apiVersion: v1
kind: Pod
metadata:
name: readiness-httpget-pod
namespace: default
labels:
app: myapp
spec:
containers:
- name: readiness-httpget-container
image: wangyanglinux/myapp:v1
imagePullPolicy: IfNotPresent
readinessProbe:
httpGet:
port: 80
path: /index1.html
//1秒后开始检测
initialDelaySeconds: 1
//后每3秒探测一次
periodSeconds: 3
启动、退出动作
apiVersion: v1
kind: Pod
metadata:
name: lifecycle-demo
spec:
containers:
- name: lifecycle-demo-container
image: harbor.hongfu.com/library/myapp:v1
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
preStop:
exec:
command: ["/bin/sh", "-c", "echo Hello from the poststop handler > /usr/share/message"]