kubernetes探针
kubernetes 探针
Kubernetes,可以通过探针配置运行状况检查,以确定每个 Pod 的状态。
默认情况下,Kubernetes 会观察 Pod 生命周期,并在容器从挂起(pending)状态转移到成功(succeeded)状态时,将流量路由到 Pod。Kubelet 会监控崩溃的应用程序,并重新启动 Pod 进行恢复。
Kubernetes 的探针有三种类型:
就绪探针(Readiness Probe):判断容器是否已经就绪
存活探针(Liveness Probe):判断容器内的应用程序是否正常,若不正常,K8s 将会重新重启容器。
启动探针(Startup Probe):判断容器内的应用是否启动完成(在启动探针判断成功前,就绪探针和存活探针将不会执行)
LivenessProbe: 周期性检测, 检测未通过时,kubelet 会根据restartPolicy 的定义来决定是否重启该容器,未定义时只要容器未退出,即为健康;
ReadnessProbe: 周期性检测, 检测未通过时,与该pod关联的service会将该pod从service的后端可用列表中删除,直到此容器就绪后再次加入,未定义时只要容器未终止,即为就绪;
为什么需要容器探针?
容器探针可以确保您的容器在任何时候都处于可预测的状态。
如果没有容器探针,那么容器对于K8S平台而言,就处于一个黑盒状态。下面是没有使用容器探针可能出现的一些case:
容器未启动,负载均衡就把流量转发给容器,导致请求大量异常
容器内服务不可用/发生异常,负载均衡把流量转发给容器,导致请求大量异常
容器已经不正常工作(如容器死锁导致的应用程序停止响应),K8S平台本身无法感知,不能即时低重启容器。
常用命令详解
# 参数
spec:
containers:
- name: demo
image: demo
livenessProbe:
exec: <Object> #命令式探针
command: <[]string> #命令
httpGet: <Object> #http get 类型探针
path: /
port: <IntOrString> -required-
scheme: <string> #可用http或https
tcpSocket: <Object> #tcp socket 类型探针
host: <string> #可不指定,默认探测当前pod ip
port: <IntOrString> --required
initialDelaySeconds: <integer> #发起初次探针请求后延迟时长表示在容器启动后等待n秒后开始执行首次探测
periodSeconds: <integer> #请求周期表示每隔n秒进行一次探测。
timeoutSeconds: <integer> #超时时长表示探针在n秒内必须完成,否则将视为失败。
successThreshold: <integer> #成功阈值表示在连续n次探测成功,即为健康
failureThreshold: <integer> #失败时长表示在连续n次探测失败后,Kubernetes 将重启容器。
每种状态各支持三种探针:
Exec: 直接执行命令,命令成功返回即为成功
httpGet: 向指定端口发送请求,如果返回2xx,3xx响应码即为成功
tcpSocket 向指定端口发送握手包,探测端口是否打开,正常打开即为成功
例如:
apiVersion: v1
kind: Pod
metadata:
name: goproxy
labels:
app: goproxy
spec:
containers:
- name: goproxy
image: registry.k8s.io/goproxy:0.1
ports:
- containerPort: 8080
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 15
periodSeconds: 10
livenessProbe:
tcpSocket:
host:10.244.1.5
port: 8080
initialDelaySeconds: 15
periodSeconds: 20