我正在关注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
吗?
答案 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)
设置为比所需数量的副本少一个,它就可以逐个移动您的广告连播。