我有一个由3个主节点和3个工作节点组成的Kubernetes集群,我想重新启动其中一个主节点来更新主机系统。
那么我可以直接在控制台上使用reboot
命令重启机器吗,
还是在重启之前需要执行一些步骤以避免服务中断和数据丢失的风险?
我有一个由3个主节点和3个工作节点组成的Kubernetes集群,我想重新启动其中一个主节点来更新主机系统。
那么我可以直接在控制台上使用reboot
命令重启机器吗,
还是在重启之前需要执行一些步骤以避免服务中断和数据丢失的风险?
如果你需要重启一个节点(例如内核升级、libc升级、硬件维修等),并且停机时间很短,当Kubelet重新启动时,它将尝试重新启动分配给它的Pod。如果重启时间较长(默认时间为5分钟,由控制器管理器上的“--pod-eviction-timeout”控制),则节点控制器将终止绑定到不可用节点的Pod。如果存在相应的副本集(或复制控制器),则会在另一个节点上启动新的Pod副本。因此,在所有Pod都有副本的情况下,可以进行升级而无需特殊协调,假设不是所有节点都会同时宕机。
如果您想更好地控制升级过程,可以使用以下工作流程:
使用kubectl drain优雅地终止节点上的所有Pod,并将节点标记为不可调度:
kubectl drain $NODENAME
kubectl uncordon $NODENAME
如果 ETCD
托管了 ETCD
,请备份数据。您可以使用内置命令来备份数据,如下所示:
ETCDCTL_API=3 etcdctl --endpoints=https://[127.0.0.1]:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key \
snapshot save /tmp/snapshot-pre-boot.db
kubectl drain <master01>
执行系统更新、打补丁并重启。
现在将节点解除集群隔离。
kubectl uncordon <master01>
Backup certificates:
$ sudo cp -r /etc/kubernetes/pki backup/
Make etcd snapshot:
$ sudo docker run --rm -v $(pwd)/backup:/backup \
--network host \
-v /etc/kubernetes/pki/etcd:/etc/kubernetes/pki/etcd \
--env ETCDCTL_API=3 \
k8s.gcr.io/etcd-amd64:3.2.18 \
etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt \
--key=/etc/kubernetes/pki/etcd/healthcheck-client.key \
snapshot save /backup/etcd-snapshot-latest.db
Backup kubeadm-config:
$ sudo cp /etc/kubeadm/kubeadm-config.yaml backup/
$ kubectl drain $NODENAME
kubectl drain命令一次只能针对一个节点。但是,您可以在不同的终端或后台运行多个kubectl drain命令来针对不同的节点并行执行。同时运行的多个drain命令仍将遵守您指定的PodDisruptionBudget。
3. 执行系统更新或补丁,并重新启动。
4. 最后将节点重新加入集群,请执行以下命令:
$ kubectl uncordon $NODENAME