另类 k8s 集群灾难恢复方法:用 master 服务器镜像恢复出新集群

我们的生产环境 kubernetes 集群是用阿里云服务器自己搭建的高可用集群(详见之前的博文),这篇博文记录的是如何通过已有集群的1台 master 服务器的阿里云ECS镜像恢复出同样配置的新集群,kubernetes 版本是 1.17.0。

这台 master 服务器的主机名是 k8s-master0,IP地址是 10.0.1.81。

首先对 k8s-master0 服务器打快照并生成镜像,用这个镜像创建新的服务器,新服务器的 hostname 也要用 k8s-master0(如果要换主机名,参考博文),新服务器 IP 地址为10.0.9.171。

通过镜像创建新集群主要面临的是 IP 地址变化带来的问题,为了解决这个问题,需要进行以下几个操作:

1)替换 /etc/kubernetes 中与 IP 地址关联的配置

oldip=10.0.1.81
newip=10.0.9.171
cd /etc/kubernetes

find . -type f | xargs grep $oldip
find . -type f | xargs sed -i "s/$oldip/$newip/"
find . -type f | xargs grep $newip

2)给 etcd 启动命令添加参数(不需要该步骤)

打开 /etc/kubernetes/manifests/etcd.yaml,给command 添加

--initial-cluster-state=new
--force-new-cluster

3)通过 iptables 将旧 IP 地址映射到新 IP 地址(不需要该步骤)

iptables -t nat -A OUTPUT -d 10.0.1.81 -j DNAT --to-destination 10.0.9.171

4)修改 /etc/hosts 中涉及旧 IP 地址的解析(如果有)

vim /etc/hosts
%s/10.0.1.81/10.0.9.171 

5)修改集群配置与旧 IP 地址相关的配置

kubectl -n kube-system edit cm kubeadm-config 
%s/10.0.1.81/10.0.9.171

修改好 IP 地址之后,重新生成 etcd-server 证书(这个证书与IP地址关联)
重新生成相关 ssl 证书(etcd-server, apiserver, apiserver-kubelet-client, front-proxy-client)

cd /etc/kubernetes/pki/etcd
rm server.crt server.key
kubeadm init phase certs etcd-server
rm apiserver.crt apiserver.key
kubeadm init phase certs apiserver --control-plane-endpoint "k8s-api:6443"
rm apiserver-kubelet-client.crt apiserver-kubelet-client.key
kubeadm init phase certs apiserver-kubelet-client
rm front-proxy-client.crt front-proxy-client.key
kubeadm init phase certs front-proxy-client

更新当前用户的 .kube/config

cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

重启 kubelet 与 docker 服务之后集群就可以恢复

systemctl restart kubelet && systemctl restart docker

这时通过 kubectl get nodes 命令可以看到 k8s-master0 处于 Ready 状态(注:如果新 master 服务器使用的是不同的主机名,k8s-master0 会显示 NotReady)

接着去掉之前在 /etc/kubernetes/manifests/etcd.yaml 中给 etcd 启动命令添加的参数(需要重启 kubelet 与 docker 服务使修改生效)(不需要该步骤)

--initial-cluster-state=new
--force-new-cluster

最后生成 node 加入集群的命令

$ kubeadm token create --print-join-command

通过新生成的命令加入新的 node

kubeadm join k8s-api:6443 --token ***** --discovery-token-ca-cert-hash *****

并删除所有旧的 NotReady 状态的 node

kubectl delete node $(kubectl get nodes | grep NotReady | cut -d " " -f1)

就大功告成了!

后续博文:

参考资料:

posted @ 2021-01-13 21:24  dudu  阅读(870)  评论(1编辑  收藏  举报