第 5 章 control plane 备份和恢复
5.1. 备份 etcd
etcd 是 OpenShift Container Platform 的以”键-值”形式进行的存储,它会保留所有资源对象的状态。
定期备份集群的 etcd 数据,并在 OpenShift Container Platform 环境以外的安全位置保存备份数据。不要在第一个证书轮转完成前(安装后的 24 小时内)进行 etcd 备份,否则备份将包含过期的证书。另外,建议您在非高峰期使用 etcd 备份,因为 etcd 快照有较高的 I/O 成本。
在更新集群之前,请务必进行 etcd 备份。在更新前进行备份非常重要,因为在恢复集群时,您必须使用从同一 z-stream 发行版本中获取的 etcd 备份。例如,OpenShift Container Platform 4.17.5 集群必须使用从 4.17.5 中获得的 etcd 备份。
通过在 control plane 主机上执行一次备份脚本来备份集群的 etcd 数据。不要为每个 control plane 主机进行备份。
在进行了 etcd 备份后,就可以恢复到一个以前的集群状态。
5.1.1. 备份 etcd 数据
按照以下步骤,通过创建 etcd 快照并备份静态 pod 的资源来备份 etcd 数据。这个备份可以被保存,并在以后需要时使用它来恢复 etcd 数据。
只保存单一 control plane 主机的备份。不要从集群中的每个 control plane 主机进行备份。
先决条件
-
您可以使用具有
cluster-admin
角色的用户访问集群。 您已检查是否启用了集群范围代理。
提示您可以通过查看
oc get proxy cluster -o yaml
的输出来检查代理是否已启用。如果httpProxy
、httpsProxy
和noProxy
字段设置了值,则会启用代理。
流程
以 root 用户身份为 control plane 节点启动一个 debug 会话:
$ oc debug --as-root node/<node_name>
在 debug shell 中将根目录改为
/host
:sh-4.4# chroot /host
如果启用了集群范围代理,请运行以下命令导出
NO_PROXY
、HTTP_PROXY
和HTTPS_PROXY
环境变量:$ export HTTP_PROXY=http://<your_proxy.example.com>:8080
$ export HTTPS_PROXY=https://<your_proxy.example.com>:8080
$ export NO_PROXY=<example.com>
在 debug shell 中运行
cluster-backup.sh
脚本,并传递保存备份的位置。提示cluster-backup.sh
脚本作为 etcd Cluster Operator 的一个组件被维护,它是etcdctl snapshot save
命令的包装程序(wrapper)。sh-4.4# /usr/local/bin/cluster-backup.sh /home/core/assets/backup
脚本输出示例
found latest kube-apiserver: /etc/kubernetes/static-pod-resources/kube-apiserver-pod-6 found latest kube-controller-manager: /etc/kubernetes/static-pod-resources/kube-controller-manager-pod-7 found latest kube-scheduler: /etc/kubernetes/static-pod-resources/kube-scheduler-pod-6 found latest etcd: /etc/kubernetes/static-pod-resources/etcd-pod-3 ede95fe6b88b87ba86a03c15e669fb4aa5bf0991c180d3c6895ce72eaade54a1 etcdctl version: 3.4.14 API version: 3.4 {"level":"info","ts":1624647639.0188997,"caller":"snapshot/v3_snapshot.go:119","msg":"created temporary db file","path":"/home/core/assets/backup/snapshot_2021-06-25_190035.db.part"} {"level":"info","ts":"2021-06-25T19:00:39.030Z","caller":"clientv3/maintenance.go:200","msg":"opened snapshot stream; downloading"} {"level":"info","ts":1624647639.0301006,"caller":"snapshot/v3_snapshot.go:127","msg":"fetching snapshot","endpoint":"https://10.0.0.5:2379"} {"level":"info","ts":"2021-06-25T19:00:40.215Z","caller":"clientv3/maintenance.go:208","msg":"completed snapshot read; closing"} {"level":"info","ts":1624647640.6032252,"caller":"snapshot/v3_snapshot.go:142","msg":"fetched snapshot","endpoint":"https://10.0.0.5:2379","size":"114 MB","took":1.584090459} {"level":"info","ts":1624647640.6047094,"caller":"snapshot/v3_snapshot.go:152","msg":"saved","path":"/home/core/assets/backup/snapshot_2021-06-25_190035.db"} Snapshot saved at /home/core/assets/backup/snapshot_2021-06-25_190035.db {"hash":3866667823,"revision":31407,"totalKey":12828,"totalSize":114446336} snapshot db and kube resources are successfully saved to /home/core/assets/backup
在这个示例中,在 control plane 主机上的
/home/core/assets/backup/
目录中创建了两个文件:-
snapshot_<datetimestamp>.db
:这个文件是 etcd 快照。cluster-backup.sh
脚本确认其有效。 static_kuberesources_<datetimestamp>.tar.gz
:此文件包含静态 pod 的资源。如果启用了 etcd 加密,它也包含 etcd 快照的加密密钥。注意如果启用了 etcd 加密,建议出于安全考虑,将第二个文件与 etcd 快照分开保存。但是,需要这个文件才能从 etcd 快照中进行恢复。
请记住,etcd 仅对值进行加密,而不对键进行加密。这意味着资源类型、命名空间和对象名称是不加密的。
-
5.1.2. 其他资源
5.1.3. 创建自动的 etcd 备份
etcd 的自动备份功能支持重复备份和单一备份。重复备份会创建一个 cron 作业,该作业在每次作业触发时都启动一次备份。
自动 etcd 备份是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
按照以下步骤为 etcd 启用自动备份。
在集群中启用 TechPreviewNoUpgrade
功能集可防止次版本更新。TechPreviewNoUpgrade
功能集无法被禁用。不要在生产环境集群中启用此功能。
先决条件
-
您可以使用具有
cluster-admin
角色的用户访问集群。 -
您可以访问 OpenShift CLI(
oc
)。
流程
使用以下内容创建名为
enable-tech-preview-no-upgrade.yaml
的FeatureGate
自定义资源 (CR) 文件:apiVersion: config.openshift.io/v1 kind: FeatureGate metadata: name: cluster spec: featureSet: TechPreviewNoUpgrade
应用 CR 并启用自动备份:
$ oc apply -f enable-tech-preview-no-upgrade.yaml
启用相关的 API 需要一些时间。运行以下命令,验证自定义资源定义 (CRD) 的创建:
$ oc get crd | grep backup
输出示例
backups.config.openshift.io 2023-10-25T13:32:43Z etcdbackups.operator.openshift.io 2023-10-25T13:32:04Z
5.1.3.1. 创建单个 etcd 备份
按照以下步骤,通过创建并应用自定义资源 (CR) 来创建单个 etcd 备份。
先决条件
-
您可以使用具有
cluster-admin
角色的用户访问集群。 -
您可以访问 OpenShift CLI(
oc
)。
流程
如果动态置备的存储可用,请完成以下步骤以创建单个自动 etcd 备份:
创建名为
etcd-backup-pvc.yaml
的持久性卷声明 (PVC),其内容如下:kind: PersistentVolumeClaim apiVersion: v1 metadata: name: etcd-backup-pvc namespace: openshift-etcd spec: accessModes: - ReadWriteOnce resources: requests: storage: 200Gi 1 volumeMode: Filesystem
- 1
- PVC 可用的存储量。根据您的要求调整这个值。
运行以下命令来应用 PVC:
$ oc apply -f etcd-backup-pvc.yaml
运行以下命令验证 PVC 的创建:
$ oc get pvc
输出示例
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE etcd-backup-pvc Bound 51s
注意动态 PVC 处于
Pending
状态,直到它们被挂载为止。创建名为
etcd-single-backup.yaml
的 CR 文件,其内容如下:apiVersion: operator.openshift.io/v1alpha1 kind: EtcdBackup metadata: name: etcd-single-backup namespace: openshift-etcd spec: pvcName: etcd-backup-pvc 1
- 1
- 保存备份的 PVC 名称。根据您的环境调整这个值。
应用 CR 以启动单个备份:
$ oc apply -f etcd-single-backup.yaml
如果动态置备的存储不可用,请完成以下步骤来创建单个自动 etcd 备份:
创建名为
etcd-backup-local-storage.yaml
的StorageClass
CR 文件,其内容如下:apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: etcd-backup-local-storage provisioner: kubernetes.io/no-provisioner volumeBindingMode: Immediate
运行以下命令来应用
StorageClass
CR:$ oc apply -f etcd-backup-local-storage.yaml
创建名为
etcd-backup-pv-fs.yaml
的 PV,其内容类似以下示例:apiVersion: v1 kind: PersistentVolume metadata: name: etcd-backup-pv-fs spec: capacity: storage: 100Gi 1 volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: etcd-backup-local-storage local: path: /mnt nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - <example_master_node> 2
运行以下命令验证 PV 的创建:
$ oc get pv
输出示例
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE etcd-backup-pv-fs 100Gi RWO Retain Available etcd-backup-local-storage 10s
创建名为
etcd-backup-pvc.yaml
的 PVC,其内容如下:kind: PersistentVolumeClaim apiVersion: v1 metadata: name: etcd-backup-pvc namespace: openshift-etcd spec: accessModes: - ReadWriteOnce volumeMode: Filesystem resources: requests: storage: 10Gi 1
- 1
- PVC 可用的存储量。根据您的要求调整这个值。
运行以下命令来应用 PVC:
$ oc apply -f etcd-backup-pvc.yaml
创建名为
etcd-single-backup.yaml
的 CR 文件,其内容如下:apiVersion: operator.openshift.io/v1alpha1 kind: EtcdBackup metadata: name: etcd-single-backup namespace: openshift-etcd spec: pvcName: etcd-backup-pvc 1
- 1
- 将备份保存到的持久性卷声明 (PVC) 的名称。根据您的环境调整这个值。
应用 CR 以启动单个备份:
$ oc apply -f etcd-single-backup.yaml
5.1.3.2. 创建重复的 etcd 备份
按照以下步骤创建自动重复备份 etcd。
如果可能,使用动态置备的存储将创建的 etcd 备份数据保存在安全的外部位置。如果动态置备的存储不可用,请考虑将备份数据存储在 NFS 共享上,以便更易访问备份恢复。
先决条件
-
您可以使用具有
cluster-admin
角色的用户访问集群。 -
您可以访问 OpenShift CLI(
oc
)。
流程
如果动态置备的存储可用,请完成以下步骤来创建自动重复备份:
创建名为
etcd-backup-pvc.yaml
的持久性卷声明 (PVC),其内容如下:kind: PersistentVolumeClaim apiVersion: v1 metadata: name: etcd-backup-pvc namespace: openshift-etcd spec: accessModes: - ReadWriteOnce resources: requests: storage: 200Gi 1 volumeMode: Filesystem storageClassName: etcd-backup-local-storage
- 1
- PVC 可用的存储量。根据您的要求调整这个值。
注意每个供应商都需要更改
accessModes
和storageClassName
密钥:供应商 accessModes
值storageClassName
value带有
versioned-installer-efc_operator-ci
配置集的 AWS- ReadWriteMany
efs-sc
Google Cloud Platform
- ReadWriteMany
filestore-csi
Microsoft Azure
- ReadWriteMany
azurefile-csi
运行以下命令来应用 PVC:
$ oc apply -f etcd-backup-pvc.yaml
运行以下命令验证 PVC 的创建:
$ oc get pvc
输出示例
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE etcd-backup-pvc Bound 51s
注意动态 PVC 处于
Pending
状态,直到它们被挂载为止。
如果动态置备的存储不可用,请完成以下步骤来创建本地存储 PVC:
警告如果您删除或丢失对包含存储备份数据的节点的访问,可能会丢失数据。
创建名为
etcd-backup-local-storage.yaml
的StorageClass
CR 文件,其内容如下:apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: etcd-backup-local-storage provisioner: kubernetes.io/no-provisioner volumeBindingMode: Immediate
运行以下命令来应用
StorageClass
CR:$ oc apply -f etcd-backup-local-storage.yaml
从应用的
StorageClass
中创建一个名为etcd-backup-pv-fs.yaml
的 PV,其内容类似以下示例:apiVersion: v1 kind: PersistentVolume metadata: name: etcd-backup-pv-fs spec: capacity: storage: 100Gi 1 volumeMode: Filesystem accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Delete storageClassName: etcd-backup-local-storage local: path: /mnt/ nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - <example_master_node> 2
提示运行以下命令来列出可用的节点:
$ oc get nodes
运行以下命令验证 PV 的创建:
$ oc get pv
输出示例
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE etcd-backup-pv-fs 100Gi RWX Delete Available etcd-backup-local-storage 10s
创建名为
etcd-backup-pvc.yaml
的 PVC,其内容如下:kind: PersistentVolumeClaim apiVersion: v1 metadata: name: etcd-backup-pvc spec: accessModes: - ReadWriteMany volumeMode: Filesystem resources: requests: storage: 10Gi 1 storageClassName: etcd-backup-local-storage
- 1
- PVC 可用的存储量。根据您的要求调整这个值。
运行以下命令来应用 PVC:
$ oc apply -f etcd-backup-pvc.yaml
创建名为
etcd-recurring-backups.yaml
的自定义资源定义 (CRD) 文件。创建的 CRD 的内容定义自动备份的调度和保留类型。对于带有 15 个保留备份的
RetentionNumber
的默认保留类型,请使用类似以下示例的内容:apiVersion: config.openshift.io/v1alpha1 kind: Backup metadata: name: etcd-recurring-backup spec: etcd: schedule: "20 4 * * *" 1 timeZone: "UTC" pvcName: etcd-backup-pvc
- 1
- 用于重复备份的
CronTab
调度。根据您的需要调整这个值。
要使用基于最大备份数的保留,请在
etcd
键中添加以下键值对:spec: etcd: retentionPolicy: retentionType: RetentionNumber 1 retentionNumber: maxNumberOfBackups: 5 2
警告已知问题会导致保留备份的数量大于配置的值。
要根据备份的文件大小保留,请使用:
spec: etcd: retentionPolicy: retentionType: RetentionSize retentionSize: maxSizeOfBackupsGb: 20 1
- 1
- 以 GB 为单位保留备份的最大文件大小。根据您的需要调整这个值。如果未指定,则默认为 10 GB。
警告已知问题会导致保留备份的最大大小超过配置的值 10 GB。
运行以下命令,创建 CRD 定义的 cron 作业:
$ oc create -f etcd-recurring-backup.yaml
要查找创建的 cron 任务,请运行以下命令:
$ oc get cronjob -n openshift-etcd