记录一次因为 IP 变更导致集群故障的修复过程。有两个集群,一个是单节点(allinone),另一个是四节点(3 master 1 node)的集群。
1. 更新 Etcd 证书
【在每个 Etcd 节点】备份 Etcd 证书
1
cp -R /etc/ssl/etcd/ssl /etc/ssl/etcd/ssl-bak
查看 Etcd 证书中的域
1
2
3
openssl x509 -in /etc/ssl/etcd/ssl/node-node1.pem -noout -text|grep DNS
DNS:etcd, DNS:etcd.kube-system, DNS:etcd.kube-system.svc, DNS:etcd.kube-system.svc.cluster.local, DNS:localhost, DNS:node1, IP Address:127.0.0.1, IP Address:0:0:0:0:0:0:0:1, IP Address:x.x.x.1
sed -i "s/$oldip1/$newip1/" /etc/etcd.env
sed -i "s/$oldip2/$newip2/" /etc/etcd.env
sed -i "s/$oldip3/$newip3/" /etc/etcd.env
/etc/hosts 也需要替换 IP,因为有时配置文件中使用的是主机名。
1
2
3
sed -i "s/$oldip1/$newip1/" /etc/hosts
sed -i "s/$oldip2/$newip2/" /etc/hosts
sed -i "s/$oldip3/$newip3/" /etc/hosts
如果有定时备份任务,也需要替换下相关 IP。
1
2
3
sed -i "s/$oldip1/$newip1/" /usr/local/bin/kube-scripts/etcd-backup.sh
sed -i "s/$oldip2/$newip2/" /usr/local/bin/kube-scripts/etcd-backup.sh
sed -i "s/$oldip3/$newip3/" /usr/local/bin/kube-scripts/etcd-backup.sh
【每个 Etcd 节点】从备份中恢复 Etcd 数据
如果是单节点的 Etcd 可以跳过此步骤。由于节点 IP 发生变化,Etcd 集群已经无法运行。多节点 Etcd 需要使用备份数据才能够恢复,这是因为 Etcd 的节点信息被存在磁盘数据中,仅修改配置文件并没有用。
find /etc/kubernetes -type f | xargs sed -i "s/$oldip1/$newip1/"find /etc/kubernetes -type f | xargs sed -i "s/$oldip2/$newip2/"find /etc/kubernetes -type f | xargs sed -i "s/$oldip3/$newip3/"find /etc/kubernetes -type f | xargs sed -i "s/$oldip4/$newip4/"
1
2
3
4
sed -i "s/$oldip1/$newip1/" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
sed -i "s/$oldip2/$newip2/" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
sed -i "s/$oldip3/$newip3/" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
sed -i "s/$oldip4/$newip4/" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
1
2
3
4
sed -i "s/$oldip1/$newip1/" /etc/kubernetes/kubeadm-config.yaml
sed -i "s/$oldip2/$newip2/" /etc/kubernetes/kubeadm-config.yaml
sed -i "s/$oldip3/$newip3/" /etc/kubernetes/kubeadm-config.yaml
sed -i "s/$oldip4/$newip4/" /etc/kubernetes/kubeadm-config.yaml
1
2
3
4
sed -i "s/$oldip1/$newip1/" /etc/hosts
sed -i "s/$oldip2/$newip2/" /etc/hosts
sed -i "s/$oldip3/$newip3/" /etc/hosts
sed -i "s/$oldip4/$newip4/" /etc/hosts
【在一个 master 节点】生成证书
1
rm -f /etc/kubernetes/pki/apiserver*
1
kubeadm init phase certs all --config /etc/kubernetes/kubeadm-config.yaml
【每个 Kubernetes 节点】将生成的证书分发到节点上
node 节点不需要 key,只需要 crt。
3. 更新集群组件的 Conf 文件
【在一个 master 节点】生成新的配置文件
1
2
cd /etc/kubernetes
rm -f admin.conf kubelet.conf controller-manager.conf scheduler.conf
1
kubeadm init phase kubeconfig all --config /etc/kubernetes/kubeadm-config.yaml