k8s-etcd

发布时间 2023-03-22 21:15:57作者: yuanbangchen
etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。
etcd内部采用raft协议作为一致性算法,etcd基于Go语言实现。


Etcd具有下面这些属性:
完全复制:集群中的每个节点都可以使用完整的存档
高可用性:Etcd可用于避免硬件的单点故障或网络问题
一致性:每次读取都会返回跨多主机的最新写入
简单:包括一个定义良好、面向用户的API(gRPC)
安全:实现了带有可选的客户端证书身份验证的自动化TLS
快速:每秒10000次写入的基准速度
可靠:使用Raft算法实现了存储的合理分布Etcd的工作原理



启动脚本说明
cat /etc/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
Documentation=https://github.com/coreos
[Service]
Type=notify
WorkingDirectory=/var/lib/etcd/     #数据保存目录
ExecStart=/usr/bin/etcd \             #二进制文件路径
--name=etcd1 \                         #当前node 名称
--cert-file=/etc/etcd/ssl/etcd.pem \
--key-file=/etc/etcd/ssl/etcd-key.pem \
--peer-cert-file=/etc/etcd/ssl/etcd.pem \
--peer-key-file=/etc/etcd/ssl/etcd-key.pem \
--trusted-ca-file=/etc/kubernetes/ssl/ca.pem \
--peer-trusted-ca-file=/etc/kubernetes/ssl/ca.pem \
--initial-advertise-peer-urls=https://192.168.7.105:2380 \                 #通告自己的集群端口
--listen-peer-urls=https://192.168.7.105:2380 \                         #集群之间通讯端口
--listen-client-urls=https://192.168.7.105:2379,http://127.0.0.1:2379 \ #客户端访问地址
--advertise-client-urls=https://192.168.7.105:2379 \                     #通告自己的客户端端口
--initial-cluster-token=etcd-cluster-0 \                                 #创建集群使用的token,一个集群内的节点保持一致
--initial-cluster=etcd1=https://192.168.7.105:2380,etcd2=https://192.168.7.106:2380,etcd3=https://192.168.7.107:2380 \ #集群所有的节点信息
--initial-cluster-state=new \         #新建集群的时候的值为new,如果是已经存在的集群为existing。
--data-dir=/var/lib/etcd             #数据目录路径
Restart=on-failure
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target


etcd有多个不同的API访问版本,v1版本已经废弃,etcd v2 和 v3 本质上是共享同一套 raft 协议代码的两个独立的应用,接口不一样,存储不一样,数据互相隔离。
也就是说如果从 Etcd v2 升级到 Etcd v3,原来v2 的数据还是只能用 v2 的接口访问,v3 的接口创建的数据也只能访问通过 v3 的接口访问。
[root@localhost7B ansible]# ETCDCTL_API=3 etcdctl  --help


验证当前etcd所有成员状态:
root@k8s-etcd1:~# export NODE_IPS="192.168.80.180 192.168.80.190 192.168.80.200"
root@k8s-etcd1:~# for ip in ${NODE_IPS}; do ETCDCTL_API=3  /usr/bin/etcdctl --endpoints=https://${ip}:2379 --cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/etcd/ssl/etcd.pem --key=/etc/etcd/ssl/etcd-key.pem endpoint health; done

查看etcd数据信息:
root@k8s-etcd1:~# ETCDCTL_API=3 etcdctl get / --prefix --keys-only #以路径的方式所有key信息
root@k8s-etcd1:~# ETCDCTL_API=3 etcdctl get / --prefix --keys-only #以路径的方式所有key信息
root@k8s-etcd1:~# ETCDCTL_API=3 etcdctl get --prefix /calico #查看etcd中calico的相关数据



etcd增删改查数据:

#添加数据
root@k8s-etcd2:~# ETCDCTL_API=3 /usr/bin/etcdctl put /testkey "test for linux36"
OK

#查询数据
root@k8s-etcd2:~# ETCDCTL_API=3 /usr/bin/etcdctl get /testkey
/testkey
test for linux36

#改动数据,#直接覆盖就是更新数据
root@k8s-etcd2:~# ETCDCTL_API=3 /usr/bin/etcdctl put /testkey "test for linux36-new" 
OK

#验证改动
root@k8s-etcd2:~# ETCDCTL_API=3 /usr/bin/etcdctl get /testkey
/testkey
test for linux36-new

#删除数据
root@k8s-etcd2:~# ETCDCTL_API=3 /usr/bin/etcdctl del /testkey
1
root@k8s-etcd2:~# ETCDCTL_API=3 /usr/bin/etcdctl get /testkey


etcd数据watch机制:
基于不断监看数据,发生变化就主动触发通知客户端,Etcd v3 的watch机制支持watch某个固定的key,也支持watch一个范围。
相比Etcd v2, Etcd v3的一些主要变化:
    接口通过grpc提供rpc接口,放弃了v2的http接口,优势是长连接效率提升明显,缺点是使用不如以前方便,尤其对不方便维护长连接的场景。
    废弃了原来的目录结构,变成了纯粹的kv,用户可以通过前缀匹配模式模拟目录。
    内存中不再保存value,同样的内存可以支持存储更多的key。
    watch机制更稳定,基本上可以通过watch机制实现数据的完全同步。
    提供了批量操作以及事务机制,用户可以通过批量事务请求来实现Etcd v2的CAS机制(批量事务支持if条件判断)。

watch测试:
#在etcd node1上watch一个key,没有此key也可以执行watch,后期可以再创建:
root@k8s-etcd2:~# ETCDCTL_API=3 /usr/bin/etcdctl watch /testkey
#在etcd node2修改数据,验证etcd node1是否能够发现数据变化
root@k8s-etcd1:~# ETCDCTL_API=3 /usr/bin/etcdctl put /testkey "test for linux36-new"
OK



etcd数据备份与恢复机制:
WAL是write ahead log的缩写,顾名思义,也就是在执行真正的写操作之前先写一个日志。
wal: 存放预写式日志,最大的作用是记录了整个数据变化的全部历程。在etcd中,所有数据的修改在提交前,都要先写入到WAL中



V2版本帮助信息:root@k8s-etcd2:~# /usr/bin/etcdctl backup --help
V2版本备份数据:
root@k8s-etcd2:~# ETCDCTL_API=2 etcdctl backup --data-dir /var/lib/etcd/ --backup-dir  /opt/etcd_backup
2019-07-11 18:59:57.674432 I | wal: segmented wal file
/opt/etcd_backup/member/wal/0000000000000001-0000000000017183.wal is created

V2版本恢复数据:
etcd --data-dir=/var/lib/etcd/default.etcd --force-new-cluster &


vim /etc/systemd/system/etcd.service
.....
--data-dir=/opt/etcd_backup -force-new-cluster #强制设置为为新集群





etcd v3版本数据备份与恢复:
root@k8s-etcd2:~# ETCDCTL_API=3 etcdctl snapshot save snapshot.db
V3版本恢复数据:
root@k8s-etcd2:~# ETCDCTL_API=3 etcdctl snapshot restore snapshot.db --data-dir=/opt/etcd-testdir #将数据恢复到一个新的不存在的目录中



#自动备份数据
root@k8s-etcd2:~# mkdir /data/etcd-backup-dir/ -p
root@k8s-etcd2:~# cat script.sh
#!/bin/bash
source /etc/profile
DATE=`date +%Y-%m-%d_%H-%M-%S`
ETCDCTL_API=3 /usr/bin/etcdctl snapshot save /data/etcd-backup-dir/etcd-snapshot-${DATE}.db