背景
生产etcd使用的版本(v3.5.1)出现了数据一致性问题
解决方案
永久
升级etcd到v3.5.9,当时最新版
临时
假设etcd集群可用,挑选一个etcd节点作为基准数据
在基准etcd节点上登录查看etcd的容器id
docker ps |grep etcd |grep -v pause
在基准etcd节点上查看member,找到其他member({containerID} 替换为上一步得到的容器id)
docker exec -it {containerID} ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key member list
在基准etcd节点上删除其他member({containerID} 替换为上一步得到的容器id,{memberid}替换为上一步得到的memberid)
docker exec -it {containerID} ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key member remove {memberid}
在目标member上停止etcd static pod
mv /etc/kubernetes/manifest/etcd.yaml /etc/kubernetes/etcd.yaml
在目标member上删除etcd数据(/data/etcd/member替换为实际的etcd data目录)
rm -rf /data/etcd/member
在基准etcd节点上添加目标member({containerID} 替换为上一步得到的容器id,{memberid}替换为上一步得到的memberid,{nodename}替换为实际的membername,nodeip替换为实际的memberip)
docker exec -it {containerID} ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key member add {membername} --peer-urls=htttps://{memberip}:2380
在故障节点上
在目标member上启动etcd static pod
mv /etc/kubernetes/etcd.yaml /etc/kubernetes/manifest/etcd.yaml
注意点
删除和添加member的步骤逐个member执行,否则会导致集群不可用
网友评论