即使就绪探测失败,部署能否完成
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
。
- 应用
headless service
- 在
statefulSet
中评论 readyness
探测并应用清单
- 观察到所有 pods 都是在前一个 pod 是
running and ready
之后创建的
- 取消注释
readyness
探测并应用清单
- 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
可以设置为Parallel
。 Pod Management Policies
有用的链接:
我在 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
。
- 应用
headless service
- 在
statefulSet
中评论readyness
探测并应用清单 - 观察到所有 pods 都是在前一个 pod 是
running and ready
之后创建的
- 取消注释
readyness
探测并应用清单 - 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
可以设置为Parallel
。 Pod Management Policies