etcd是coreos团队在2013年6月发起的开源项目,现在在githab上托管

etcd目标构建一个高可用的分布式键值数据库

kubernetes etcd 备份 etcd备份还原原理_centos

 

etcd具有以下属性:

    完全复制:集群中的每个节点都可以使用完整的存档

    高可用性:etcd可用于避免硬件的单点故障或网络问题

    一致性:每次读取都会返回跨多主机的最新写入

    简单:包括一个定义料号、面向多用户的API

    安全:实现了带有可选的客户端证书身份验证自动化TLS

    快速:每秒10000次写入的基准速度

    可靠:使用Raft你发su实现了存储的合理分布Etcd的工作原理

 

etcd集群:复制式集群,竟像式集群,坏掉集群一半以内的节点没有问题

 

etcd.service文件说明:

kubernetes etcd 备份 etcd备份还原原理_centos_02

/us/local/bin/etcd:二进制文件路径

--name:节点名称,集群内节点名称不能重复

--initial-advertise-peer-urls:集群间会通告,此为通告地址,声明节点端口,2380集群中使用,2379客户端使用

--listen-client-urls:给客户端使用的

--initial-cluster-token:初始化集群token,集群内的节点token需要一致

--initial-cluster:集群中所有的节点name需要写进去,逗号间隔

--snapshot-count:快照的数量上限

--auto-compaction-retention=1:第一次压缩等待1小时,以后每次1小时%10=6分钟压缩一次

--auto-compaction-mode=periodic:模式是周期性压缩

--max-request-bytes:每次请求的最大字节数,默认一个key最大为1.5M

--quota-backend-bytes:存储空间大小限制,超过限制后会有警告

 

检测本机心跳:

etcdctl endpoint health

 

集群节点心跳检测:

export node_etcd="192.168.213.11 192.168.213.12 192.168.213.13"; for i in $node_etcd; do ETCDCTL_API=3 /usr/local/bin/etcdctl --endpoints=https://${i}:2379 --cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/kubernetes/ssl/etcd.pem --key=/etc/kubernetes/ssl/etcd-key.pem endpoint health; done

 

以表格的形式输出成员

/usr/local/bin/etcdctl --write-out=table member list --endpoints=https://192.168.213.11:2379 --cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/kubernetes/ssl/etcd.pem --key=/etc/kubernetes/ssl/etcd-key.pem 

 

集群碎片整理:

ETCDCTL_API=3 /usr/local/bin/etcdctl defrag --cluster --endpoints=https://192.168.213.11:2379 --cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/kubernetes/ssl/etcd.pem --key=/etc/kubernetes/ssl/etcd-key.pem 

 

表格输出集群成员详细信息

export node_etcd="192.168.213.11 192.168.213.12 192.168.213.13"; for i in $node_etcd; do ETCDCTL_API=3 /usr/local/bin/etcdctl --endpoints=https://${i}:2379 --cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/kubernetes/ssl/etcd.pem --key=/etc/kubernetes/ssl/etcd-key.pem --write-out=table endpoint status; done

 

etcd增删改查:

查询:

    etcdctl get / --keys-only --prefix

        查看所有的key,只看前缀

写:

    etcdctl put /test_key "192.168.213.11"

        在根下创建一个test_key,值为192.168.213.11

删除:

    etcdctl del /test_key

        删除根下的test_key数据,此操作绕过apiserver,慎用!!

 

watch机制:基于不断监看数据,发生变化就主动触发客户端通知,watch机制支持某一个key,也支持一个范围

  

kubernetes etcd 备份 etcd备份还原原理_客户端_03

  

kubernetes etcd 备份 etcd备份还原原理_centos_04

  

kubernetes etcd 备份 etcd备份还原原理_API_05

    

 

#####################################快照备份&恢复#########################################

etcdctl snapshot save /opt/etcd_test.db #快照备份

######快照恢复#######

#--data-dir指定的恢复目录可以为空,但是一定不能有数据

##################实战演练##################

创建三个pod

kubectl run net-test1 --image=centos:7.9.2009 sleep 10000000

kubectl run net-test2 --image=centos:7.9.2009 sleep 10000000

kubectl run net-test3 --image=centos:7.9.2009 sleep 10000000

kubernetes etcd 备份 etcd备份还原原理_客户端_06

etcdctl snapshot save /opt/etcd_test_new.db #创建快照

kubectl delete pod net-test3

kubernetes etcd 备份 etcd备份还原原理_centos_07

systemctl stop etcd

tar -zcvf /home/wyh/etcd.tar.gz /var/lib/etcd #备份原目录

rm -rf /var/lib/etcd #删除原目录

etcdctl snapshot restore /opt/etcd_save_new.db  --data-dir=/var/lib/etcd #快照还原

kubernetes etcd 备份 etcd备份还原原理_API_08

 

##########################################快照备份恢复结束########################################

 

######################################使用kubeasz备份并恢复#################################

cd /etc/kubeasz

./ezctl backup k8s-cluster1

#执行成功后备份文件会放在/etc/kubeasz/clusters/k8s-cluster1/backup(这个备份不单单备份etcd)

#产生两个文件snapshot.db(如果此文件存在再次备份,会更新掉次文件,恢复数据也是根据此文件恢复)和snapshot_202207290935.db(按照你备份生成时间)

./ezctl restore k8s-cluster1 #根据/etc/kubeasz/clusters/k8s-cluster1/backup/snapshot.db恢复数据

 

##比较保守的一种方法

######################################kubeasz备份恢复完成####################################

kubernetes etcd 备份 etcd备份还原原理_API_09