有时候, 在实际生产过程中, etcd节点想要迁移或者etcd数据目录所在磁盘性能不足, 需要迁移节点或者目录。 有多种方法。今天列一个比较靠谱的方式, 保证数据的完整性

先来一波etcd的基础命令, 我这里是用kubeadm部署k8s集群

#####从容器中拷贝出来etcdctl 命令
docker cp $(docker ps  |  grep -v etcd-mirror | grep -w etcd | awk '{print $1}'):/usr/local/bin/etcdctl /usr/bin/

###查看etcd 集群成员列表
etcdctl --endpoints=https://10.34.0.66:2379,https://10.34.1.80:2379,https://10.34.3.61:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key member list

###查看endpoints 状态
etcdctl --endpoints=https://10.34.0.66:2379,https://10.34.1.80:2379,https://10.34.3.61:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key --write-out=table endpoint status

###查看etcd endpoints的健康
etcdctl --endpoints=https://10.34.0.66:2379,https://10.34.1.80:2379,https://10.34.3.61:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key --write-out=table endpoint health

###查看所有的key
ETCDCTL_API=3 etcdctl --endpoints=https://10.34.0.66:2379,https://10.34.1.80:2379,https://10.34.3.61:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key get / --prefix=true --keys-only

###查看某个key具体的内容(会有乱码,因为是序列化后的)
ETCDCTL_API=3 etcdctl --endpoints=https://10.34.0.66:2379,https://10.34.1.80:2379,https://10.34.3.61:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key get /registry/services/specs/liutest/nginx

从容器中把etcdctl工具复制出来到主机中的/usr/bin目录下

docker cp $(docker ps  |  grep -v etcd-mirror | grep -w etcd | awk '{print $1}'):/usr/local/bin/etcdctl /usr/bin/

备份etcd数据

etcdctl --endpoints 127.0.0.1:2379  \
--cert="/etc/kubernetes/pki/etcd/server.crt"  \
--key="/etc/kubernetes/pki/etcd/server.key"  \
--cacert="/etc/kubernetes/pki/etcd/ca.crt"   \
snapshot save etcd_snap_save.db

备份数据后, 将备份文件etcd_snap_save.db 传到三个节点

停止etcd

etcd恢复需要停止三个节点,不然会导致节点数据不一致, id无法加入集群中

mv /etc/kubernetes/manifests/etcd.yaml /opt/

导入备份数据至新目录

###其中 --name 和--initial-advertise-peer-urls 参数根据自己恢复节点修改成该节点的
主机名和IP,--data-dir 参数修改成自己想要的目录, etcd默认数据目录是/var/lib/etcd,
我这里迁移到/data/etcd 

ETCDCTL_API=3 etcdctl snapshot restore  etcd_snap_save.db  \
--cacert=/etc/kubernetes/pki/etcd/ca.crt  \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key  \
--data-dir=/data/etcd/   \
--endpoints=https://127.0.0.1:2379 \
--initial-cluster=k8s-master01=https://10.34.0.66:2380,k8s-master02=https://10.34.1.80:2380,k8s-master03=https://10.34.3.61:2380 \
--name=middleware02 \
--initial-advertise-peer-urls=https://10.34.1.80:2380

修改etcd.yaml文件

修改etcd.yaml文件中的数据目录配置
  - hostPath:
      path: /data/etcd    #改成自己的数据目录
      type: DirectoryOrCreate
    name: etcd-data

三个节点的文件全部修改完毕后, 再将文件放回原目录

mv /opt/etcd.yaml  /etc/kubernetes/manifests/

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