根据Termination of Pods,第7步与3同时发生。有什么方法可以防止这种情况发生,只有在<{em> Pod
的优雅之后才会发生终止(或宽限期到期)?
我需要这样做的原因是我的Pod
终止例程要求my-service-X.my-namespace.svc.cluster.local
在整个过程中解析为Pod
的IP,但相应的{{1}我在Endpoint
/ kubectl delete
上运行Pod
后立即删除。
注意:如果有助于明确这一点,我正在运行一堆集群的VerneMQ(Erlang)节点,这些节点在终止时将其内容转储到集群上的其他节点 - 因此在整个终止过程中需要正确解析节点名称。只有这样才能删除相应的Deployment
。
答案 0 :(得分:1)
也许您应该考虑使用headless service而不是使用ClusterIP。这样您的应用程序将使用实际端点IP发现,并且从端点列表中删除不会在关闭期间中断可用性,但会从发现中删除(或从nginx contrib中的入口控制器后端删除)
答案 1 :(得分:1)
不幸的是,kubernetes 旨在在 prestop 钩子启动的同时从端点中删除 Pod。告诉我们your link to the kubernetes docs:
<块引用>在 kubelet 开始正常关闭的同时, 控制平面从端点中删除正在关闭的 Pod
这个google kubernetes docs说得更清楚了:
<块引用>还有一个 feature request for that. 未被识别。
面向掌舵用户的解决方案
但是如果您使用 helm,则可以使用 hooks(例如预删除、预升级、预回滚)。不幸的是,这个 helm hook 是一个额外的 pod,无法访问所有 pod 资源。
这是一个钩子的例子:
apiVersion: batch/v1
kind: Job
metadata:
name: graceful-shutdown-hook
annotations:
"helm.sh/hook": pre-delete,pre-upgrade,pre-rollback
labels:
app.kubernetes.io/name: graceful-shutdown-hook
spec:
template:
spec:
containers:
- name: graceful-shutdown
image: busybox:1.28.2
command: ['sh', '-cx', '/bin/sleep 15']
restartPolicy: Never
backoffLimit: 0