即使就绪探测失败,部署能否完成

Can a deployment be completed even when readiness probe is failing

我在 Kubernetes 中有一个 运行ning 作为 StatefulSet 启动 2 pods 的应用程序。它已经配置了一个 liveness 探测器和一个 readiness 探测器。

liveness probe 调用一个简单的 /health 端点,该端点在服务器完成加载时做出响应

readiness probe,等待一些启动作业完成。在某些情况下,该作业可能需要几分钟,只有当它完成时,应用程序的 api 才准备好开始接受请求。

即使 api 不可用,我的应用程序也会 运行 不依赖于它的副业,我希望它们也能在启动时完成。

是否可以强制 Kubernetes 部署完成并部署 2 pods,即使就绪探测仍未通过?

从文档中我了解到,就绪探测未通过的唯一影响是当前 pod 不会作为可用的包含在负载均衡器服务中(这实际上是我想要的唯一效果)。

If the readiness probe fails, the endpoints controller removes the Pod's IP address from the endpoints of all Services that match the Pod.

但是我也看到部署永远不会完成,因为 pod 1 就绪探测没有通过并且 pod 2 从未被创建。

kubectl rollout restart statefulset/pod
kubectl get pods 
NAME                            READY   STATUS    RESTARTS   AGE
pod-0                           1/2     Running   0          28m

如果就绪探测失败,始终阻止部署,是否有其他方法可以选择性地仅在负载均衡器中公开就绪 pods,同时在部署期间不将它们标记为未就绪?

提前致谢!

StatefulSet 部署

Is it possible to force kubernetes deployment to complete and deploy 2 pods, even when the readiness probe is still not passing?

假设它的意思是 statefulSet 而不是 deployment 作为对象,答案是否定的,这在设计上是不可能的,最重要的是第二点:

  • 对于具有 N 个副本的 StatefulSet,在部署 Pods 时,它们是按顺序创建的,从 {0..N-1} 开始。
  • 在将缩放操作应用于 Pod 之前,其所有前任都必须 运行 且就绪。
  • 当Pods被删除时,它们以相反的顺序终止,从{N-1..0}开始。

When the nginx example above is created, three Pods will be deployed in the order web-0, web-1, web-2. web-1 will not be deployed before web-0 is Running and Ready, and web-2 will not be deployed until web-1 is Running and Ready

StatefulSets - Deployment and scaling guaranties

准备情况调查、端点和潜在的解决方法

If the readiness probe failure, always prevent the deployment, Is there other way to selectively expose only ready pods in the load balancer, while not marking them as Unready during the deployment?

这是设计使然,pods 一旦处于 ready 状态就被添加到服务端点。

可以使用某种潜在的解决方法,至少在简单的示例中它确实有效,但是您应该尝试评估这种方法是否适合您的情况,这可以用作初始部署。

statefulSet 可以在不包含 readyness 探测的情况下启动,这样 statefulSet 将在前一个为 run and ready 时一个接一个地启动 pods,liveness 可能需要设置 initialDelaySeconds 这样 kubernetes 就不会认为它不健康而重新启动 pod。一旦 statefulSet 完全 运行 并准备就绪,您可以将 readyness 探测器添加到 statefulSet.

添加 readyness 探测器后,kubernetes 将从最后一个开始重新启动所有 pods,您的应用程序将需要重新启动。

想法是启动所有 pods,它们将能够同时处理请求 +-,而应用 readyness 探测后,例如​​ 5 分钟内只会启动一个 pod , 下一个 pod 将需要 5 分钟,依此类推。

例子

基于 nginx 网络服务器和 sleep 30 命令查看发生了什么的简单示例,这使得 kubernetes 在设置 readyness 探测器时认为 pod 是 not ready

  1. 应用headless service
  2. statefulSet 中评论 readyness 探测并应用清单
  3. 观察到所有 pods 都是在前一个 pod 是 running and ready
  4. 之后创建的
  5. 取消注释 readyness 探测并应用清单
  6. Kubernetes 将从最后一个开始重新创建所有 pods 这次等待 readyness 探测完成并将 pod 标记为 running and ready.

使用这个命令查看进度非常方便:

watch -n1 kubectl get pods -o wide

nginx-headless-svc.yaml:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx

nginx-statefulset.yaml:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  serviceName: "nginx"
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
          name: web
        command: ["/bin/bash", "-c"]
        args: ["sleep 30 ; echo sleep completed ;  nginx -g \"daemon off;\""]
        readinessProbe:
          tcpSocket:
            port: 80
          initialDelaySeconds: 1
          periodSeconds: 5

更新

感谢@jesantana 提供了这个更简单的解决方案。

如果需要一次性安排所有pods,不需要等待pods就绪,.spec.podManagementPolicy可以设置为ParallelPod Management Policies

有用的链接: