Kubernetes 中 Readiness 与 Liveness
在 Kubernetes 中,Pod 有 readiness 和 liveness 两种探针检测,分别对应着就绪检测、存活检测。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-readness-liveness
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
readness: nginx
liveness: nginx
spec:
containers:
- name: nginx
image: docker.io/library/nginx:latest
imagePullPolicy: Never
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 30 # 30 秒后在进行检测
periodSeconds: 10 # 间隔 10 秒
failureThreshold: 3 # 重试 3 次
successThreshold: 1 # 成功 1 次就通过
timeoutSeconds: 2 # http 请求超时时间
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 30
periodSeconds: 10
failureThreshold: 3
successThreshold: 1
timeoutSeconds: 2
---
apiVersion: v1
kind: Service
metadata:
name: nginx-readness-liveness
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
readness: nginx
liveness: nginx
type: ClusterIP
Readiness 就绪检测
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 30
periodSeconds: 10
failureThreshold: 3
successThreshold: 1
timeoutSeconds: 2
执行完 apply 操作后发现,pod 状态并没有 running,与此同时 svc 也没有对接到 pod 的 ep 上,所以就绪检测实现了 Pod 运行状态、SVC 对接端口的一个判断,当服务没有就绪,无法通过svc访问后端。
由此发现,就绪检测不会杀死 Pod,只会操作 SVC 的绑定关系等操作。
[root@kubernetes ~]# kubectl apply -f readness.yaml
deployment.apps/nginx-readness-liveness created
service/nginx-readness-liveness created
[root@kubernetes ~]# kubectl get pod,svc,ep
NAME READY STATUS RESTARTS AGE
pod/nginx-readness-liveness-58c88b686f-chg6x 0/1 Running 0 7s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nginx-readness-liveness ClusterIP 10.254.30.57 <none> 80/TCP 7s
NAME ENDPOINTS AGE
endpoints/nginx-readness-liveness 7s
Liveness 存活检测
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 30
periodSeconds: 10
failureThreshold: 3
successThreshold: 1
timeoutSeconds: 2
执行完 apply 操作后发现,pod 直接 running 了,与此同时 svc 也对接对接到 pod 的 ep 上。但是如果接口不可用,此时 svc 已经代理了后端,会导致发送请求失败。
由此发现,存活检测不会干涉 K8S SVC 绑定操作。只作为 K8S 检测 Pod 存活与杀死 Pod 的一种手段。
[root@kubernetes ~]# kubectl apply -f readness.yaml
deployment.apps/nginx-readness-liveness created
service/nginx-readness-liveness created
[root@kubernetes ~]# kubectl get pod,svc,ep
NAME READY STATUS RESTARTS AGE
pod/nginx-liveness-79c549c67-gvwx5 1/1 Running 0 3s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nginx-liveness ClusterIP 10.254.171.30 <none> 80/TCP 3s
NAME ENDPOINTS AGE
endpoints/nginx-liveness 172.30.0.222:80 3s
总结
Readiness 与 Liveness 需要结合操作,一个负责处理 SVC 绑定的问题,一个处理 Pod 生命状态的问题。