在从服务端点移除之前,让Kubernetes等待Pod终止

时间:2016-10-25 09:21:18

标签: kubernetes

根据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

2 个答案:

答案 0 :(得分:1)

也许您应该考虑使用headless service而不是使用ClusterIP。这样您的应用程序将使用实际端点IP发现,并且从端点列表中删除不会在关闭期间中断可用性,但会从发现中删除(或从nginx contrib中的入口控制器后端删除)

答案 1 :(得分:1)

不幸的是,kubernetes 旨在在 prestop 钩子启动的同时从端点中删除 Pod。告诉我们your link to the kubernetes docs

<块引用>

在 kubelet 开始正常关闭的同时, 控制平面从端点中删除正在关闭的 Pod

这个google kubernetes docs说得更清楚了:

<块引用>
  1. Pod 设置为“终止”状态并从 所有服务的端点列表

还有一个 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