etcd是一个key-value模式(1key1值)的分布式数据库,由GO语言开发;
etcd具有以下属性
1.完全复制性:集群中每个节点都可以使用完整的存档;
2.高可用性:
3.一致性:每次读取都会返回跨多主机的最新写入;
4.简单:包括一个定义良好的面向用户API;
5.安全:实现了带有可选客户端证书身份验证的自动化TLS;
6.快速:每秒1W次的写入速度;
7.可靠:使用raft算法实现了存储合理分布;
设备选型:
非负重情况:2-4C,8G内存;
负重情况:8-16C,16-64G内存;
对磁盘要求很高,尽量使用SSD,网络最好使用万兆网络,至少要是千兆,并且不要让网络保证在高负载情况;
以下硬件示例,仅供参考,通常使用时会比示例需求提高一倍;
etcd的service文件,默认位置etcd节点的/etc/systemd/system/etcd.service。service文件生效的前提,首先保证书写内容没有问题,其次是保证WorkingDirectory(工作目录)和ExecStart(二进制文件目录)位置不要出错;
etcd.service文件示例:
1 [Unit]
2 Description=Etcd Server
3 After=network.target
4 After=network-online.target
5 Wants=network-online.target
6 Documentation=https://github.com/coreos
8 [Service]
9 Type=notify
10 WorkingDirectory=/var/lib/etcd
11 ExecStart=/usr/local/bin/etcd \
12 --name=etcd-192.168.1.35 \ #当前节点名称,每个etcd节点名称必须不同;
13 --cert-file=/etc/kubernetes/ssl/etcd.pem \ #cert认证文件位置;
14 --key-file=/etc/kubernetes/ssl/etcd-key.pem \ #key文件位置;
15 --peer-cert-file=/etc/kubernetes/ssl/etcd.pem \
16 --peer-key-file=/etc/kubernetes/ssl/etcd-key.pem \
17 --trusted-ca-file=/etc/kubernetes/ssl/ca.pem \
18 --peer-trusted-ca-file=/etc/kubernetes/ssl/ca.pem \
19 --initial-advertise-peer-urls=https://192.168.1.35:2380\ #etcd集群通告地址;
20 --listen-peer-urls=https://192.168.1.35:2380\
21 --listen-client-urls=https://192.168.1.35:2379,http://127.0.0.1:2379\ #客户端访问地址;
22 --advertise-client-urls=https://192.168.1.35:2379\ #客户端通告地址;
23 --initial-cluster-token=etcd-cluster-0 \ #创建集群时使用的token,集群中的节点此项要保持一致;
24 --initial-cluster=etcd-192.168.1.35=https://192.168.1.35:2380\ #etcd集群内部所有节点的名称和地址信息,名称需要和--name参数相同;
25 --initial-cluster-state=new \ #集群状态;
26 --data-dir=/var/lib/etcd \ #数据目录;
27 --wal-dir= \ #日志目录;
28 --snapshot-count=50000 \ #快照数量;
29 --auto-compaction-retention=1 \ #对数据进行压缩的周期,默认单位是小时;
30 --auto-compaction-mode=periodic \
31 --max-request-bytes=10485760 \ #客户端最大请求字节数上限;
32 --quota-backend-bytes=8589934592 #在etcd中可存储的最大pod元数据信息数量;
33 Restart=always
34 RestartSec=15
35 LimitNOFILE=65536
36 OOMScoreAdjust=-999
37
38 [Install]
39 WantedBy=multi-user.target
# export NODE_IPS="192.168.1.35" #声明etcd节点IP地址;
# for ip in ${NODE_IPS}; do ETCDCTL_API=3 /usr/local/bin/etcdctl --endpoints=https://${ip}:2379 --cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/kubernetes/ssl/etcd.pem --key=/etc/kubernetes/ssl/etcd-key.pem endpoint health; done #调用声明的IP,测试etcd状态,显示心跳信息,任意etcd节点都可以使用;
# for ip in ${NODE_IPS}; do ETCDCTL_API=3 /usr/local/bin/etcdctl --write-out=table member list --endpoints=https://${ip}:2379 --cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/kubernetes/ssl/etcd.pem --key=/etc/kubernetes/ssl/etcd-key.pem endpoint health; done #功能同上,只是以表格格式输出;
# etcdctl endpoint health #检查本机集群心跳信息;
# ETCDCTL_API=3 /usr/local/bin/etcdctl defrag --cluster --endpoints=https://192.168.1.35:2379--cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/kubernetes/ssl/etcd.pem --key=/etc/kubernetes/ssl/etcd-key.pem #整理集群存储碎片,可以略微提升读取速度,建议低峰期使用;
# for ip in ${NODE_IPS}; do ETCDCTL_API=3 /usr/local/bin/etcdctl --write-out=table endpoint status --cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/kubernetes/ssl/etcd.pem --key=/etc/kubernetes/ssl/etcd-key.pem; done #列表方式输出etcd集群中,各节点信息;
etcd的增删改查,注意这些操作正常应该由K8S来执行,此处只是介绍命令和用法,非特殊不推荐在生产节点上执行;
# etcdctl get #查询;
# etcdctl put #修改;
# etcdctl del #删除,危险;
etcd的watch机制,基于不断监控数据,发生变化就主动发送触发通知客户端,Etcd v3的watch机制可以基于某一个固定的key,也支持watch一个范围;
etcd备份和恢复:
etcd的备份是使用快照机制来执行的;
etcd v3 版本中存在一个wal(write ahead log)预写日志,其功能是,在真正写入操作执行之前,先将操作写入此日志。wal记录了整个数据变化的全部历程;
wal默认存放位置:/var/lib/etcd/member/wal/,这个路径位置是在/etc/systemd/system/etcd.service中声明的;
/var/lib/etcd/member/snap/db #存放的是etcd集群序列化后的数据;
# etcdctl snapshot save #创建快照;
操作:
# mkdir /tmp/etcd_snapshot #创建快照保存路径;
# time=$(date "+%Y-%m-%d_%H:%M:%S") #配置变量获取当前日期时间,中间连接符不要出现/;
# echo $time #查看变量结果,进行确认;
# etcdctl snapshot save /tmp/etcd_snapshot/192.168.1.35_$time.db #创建拥有对应日期时间的快照,此处因为时区不对,所获取的时间不对,所以在配置整个集群时需要先进行时间的修改;

