kubectl drain不驱逐helm memcached pods

时间:2018-01-05 23:46:15

标签: kubernetes kubernetes-helm

我正在关注this guide,试图在没有停机时间的情况下升级GKE上的kubernetes集群。我已经将所有旧节点封锁,并且大部分吊舱已经被驱逐,但是对于几个节点,kubectl drain只是继续运行而不是驱逐任何更多的吊舱。

kubectl get pods --all-namespaces -o=wide显示了一些仍然在旧池上运行的pod,当我运行kubectl drain --ignore-daemonsets --force时,它会打印一个警告,解释为什么它忽略了大部分内容;唯一没有提到的是我运行memcached的pod,它是使用this chart通过helm创建的。

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

那么,这种预期的行为是不是以某种方式?那个掌舵图是否有些东西让这些豆荚拒绝被驱逐?我需要传递给kubectl drain吗?

还有另一种力/忽略的旗帜吗?

1 个答案:

答案 0 :(得分:1)

您链接的头盔图包含PodDisruptionBudget(PDB)。 kubectl drain如果违反了PDB,则minAvailable将不会删除广告连播(参考:https://kubernetes.io/docs/concepts/workloads/pods/disruptions/,“中断预算如何工作”一节提到这一点)。

如果您的PDB上的minAvailable等于您的广告连播的副本数量,您将无法消耗该节点。鉴于https://github.com/kubernetes/charts/blob/master/stable/memcached/values.yaml都设置为3,我猜这很可能是你问题的根源。只需将您的PDB const express = require('express') const request = require('request') const moment = require('moment') const app = express() app.get('/', (req, res) => { request('http://localhost/sleep.php', (error, response, body) => { res.send('get data at ' + moment().format()) }) }) app.listen(3000) 设置为比所需数量的副本少一个,它就可以逐个移动您的广告连播。