kubectl drain 没有驱逐 helm memcached pods

kubectl drain not evicting helm memcached pods

我正在关注 this guide,试图在不停机的情况下升级 GKE 上的 kubernetes 集群。我已经封锁了所有旧节点并且大多数 pods 已被驱逐,但对于几个节点,kubectl drain 只是保持 运行ning 而不再驱逐 pods.

kubectl get pods --all-namespaces -o=wide 显示少数 pods 仍然 运行ning 在旧池中,当我 运行 kubectl drain --ignore-daemonsets --force 它打印一条警告解释原因它忽略了其中的大部分;它唯一没有提到的是 pods 我有 运行ning memcached,它是使用 this chart.

通过 helm 创建的

我们不太依赖 memcached,所以我现在可以继续删除旧节点池并接受该服务的短暂停机时间。但我更希望有一个脚本来以正确的方式完成整个事情,如果这些 pods 正在做更重要的事情,我现在不知道该怎么做。

那么,这是某种预期的行为吗?是否有关于使这些 pods 拒绝被驱逐的掌舵图?我需要将另一个 force/ignore 类型的标志传递给 kubectl drain 吗?

您链接的 helm 图表包含一个 PodDisruptionBudget (PDB)。 kubectl drain 不会删除 pods 如果它会违反 PDB(参考:https://kubernetes.io/docs/concepts/workloads/pods/disruptions/,"How Disruption Budgets Work" 部分提到了这一点)。

如果 PDB 上的 minAvailable 等于 Pod 的副本数,您将无法耗尽该节点。鉴于 https://github.com/kubernetes/charts/blob/master/stable/memcached/values.yaml 都设置为 3,我猜这很可能是您问题的根源。只需将您的 PDB minAvailable 设置为比所需副本数少一个,它将能够一个接一个地移动您的 pods。