随着 Kubernetes 被越来越多企业所采用,逐渐成为云原生应用部署和运维的标准。Kubernetes 的不断更新和迭代也是不可避免的。本文将深入探讨 Kubernetes 升级的方案以及实践经验总结,为大家提供指导意义。
Kubernetes 升级方案
Kubernetes 升级主要有两种方式:在线升级(In-place upgrade)和离线升级(Out-of-place upgrade)。
在线升级
在线升级是指在 Kubernetes 集群运行的同时,对集群进行升级。这种方式的优点是可以保持集群的运行状态,并且升级时间相对较短。但是在实践中会面临较多的挑战和限制:
- 平滑度不高:在线升级可能会破坏 Kubernetes 集群的平滑运行状态,导致 Pod 重启或迁移,影响业务性能。
- 行业规范要求不支持在线升级:一些合规性规定可能不允许在线升级。
- 安全隐患:在线升级的过程中,Kubernetes 集群已经运行一段时间,可能会出现一些安全隐患,让黑客有更多的机会攻击。
不过,如果你的 Kubernetes 集群能够适应在线升级,你只需要对 kubeadm 工具链进行相应的命令执行,即可完成集群的在线升级。详细步骤可参考官方文档:
$ export VERSION=$(curl -sSL https://dl.k8s.io/release/stable.txt) $ sudo kubeadm upgrade apply v$VERSION $ sudo systemctl daemon-reload $ sudo systemctl restart kubelet
离线升级
离线升级是指把 Kubernetes 集群全部下线,然后对每个节点进行升级,再将节点重新加入集群的过程。这种方式的主要优点是安全、可控、可恢复。但是需要停止集群服务,一定程度上会影响业务。
离线升级的方案流程如下:
备份 etcd 数据库: etcd 是 Kubernetes 的数据储存设施,离线升级时需要先备份 etcd 数据表,以免数据丢失。
准备升级镜像: 下载并上传所有需要的 Kubernetes 二进制文件和容器镜像。
升级 master 节点: 运行 Kubernetes 集群的控制中心 master 节点的升级需要直接运行二进制文件和控制命令升级而无需重新构建 Docker 镜像。
升级 worker 节点: 对 worker 节点逐一停止,并使用新的容器镜像,再逐一启动新的 worker 节点。
升级 kubectl: kubectl 是 Kubernetes 的命令行管理工具,需要与集群升级到同一版本。
升级 kubelet 和 kubeadm: 最后将 kubelet 和 kubeadm 升级到与 Kubernetes 版本相同的最新版本。
实践经验总结
除了升级方案本身,还有升级时的注意事项需要特别说明。
1. 升级 readiness probe
在升级过程中,需要确保 readiness probe 在升级节点时正常工作,否则将导致 Pod 无法正常运行。这可以通过在 Pod 启动时添加 --graceful-period 参数或使用 Lifecycle Hook 机制解决。
2. 调整调度器
升级后的 Kubernetes 可能会改变 API 版本和其他元素,需要重新配置调度器。在升级,必须对调度器配置进行适当的调整,并在继续升级之前切换标记来确保任何尚未被适当安排的 Pod 保持在原地。
3. 完全离线升级
有时候,离线升级需要完全离线,不能从互联网下载资料。这个时候,需要在升级过程中正确地缓存文件,并在集群内部使用。
以下是一个示例脚本用于 Kubernetes 离线升级:
#!/bin/bash set -u set -e systemctl stop kubelet kubeadm upgrade apply --config kubeadm-config.yml systemctl up kubelet
在另一个机器上运行以下命令。它将为 Kubernetes 离线升级生成必要的文件和目录。
kubeadm config images pull --kubernetes-version 1.X.Y # 其中1.X.Y表示你的目标版本 docker save `kubeadm config images list --kubernetes-version 1.X.Y` -o kubernetes_images.tar
然后将导出的文件和文件夹拷贝到离线环境下的 /var/cache/kubernetes/ 文件夹内。
4. 清理镜像
升级完成后,需要删除旧版本 Kubernetes 镜像,以节省磁盘空间。
$ docker image rm k8s.gcr.io/kube-apiserver-amd64:v1.X.Y $ docker image rm k8s.gcr.io/kube-controller-manager-amd64:v1.X.Y $ docker image rm k8s.gcr.io/kube-scheduler-amd64:v1.X.Y $ docker image rm k8s.gcr.io/kube-proxy-amd64:v1.X.Y $ docker image rm k8s.gcr.io/pause-amd64:3.0 $ docker image rm k8s.gcr.io/etcd-amd64:3.1.12 $ docker image rm k8s.gcr.io/coredns:1.1.3
5. 备份 etcd 数据库
备份 etcd 数据库是一个十分重要的步骤,以免升级过程中出现数据丢失。备份 etcd 数据库有很多种方法,例如使用命令行工具 etcdctl。
$ etcdctl backup --data-dir /var/lib/etcd --backup-dir /var/lib/etcd-backup
结论
Kubernetes 升级一直是大家关注的话题,无论是在线升级还是离线升级,都存在一定的挑战。为了保证 Kubernetes 的高可用性和稳定性,在升级前需要仔细规划和测试,确保升级过程安全可控。同时,在升级过程中需要不断清理和调整,以避免不必要的错误和风险。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6531fed57d4982a6eb41cb84