Kubernetes Readiness 与 Liveness

Administrator
发布于 2024-11-26 / 20 阅读 / 0 评论 / 0 点赞

Kubernetes Readiness 与 Liveness

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 生命状态的问题。