ETCD
etcd是一个高可用分布式键值数据库,etcd内部采用raft协议作为一致性算法,基于go语言开发
etcd有如下属性:
- 完全复制:集群中每个节点都可以使用完整的存档
- 高可用性:etcd可用于避免单点故障
- 一致性:每次读取都会返回跨多主机的最新写入
- 简单: 有定义良好、面相用户的API(gRPC)
- 安全:实现了带有可选的客户端证书身份验证的自动化TLS
- 快速: 美妙10000次写入的基准速度
- 可靠:使用Raft算法实现了存储的合理分布etcd的工作原理
kubeadm reset 命令则会讲etcd内的所有数据清空,慎重使用
etcd默认存放位置: /var/lib/etcd/member/snap/db
etcd数据碎片整理命令,很少用:
etcdctl defrag --cluster --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常用命令
# 查看集群节点信息
etcdctl member list
# 查看集群节点健康状态
etcdctl endpoint health
# 查看集群节点状态,如哪些是leader等
etcdctl --write-out=table endpoint status
# 查看etcd里的所有数据
etcdctl get / --prefix --keys-only
# 查看指定数据信息
etcdctl get /registry/services/specs/default/demoapp
# 删除指定资源
etcdctl get /registry/services/specs/default/demoapp
# 上传和修改数据
etcdctl put /node01 192.168.139.20
# etcd数据备份命令
etcdctl snapshot save /data/backup/etcd-backup.db
# etcd数据恢复命令
etcdctl snapshot restore /data/backup/etcd-backup.db --data-dir=/opt/etcd-data # 需将数据恢复到不存在的目录中
etcd数据恢复流程
当etcd集群宕机数量超过集群总数节点一半以上的时候,整个集群将会宕机,重新恢复数据的大致流程如下:
- 1、恢复操作系统
- 2、重新部署etcd集群
- 3、停止kube-apiserver/controller-manager/scheduler/kubelet/kube-proxy
- 4、停止etcd服务
- 5、各个etcd节点恢复同一份备份数据
- 6、启动各etcd节点并验证etcd集群
- 7、启动kube-apiserver/controller-manager/scheduler/kubelet/kube-proxy
- 8、验证k8s集群状态以及pod数据
基于Velero实现k8s的数据备份与恢复
Velero是用于备份和恢复 Kubernetes 集群资源和PV的开源项目
- 基于Velero CRD创建备份(Backup)和恢复作业(Restore)可以备份或恢复集群中的几乎所有对象,也可以按类型、名称空间或标签过滤对象
- 支持基于文件系统备份(File System Backup,简称FSB)备份Pod卷中的数据,并借助于restic或kopia上传到对象存储系统上
- 支持基于快照备份PV,这种方式较之FSB能确保文件的一致性;它支持两种操作
仅创建PV快照
创建PV快照,并借助于restic或kopia上传到对象存储系统上 - 使用对象存储作为备份数据的存储目标,并基于对象存储上的备份对象完成数据恢复
基于存储提供商插件同各种存储系统集成
支持的Provider列表:https://velero.io/docs/main/supported-providers/
备份流程:
velero backup create myserver-ns-backup-${DATE} --include-namespaces myserver --kubeconfi=~/.kubeconfig --namespace velero-system
对象存储minio部署
准备将备份的数据存储到minio,找一台部署了docker的主机即可启动minio服务
docker pull minio/minio:RELEASE.2025-05-24T17-08-30Z
mkdir -p /data/minio
# 运行minio容器,默认指定密码,默认密码为minioadmin/minioadmin
# 9000为客户端传输数据需要的端口,9999为浏览器页面访问端口
docker run --name minio -p 9000:9000 -p 9999:9999 -d --restart=always -e "MINIO_ROOT_USER=admin" -e "MINIO_ROOT_PASSWORD=12345678" -v /data/minio/data:/data minio/minio:RELEASE.2025-05-24T17-08-30Z server /data --console-address '0.0.0.0:9999'
# 需要登录minio控制台,创建一个velerodata的bucket
部署velero
# 1、在k8s的master节点上下载velero客户端
wget https://ghfast.top/https://github.com/vmware-tanzu/velero/releases/download/v1.16.1/velero-v1.16.1-linux-amd64.tar.gz
tar xvf velero-v1.16.1-linux-amd64.tar.gz
mv velero /usr/local/bin/
# 2、部署velero服务端
mkdir /data/velero -p
vim /data/velero/velero-auth.txt
[default]
aws_access_key_id = admin
aws_secret_access_key = 12345678
# velero CLI是一个多功能的应用程序,它有着众多的可用子命令。其中的install命令即用于部署Velero至Kubernetes集群上。
# 提示:velero CLI基于kubeconfig文件认证到Kubernetes集群,它搜索和加载kubeconfig的方式与kubectl类似。
velero install --secret-file=/data/velero/velero-auth.txt --provider=aws --bucket=velerodata --backup-location-config region=minio,s3ForcePathStyle=true,s3Url=http://192.168.139.24:9000 --plugins=velero/velero-plugin-for-aws:v1.12.1 --use-volume-snapshots=true --snapshot-location-config region=minio --use-node-agent --uploader-type=kopia --namespace velero
--provider:用于保存备份和卷数据的Provider的名称;Velero支持多种Provider,不同的Provider通常需要依赖专用的插件
--plugins:要加载的插件列表,各插件是引用的Image的名称
--backup-location-config:保存备份的存储系统的具体信息,格式为“key1=value1,key2=value2”
--snapshot-location-config:保存PV快照的存储系统的具体信息,格式为“key1=value1,key2=value2”
--use-volume-snapshots:是否自动创建用于保存快照的snapshot location,默认为true--secret-file:保存有认证到存储系统的认证凭据的文件
--bucket:远端对象存储系统上用于保存备份信息的bucket
--use-node-agent:是否创建用于部署node agent的DaemonSet,它们负责基于Restic或Kopia上传卷和快照中的数据至远端存储系统;
--uploader-type:上传数据使用的uploader,可用值为Restic或Kopia
# 部署完成后,运行如下命令,可以了解到其创建的资源对象。
kubectl get all -n velero
# 部署完成后,velero install还会创建多个CRD,这可以通过如下命令了解相关的信息。
kubectl api-resources --api-group=velero.io
使用velero备份数据
# 最为简单的格式就是仅给出Backup名称,如下所示,它将创建名为mykube的Backup对象,备份整个集群,并保存于安装Velero时创建的默认的保存位置,它通常是一个名为default的BackupStorageLocation对象
velero backup create all-cluster-20250604
# 备份default名称空间的数据到minio中
velero backup create default-20250604 --include-namespaces default --namespace velero
# 查看备份历史,其中的STATUS字段代表着备份作业的状态,InProgress表示正在进行中,备份执行完成后将转为Completed
velero backup get
# 若需要打印Backup对象的详细信息,可通过“velero backup describe”命令进行,如下面的命令所示。
velero backup describe default-20250604
# 删除Backup对象,可通过“velero backup delete”命令进行
velero backup delete default-20250604
# 若要一次性删除所有备份对象,使用如下命令
velero backup delete --all
# 如下命令可用于打印Backup对象的详细日志信息,这对于排查错误、验证备份任务细节等特别有帮助
velero backup logs
使用velero恢复(restore)数据
Velero的恢复任务由Restore资源对象负责完成。管理Restore资源对象的可用方式类似于Backup,可由kubectl命令基于对象配置文件进行,或者使用“velero restore create”命令完成。
创建和使用Restore
#恢复误删除的default名称空间的资源
velero restore create --from-backup default-20250604
# 该命令会创建一个Restore资源对象来执行恢复过程,相关的对象的信息,可由如下命令列出
velero restore get
# 若需要打印该Restore对象的详细信息,可使用如下命令
velero restore describe
# 打印日志信息命令
velero restore logs
# “velero restore create”命令还可多个选项,用于帮助用户仅恢复备份集中的部分内容,例如特定的名称空间、特定类型的资源等。
--include-namespaces:从备份中恢复的名称空间列表,默认为“*”,即备份中存在的所有名称空间;
--exclude-namespaces:从备份中进行恢复作业时,要排除的名称空间列表;
--include-resources:从备份中要恢复的资源类型,格式为“resouce.group”,例如“daemonsets.apps”,默认为“*”,即恢复备份集中的所有类型的资源对象;
--exclude-resources:执行恢复操作时要排除的资源类型;
-l, --selector:基于标签选择器来指定要恢复的资源对象;
--namespace-mappings:给恢复的名称空间重命令,格式为“src1:dst1,src2:dst2,...”;
--restore-volumes:是否要从相关的快照中恢复卷,默认为true
作者:于浩 创建时间:2025-06-04 14:45
最后编辑:于浩 更新时间:2025-06-10 18:08
最后编辑:于浩 更新时间:2025-06-10 18:08