admin管理员组

文章数量:1607692

文章目录

    • @[toc]
    • 一、etcd 概述
    • 二、安装etcdctl工具
    • 三、kubeadm部署方式部署
      • 1)备份
      • 2)恢复
    • 四、定时备份
    • 五、二进制部署备份
      • 1)备份
      • 2)恢复
        • 1、停止apiserver和etcd
        • 2、etcd_1恢复
        • 3、etcd_2恢复
        • 4、etcd_3恢复
        • 5、启动etcd和apiserver
        • 6、检查集群
    • 六、安装velero
      • 1)Velero简介
      • 2)工作流程
      • 3)整体流程
      • 4)nfs持久卷
      • 5)安装Velero
      • 6)安装minio
        • 1、官方地址
        • 2、部署yaml
        • 3、创建ID和key
        • 4、创建备份桶
        • 5、测试访问
      • 7)安装velero服务端
    • 七、部署测试应用
      • 1)部署测试服务
      • 2)编写测内容
    • 八、测试备份
      • 1)备份总结
        • 1、备份分类
        • 2、备份最佳实践
        • 3、同步机制
        • 4、坑
      • 2)备份
      • 3)定时备份
    • 八、恢复
    • 九、集群数据迁移
    • 十、参考地址

一、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​​ 节点名称,默认为defaul
  • ​​ETCD_DATA_DIR​​ 服务运行数据保存的路
  • ​​ETCD_LISTEN_PEER_URLS​​ 监听的同伴通信的地址,比如http://ip:2380,如果有多个,使用逗号分隔。需要所有节点都能够访问,所以不要使用 localhost
  • ​​ETCD_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必须保持唯一

二、安装etcdctl工具

【官网】https://github/etcd-io/etcd/releases

#查看版本号
cat /etc/kubernetes/manifests/etcd.yaml |grep image
#输入版本号:v3.5.4

$ install_etcdctl.sh
#!/bin/bash
read -p "输入·etcd的版本号": VERSION
ETCD_VER=$VERSION
ETCD_DIR=etcd-download
DOWNLOAD_URL=https://ghproxy/github/coreos/etcd/releases/download

# 下载
cd /usr/local
mkdir ${ETCD_DIR}
cd ${ETCD_DIR}
rm -rf *
wget ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz 
tar -xzvf etcd-${ETCD_VER}-linux-amd64.tar.gz

# 安装etcdctl
cd etcd-${ETCD_VER}-linux-amd64

#重命名,便于识别
cp etcdctl  /usr/local/bin/

#删除安装数据目录
cd /usr/local&& rm -rf ${ETCD_DIR}

#添加环境变量
echo "ETCDCTL_API=3" >>/etc/profile

#查看版本
etcdctl  version
chmod o+x install_etcdctl.sh
sh install_etcdctl.sh
输入:v3.5.4

三、kubeadm部署方式部署

基本了解:

  • K8s 使用etcd数据库实时存储集群中的数据,安全起见,一定要备份!
  • 备份只需要在一个节点上备就可以了(为了避免刚好损坏的是备份节点,建议备份两个节点),每个节点上的数据是同步的;但是数据恢复是需要在每个节点上进行。
  • ectd容器是与宿主机网络共享的,采用hostNetwork方式,2379数据端口就可以在宿主机上查看到( ss -ntlp|grep 2379)。
[root@k8s-master-01 etcd_backup]# ss -ntlp|grep 2379
LISTEN     0      128    192.168.4.114:2379                     *:*                   users:(("etcd",pid=1841,fd=9))
LISTEN     0      128    127.0.0.1:2379                     *:*                   users:(("etcd",pid=1841,fd=8))
  • kubeadm方式部署的集群,其中etcd是通过静态pod方式部署启动,在/etc/kubernetes/manifests目录下有它的yaml文件,里面记录了启动镜像、版本、证书路劲、数据目录等内容。
[root@k8s-master-01 ~]#  cat /etc/kubernetes/manifests/etcd.yaml |grep -A 10  volumes: 
  volumes:
  - hostPath:
      path: /etc/kubernetes/pki/etcd
      type: DirectoryOrCreate
    name: etcd-certs
  - hostPath:
      path: /data/k8s/etcd
      type: DirectoryOrCreate
    name: etcd-data
status: {}

注意etcd数据目录是否更换,默认是/var/lib/etcd/此处etcd数据目为/data/k8s/etcd,否则将会导致集群不能恢复。

1)备份

  • 最好备份两个节点,避免刚好备份机器故障
#创建命名空间
kubectl create ns test

