etcd集群恢复
etcd 概述
etcd
是 CoreOS
团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库
。
etcd
内部采用 raft
协议作为一致性算法,etcd
基于Go
语言实现。
完全复制
:集群中的每个节点都可以使用完整的存档高可用性
:Etcd可用于避免硬件的单点故障或网络问题一致性
:每次读取都会返回跨多主机的最新写入简单
:包括一个定义良好、面向用户的API(gRPC)安全
:实现了带有可选的客户端证书身份验证的自动化TLS快速
:每秒10000次写入的基准速度可靠
:使用Raft算法实现了强一致、高可用的服务存储目录
ETCD 集群运维相关的基本知识:
- 读写端口为:
2379
, 数据同步端口:2380
ETCD集群
是一个分布式系统
,使用Raft协议
来维护集群内各个节点状态的一致性。- 主机状态
Leader
,Follower
,Candidate
- 当集群初始化时候,每个节点都是
Follower
角色,通过心跳与其他节点同步数据
- 通过
Follower
读取数据,通过Leader
写入数据 - 当
Follower
在一定时间内没有收到来自主节点
的心跳,会将自己角色改变为Candidate
,并发起一次选主投票
- 配置etcd集群,建议尽可能是
奇数个节点
,而不要偶数个节点
,推荐的数量为 3、5 或者 7 个节点构成一个集群。 - 使用 etcd 的内置备份/恢复工具从源部署备份数据并在新部署中恢复数据。恢复前需要清理数据目录
- 数据目录下
snap
: 存放快照数据,etcd防止WAL文件过多而设置的快照,存储etcd数据状态。 - 数据目录下
wal
: 存放预写式日志,最大的作用是记录了整个数据变化的全部历程。在etcd中,所有数据的修改在提交前,都要先写入到WAL中。 - 一个 etcd 集群可能不应超过七个节点,写入性能会受影响,建议运行五个节点。一个 5 成员的 etcd 集群可以容忍两个成员故障,三个成员可以容忍1个故障。
常用配置参数:
ETCD_NAME
节点名称,默认为defaulETCD_DATA_DIR
服务运行数据保存的路ETCD_LISTEN_PEER_URLS
监听的同伴通信的地址,比如http://ip:2380,如果有多个,使用逗号分隔。需要所有节点都能够访问,所以不要使用 localhostETCD_LISTEN_CLIENT_URLS
监听的客户端服务地址ETCD_ADVERTISE_CLIENT_URLS
对外公告的该节点客户端监听地址,这个值会告诉集群中其他节点ETCD_INITIAL_ADVERTISE_PEER_URLS
对外公告的该节点同伴监听地址,这个值会告诉集群中其他节ETCD_INITIAL_CLUSTER
集群中所有节点的信息ETCD_INITIAL_CLUSTER_STATE
新建集群的时候,这个值为new
;假如加入已经存在的集群,这个值为existing
ETCD_INITIAL_CLUSTER_TOKEN
集群的ID,多个集群的时候,每个集群的ID必须保持唯一
静态 Pod方式 集群备份恢复
查看集群状况
/root/etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
--endpoints=https://192.168.148.128:2379,https://192.168.148.129:2379,https://192.168.148.130:2379 \
-w table endpoint status
备份etcd
ETCDCTL_API=3; ./etcdctl snapshot save fengjian.db --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key
etcd恢复故障
1. 删除apiserver etcd 静态pod
# 三台master 都进行操作 [root@master1 ~]# cd /etc/kubernetes [root@master1 ~]# mkdir bak [root@master1 ~]# mv manifests/* bak
2. 删除etcd 目录
#三台master 同时操作 rm /var/lib/etcd -rf
3. master逐台恢复etcd
#master1 /root/etcdctl snapshot restore /root/fengjian.db --name master1 --cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key --cacert=/etc/kubernetes/pki/etcd/ca.crt \
--endpoints=https://127.0.0.1:2379 --initial-advertise-peer-urls=https://192.168.148.128:2380 \
--initial-cluster=master1=https://192.168.148.128:2380,master2=https://192.168.148.129:2380,master3=https://192.168.148.130:2380 \
--data-dir=/var/lib/etcd #master2 /root/etcdctl snapshot restore /root/fengjian.db --name master2 --cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key --cacert=/etc/kubernetes/pki/etcd/ca.crt \
--endpoints=https://127.0.0.1:2379 --initial-advertise-peer-urls=https://192.168.148.129:2380 \
--initial-cluster=master1=https://192.168.148.128:2380,master2=https://192.168.148.129:2380,master3=https://192.168.148.130:2380 \
--data-dir=/var/lib/etcd
#master3 /root/etcdctl snapshot restore /root/fengjian.db --name master3 --cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key --cacert=/etc/kubernetes/pki/etcd/ca.crt \
--endpoints=https://127.0.0.1:2379 --initial-advertise-peer-urls=https://192.168.148.130:2380 \
--initial-cluster=master1=https://192.168.148.128:2380,master2=https://192.168.148.129:2380,master3=https://192.168.148.130:2380 \
--data-dir=/var/lib/etcd
注释:以下参数从etcd yaml文件中获取
--initial-advertise-peer-urls --initial-cluster
再次查看etcd状态
/root/etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key --endpoints=https://192.168.148.128:2379,https://192.168.148.129:2379,https://192.168.148.130:2379 \
-w table endpoint statu
还原etcd apiserver等静态pod
# 三台master 都进行操作 [root@master1 ~]# cd /etc/kubernetes [root@master1 ~]# mkdir bak [root@master1 ~]#cp bak/* manifests/
查看集群状态
kubectl get node kubectl get pod -n kube-system