另类 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)
就大功告成了!
后续博文:
参考资料: