- etcd 集群出现了故障,节点启动会有如下报错,一般是 member 信息不匹配,导致了集群异常,无法重启 etcd 集群
member count is unequal
本集预告
如果 etcd 有做过 snapshot
快照,可以直接新建一套集群,直接还原快照即可,有时候没有快照,或没来的及快照,集群已经出现了问题,此时可以通过保留的 etcd data
数据目录下的文件,配合新 etcd 集群,使用 member update 可以在保留 etcd 数据的情况下初始化集群数据,重新构建
etcd 集群 无论是 kubeadm 还是 二进制 的 k8s ,都可以通过这种方式来灾难恢复 etcd 集群,并且早期发现,在 pod
没有重启的情况下,也不会影响正在运行的 pod [ 会影响 master 组件的运行,因为 etcd 集群宕机,apiserver
服务会挂,也就无法使用 kubectl 命令管理 k8s 集群,当然,也无法使用 api 的方式,毕竟 apiserver 的端口也关了 ]
备份数据目录
kubeadm 安装的,默认 etcd 数据目录在 /var/lib/etcd 目录下,二进制部署的,要查看 service 文件指定的
–data-dir 参数指向的路径 对比一下,哪个目录最大,就备份哪个,目录最大的,数据最新
cp -r /var/lib/etcd/member /var/lib/member-bak
停止所有 etcd 服务
-
如果是 二进制 部署的,只需要 systemctl stop etcd 即可,当然,以自己实际的环境为准,也许你的 service
文件配置的不是 etcd.service kubeadm 部署的,只需要把 etcd.yaml 从 manifests 目录下移走即可 -
kubeadm 默认部署的路径是 /etc/kubernetes,记得检查自己的环境是否也是这个路径,不要只管 cv,啥也不看
mv /etc/kubernetes/manifests/etcd.yaml /etc/kubernetes/
检查 etcd 是否都已经关闭
#这个方法只适合 kubeadm 部署的 k8s 环境,二进制的,需要通过 'ps -ef | grep etcd' 命令查看 etcd 进程是否还存在来验证
docker ps -a | grep etcd
创建新 etcd 节点
切记,先配置并启动一个节点的 etcd,要等这个单节点 etcd 启动成功后,再做后面的节点加入操作
如果是修复数据,可以在原节点操作,并且不需要使用 member update 命令 如果是做 etcd 数据迁移,配置好新节点的一个
etcd 节点即可,数据迁移需要使用 member update 命令
单节点 etcd
如果是 二进制 etcd,需要修改 service 文件 如果是 kubeadm 部署的 k8s ,需要修改前面移走的 etcd.yaml
文件,然后放到 manifests 目录下来启动 etcd注意以下配置,修改之前先备份一份, service 文件也记得备份,我的环境是 kubeadm
的,懒得搞一个二进制环境了,理解思路才是最重要的
cp etcd.yaml{,.bak}
vim etcd.yaml
增加 --force-new-cluster 参数,这个参数,在 etcd 单节点启动成功后,再删掉,然后重启 etcd
这个参数的意义是强制删除集群中的所有成员,并把自己加入到集群成员中
增加 --initial-cluster-state=new 参数
new - 成员设置为 new,而不是加入已有集群
existing - 成员加入已有 etcd 集群
spec:
containers:
- command:
- etcd
- --advertise-client-urls=https://192.168.11.135:2379
- --cert-file=/etc/kubernetes/pki/etcd/server.crt
- --client-cert-auth=true
- --data-dir=/var/lib/etcd
- --initial-advertise-peer-urls=https://192.168.11.135:2380
- --initial-cluster=master-01=https://192.168.11.135:2380
- --key-file=/etc/kubernetes/pki/etcd/server.key
- --listen-client-urls=https://127.0.0.1:2379,https://192.168.11.135:2379
- --listen-metrics-urls=http://127.0.0.1:2381
- --listen-peer-urls=https://192.168.11.135:2380
- --name=master-01
- --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt
- --peer-client-cert-auth=true
- --peer-key-file=/etc/kubernetes/pki/etcd/peer.key
- --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
- --snapshot-count=10000
- --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
# 主要是这两个参数,上面的以自己环境的为准,都配置为当前节点的 ip,和自己的证书路径
- --initial-cluster-state=new
- --force-new-cluster
启动 etcd 服务,切记,就启动一个节点,其他节点,等这个单节点启动成功后,需要修改配置才可以加入到这个单节点的 etcd,然后才能组成一套集群
cp /etc/kubernetes/etcd.yaml /etc/kubernetes/manifests/
查看 etcd 是否启动成功
二进制部署的,可以看进程或者端口,kubeadm 部署的,使用下面的方式
docker ps -a | grep etcd
查看 member 信息
本地如果没有 etcdctl 命令,可以从容器内复制一个 [ 二进制部署的,一般都自带 etcdctl命令,如果没有的话,下载一个二进制文件就可以了 ]
docker cp $(docker ps | awk '/etcd --/ {print $1}'):/usr/local/bin/etcdctl /etc/kubernetes/pki/etcd/etcdctl
chmod +x /etc/kubernetes/pki/etcd/etcdctl
cd /etc/kubernetes/pki/etcd/
# ip 和证书改为自己环境的配置,切莫纯 cv
./etcdctl \
--cacert ./ca.crt \
--cert ./server.crt \
--key ./server.key \
--endpoints https://192.168.11.135:2379 \
member list
可以看到,peerurl 的 ip 和 server 的 ip 是不一样的
cde66358cffbaacf, started, master-01, https://192.168.11.131:2380, https://192.168.11.135:2379, false
执行 member update 命令来更新 peerurl 的地址
# ip 和证书改为自己环境的配置,member id 也已自己上面的命令获取的为准,切莫纯 cv
./etcdctl \
--cacert ./ca.crt \
--cert ./server.crt \
--key ./server.key \
--endpoints https://192.168.11.135:2379 \
member update cde66358cffbaacf --peer-urls=https://192.168.11.135:2380
删除 -force-new-cluster 参数,避免下次 etcd
重启的时候,集群成员被初始化,这里就不留下我的操作足迹了,但是大家一定一定要记得删掉这个参数,然后重启 etcd
将其他成员加入到 etcd 集群
下面的操作,还是继续在已经启动的这个单节点的 etcd 机器上操作,也可以在其他节点操作,只要有证书,有 etcdctl
命令,哪里都可以操作
# ip 和证书改为自己环境的配置,切莫纯 cv
./etcdctl \
--cacert ./ca.crt \
--cert ./server.crt \
--key ./server.key \
--endpoints https://192.168.11.135:2379 \
member add master-02 --peer-urls=https://192.168.11.133:2380
准备加入的节点,记得 etcd 的 data 目录下不要有数据
下面的操作在 需要加入 etcd 成员的节点操作
确保 data 目录为空
rm -rf /var/lib/etcd/member/*
vim etcd.yaml
增加 --initial-cluster-state=new 参数 new - 成员设置为 new,而不是加入已有集群 existing -
成员加入已有 etcd 集群
spec:
containers:
- command:
- etcd
- --advertise-client-urls=https://192.168.11.133:2379
- --cert-file=/etc/kubernetes/pki/etcd/server.crt
- --client-cert-auth=true
- --data-dir=/var/lib/etcd
- --initial-advertise-peer-urls=https://192.168.11.133:2380
- --initial-cluster=master-02=https://192.168.11.133:2380,master-01=https://192.168.11.135:2380
# 需要增加这个参数,切记,不能是 new,要是 existing,不然 etcd 会起不来
- --initial-cluster-state=existing
- --key-file=/etc/kubernetes/pki/etcd/server.key
- --listen-client-urls=https://127.0.0.1:2379,https://192.168.11.133:2379
- --listen-metrics-urls=http://127.0.0.1:2381
- --listen-peer-urls=https://192.168.11.133:2380
- --name=master-02
- --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt
- --peer-client-cert-auth=true
- --peer-key-file=/etc/kubernetes/pki/etcd/peer.key
- --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
- --snapshot-count=10000
- --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
重启 etcd ,查看 etcd 是否正常
# ip 和证书改为自己环境的配置,切莫纯 cv
./etcdctl \
--cacert ./ca.crt \
--cert ./server.crt \
--key ./server.key \
--endpoints https://192.168.11.135:2379 \
member list
可看到,两个节点都是 started 状态了,如果还有节点需要加入,重复执行成员加入 etcd 集群的操作即可
47785658ea2ca7f0, started, master-02, https://192.168.11.133:2380, https://192.168.11.133:2379, false
cde66358cffbaacf, started, master-01, https://192.168.11.135:2380, https://192.168.11.135:2379, false