Kubernetes 生命周期之三大探测
探测的意义
在 Kubernetes 中 Pod 是最小的计算单元,而一个 Pod 又由多个容器组成,相当于每个容器就是 Pod 的一个进程。容器在运行期间,可能因为某些意外情况致崩溃重启。为了监测容器运行的状态,Kubernetes 提供了三大探测机制StartupProbe
、ReadinessProbe
和LivenessProbe
。这三大探测机制可以是容器安全的启动和退出,并平滑的加入网络给应用侧提供服务。
探测的状态
状态 | 描述 |
---|---|
Success | 容器通过探测 |
Failure | 容器不通过探测 |
Unknown | 探测失败(没有任何行为被反馈,kubelet 将进一步检查,这个一般是系统级别的错误) |
探测的机制
机制 | 描述 |
---|---|
exec | 在容器中执行指定指令。如果状态码返回 0,则代表检查成功。 |
grpc | 使用 gRPC 机制进行探测,如果响应状态为 SERVING ,则代表成功。 |
httpGet | http get 请求探测,返回代码大于等于200,小于400,代表探测成功。 |
tcpSocket | 探测 Pod 指定端口是否打开,如果能够连接,则代表成功,即使它立刻被服务端断开。 |
Startup 探测
Startup
是用来探测容器中的进程是否已经启动。如果提供了启动探测(startup probe),则其它两种探测将延后,直到它成功启动才可以开启下两种探测。如果启动探测失败,kubelet
将杀死容器,容器根据其重启策略进行重启。如果容器没有提供启动探测,则默认状态为成功Success
。下面使用exec
探测80端口是否启动,我延时10s 启动,会发现 Pod 在这期间虽然处于 Running 状态,但容器依旧显示没有准备好的状态,但 80 端口可以通过 IP 访问。
apiVersion: v1
kind: Pod
metadata:
name: pod-probe
namespace: default
labels:
app: probe
spec:
containers:
- name: startup-probe
image: k8s-test:v1.0
imagePullPolicy: IfNotPresent
startupProbe:
exec:
command:
- "/bin/sh"
- "-c"
- "curl http://localhost:80"
initialDelaySeconds: 10 # 容器启动后 10s 开始探测
periodSeconds: 20 # 执行探测的时间间隔为 20s
timeoutSeconds: 10 # 探针执行检测请求后,等待响应的超时时间为 10s
successThreshold: 1 # 成功 1 次算成功
failureThreshold: 3 # 失败 3 次算失败
root@k8s-master1:~# kubectl get pods -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-probe 0/1 Running 0 5s 10.244.194.113 k8s-worker1 <none> <none>
root@k8s-master1:~# curl 10.244.194.113
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Nginx Test</title>
</head>
<body>
Hello World
</body>
</html>
Readiness 探测
Readiness
探测用于检测容器中的进程是否可以接受请求,当探测成功后才将 Pod 对外提供网络访问,并将容器标记为就绪状态。可以加到 Pod 前端 Service,如果探测失败,则将容器标记为未就绪状态,会把 Pod 从前端 Service 中移除。
apiVersion: v1
kind: Pod
metadata:
name: pod-probe
namespace: default
labels:
app: probe
spec:
containers:
- name: readiness-probe
image: k8s-test:v1.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
readinessProbe:
httpGet:
port: 80
initialDelaySeconds: 30
Liveness 探测
Liveness 探测上述四种检测机制检测 Pod 中的容器是否正常运行。如果检测失败,则终止容器,并根据 Pod 中设置的重启策略来判断 Pod 是否需要进行重启操作。
apiVersion: v1
kind: Pod
metadata:
name: pod-probe
namespace: default
labels:
app: probe
spec:
containers:
- name: liveness-probe
image: k8s-test:v1.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
livenessProbe:
tcpSocket:
port: 80
periodSeconds: 5