Kubernetes 版本升级和宕机

Kubernetes Version Upgrades and Downtime

我刚刚测试了 Ranche RKE,将 kubernetes 13.xx 升级到 14.xx,在升级过程中,一个已经 运行 的 nginx Pod 在升级过程中重新启动了。这是预期的行为吗?

我们可以在用户 pods 不重启的情况下升级 Kubernetes 集群吗?

哪个工具支持不中断升级?

我们永远无法避免的停机时间有哪些? (除了控制平面)

Kubernetes 升级的默认方式是对节点进行滚动升级,一次一个。

这通过排空和封锁(将节点标记为对新部署不可用)每个正在升级的节点来工作,以便该节点上没有 pods 运行。

它通过在另一个节点上创建现有 pods 的新修订版(如果可用)并在新 pod 启动时 运行(并回答 readiness/health探测器),它会停止并删除正在升级的节点上的旧 pod(向每个 pod 容器发送 SIGTERM)。

Kubernetes 等待 pod 正常关闭的时间量由 pod 规范上的 terminationGracePeriodSeconds 控制,如果 pod 花费的时间超过该时间,它们将被 SIGKILL 杀死。

关键是,要顺利升级 Kubernetes,您需要有足够的可用节点,并且您的 pods 必须具有正确的活动性和就绪性探测(https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/)。

一些有趣的 material 值得一读:

https://cloud.google.com/blog/products/gcp/kubernetes-best-practices-upgrading-your-clusters-with-zero-downtime(特定于 GKE 但有一些见解)
https://blog.gruntwork.io/zero-downtime-server-updates-for-your-kubernetes-cluster-902009df5b33

通过在主机上配置容器运行时不在 docker 重启时重启容器来解决。