#部署
cat > nginx-deployment.yaml<<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: test
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: test
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: NodePort
EOF

#部署
kubectl apply -f nginx-deployment.yaml
#创建备份目录
mkdir -p /data/etcd_backup
cd /data/etcd_backup

#备份
ETCDCTL_API=3 etcdctl \
snapshot save snap.db_$(date +%F) \
--endpoints=https://192.168.4.114:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key

#检查
[root@k8s-master-01 etcd_backup]# ETCDCTL_API=3 etcdctl --write-out=table snapshot status /opt/etcd_backup/snap.db_2023-08-24 
Deprecated: Use `etcdutl snapshot status` instead.

+----------+----------+------------+------------+
|   HASH   | REVISION | TOTAL KEYS | TOTAL SIZE |
+----------+----------+------------+------------+
| 4c5447a8 |  2333766 |       1308 |     6.9 MB |
+----------+----------+------------+------------+

#集群节点状态
[root@k8s-master-01 etcd_backup]# ETCDCTL_API=3 etcdctl  --endpoints https://127.0.0.1:2379  --cert="/etc/kubernetes/pki/etcd/server.crt"  --key="/etc/kubernetes/pki/etcd/server.key"  --cacert="/etc/kubernetes/pki/etcd/ca.crt" member list -w table
+------------------+---------+---------------+----------------------------+----------------------------+------------+
|        ID        | STATUS  |     NAME      |         PEER ADDRS         |        CLIENT ADDRS        | IS LEARNER |
+------------------+---------+---------------+----------------------------+----------------------------+------------+
| c3509e57d5f53562 | started | k8s-master-01 | https://192.168.4.114:2380 | https://192.168.4.114:2379 |      false |
+------------------+---------+---------------+----------------------------+----------------------------+------------+

#任意节点查看 etcd 集群信息
[root@k8s-master-01 etcd_backup]# ETCDCTL_API=3 etcdctl  --endpoints https://127.0.0.1:2379  --cert="/etc/kubernetes/pki/etcd/server.crt"  --key="/etc/kubernetes/pki/etcd/server.key"  --cacert="/etc/kubernetes/pki/etcd/ca.crt" endpoint status --cluster  -w table
+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
|          ENDPOINT          |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| https://192.168.4.114:2379 | c3509e57d5f53562 |   3.5.4 |  6.9 MB |      true |      false |        10 |    2649811 |            2649811 |        |
+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
  • 部署之前存在nginx,删除nginx,恢复etcd确认nginx存在。
[root@k8s-master-01 etcd_backup]# kubectl get pods -n test  
NAME                               READY   STATUS    RESTARTS   AGE
nginx-deployment-ff6774dc6-7mm2j   1/1     Running   0          11s
nginx-deployment-ff6774dc6-hdvbf   1/1     Running   0          11s
nginx-deployment-ff6774dc6-zcf8m   1/1     Running   0          11s

[root@k8s-master-01 ~]#kubectl delete  -f nginx-deployment.yaml 

[root@k8s-master-01 etcd_backup]# kubectl get pods -n test

2)恢复

kubeadm

  • kubeadm 部署的集群中的 etcd 是以静态容器的方式运行的,静态容器的配置文件存放目录是 /etc/kubernetes/manifests/。
  • 核心流程就是:停止 api-server 和 etcd 服务 -> 执行还原 -> 重启 api-server 和 etcd 服务
#先停止api server和etcd服务。因为是静态Pod部署,监控这个目录下的yaml文件,当把目录备份后就直接相当于停服
mkdir -p /tmp/etcd/manifests/
mv /etc/kubernetes/manifests/{kube-apiserver.yaml,etcd.yaml} /tmp/etcd/manifests/
mv /data/k8s/etcd /data/k8s/etcd.`date +%Y%m%d`

#查看api-server是否停止
[root@k8s-master-01 ~]# kubectl get pod
The connection to the server 192.168.4.114:6443 was refused - did you specify the right host or port?

#使用snap.db文件恢复数据到/var/lib/etcd目录。
ETCDCTL_API=3 etcdctl snapshot restore snap.db_2023-08-24  --endpoints=https://192.168.4.114:2379  --cacert=/etc/kubernetes/pki/etcd/ca.crt  --cert=/etc/kubernetes/pki/etcd/server.crt  --key=/etc/kubernetes/pki/etcd/server.key --data-dir=/data/k8s/etcd


#启动kube-apiserver和etcd容器
mv  /tmp/etcd/manifests/{kube-apiserver.yaml,etcd.yaml} /etc/kubernetes/manifests/

#查看结果,

本文标签: 集群备份K8sEtcd