通常备份操作在整个etcd集群中任意节点备份一次即可,并需要将快照移动到可靠的文件存储设备中;
# etcdctl snapshot restore #恢复快照;
操作:
# etcdctl snapshot restore /tmp/etcd_snapshot/192.168.1.35_2022-11-27_06\:54\:16.db --data-dir="/tmp/etcd-test" #通过快照恢复;

# etcdctl snapshot status #后需要跟随具体参数,进行快照查询;
ezctl也提供了一个备份数据的方式:etcdctl snapshot save的备份方式仅适合单一节点,但如果我们是个etcd集群那么就要用到ezctl所提供的模式;
操作:
# ezctl backup k8s-cluster.1 #对k8s-cluster.1集群进行备份;

备份后文件位置/etc/kubeasz/clusters/k8s-cluster.1/backup
root@deploy:/etc/kubeasz/clusters/k8s-cluster.1/backup# ls /etc/kubeasz/clusters/k8s-cluster.1/backup/
snapshot_202211270738.db snapshot.db
snapshot.db不带时间戳的文件即使最新备份文件;
# kubectl delete pod net-test2 -n myserver #删除net-test2测试容器;
# ezctl restore k8s-cluster.1 #对k8s-cluster.1集群进行恢复,使用的快照默认是不带时间戳的snapshot.db;

/etc/kubeasz/roles/cluster-restore/tasks/main.yml #这个文件中可以看出快照恢复操作的步骤;
- name: 停止ectd 服务
service: name=etcd state=stopped
- name: 清除etcd 数据目录
file: name={{ ETCD_DATA_DIR }}/member state=absent
- name: 生成备份目录
file: name=/etcd_backup state=directory
- name: 准备指定的备份etcd 数据
copy:
src: "{{ cluster_dir }}/backup/{{ db_to_restore }}"
dest: "/etcd_backup/snapshot.db"
- name: 清理上次备份恢复数据
file: name=/etcd_backup/etcd-{{ inventory_hostname }}.etcd state=absent
- name: etcd 数据恢复
shell: "cd /etcd_backup && \
ETCDCTL_API=3 {{ bin_dir }}/etcdctl snapshot restore snapshot.db \
--name etcd-{{ inventory_hostname }} \
--initial-cluster {{ ETCD_NODES }} \
--initial-cluster-token etcd-cluster-0 \
--initial-advertise-peer-urls https://{{ inventory_hostname }}:2380"
- name: 恢复数据至etcd 数据目录
shell: "cp -rf /etcd_backup/etcd-{{ inventory_hostname }}.etcd/member {{ ETCD_DATA_DIR }}/"
- name: 重启etcd 服务
service: name=etcd state=restarted
- name: 以轮询的方式等待服务同步完成
shell: "systemctl is-active etcd.service"
register: etcd_status
until: '"active" in etcd_status.stdout'
retries: 8
delay: 8
网友评论