$ oc debug --as-root node/<node_name>
etcd 是 OpenShift Container Platform 的键值存储,它持久保存所有资源对象的狀態。
定期备份集群的 etcd 数据,并将其存储在安全的位置(理想情况下在 OpenShift Container Platform 环境之外)。在第一次证书轮换完成之前不要进行 etcd 备份,第一次证书轮换在安装 24 小时后发生,否则备份将包含已过期的证书。建议在非高峰时段进行 etcd 备份,因为 etcd 快照的 I/O 成本很高。
在更新集群之前务必进行 etcd 备份。更新之前进行备份非常重要,因为恢复集群时,必须使用从相同 z 流版本中获取的 etcd 备份。例如,OpenShift Container Platform 4.17.5 集群必须使用从 4.17.5 获取的 etcd 备份。
通过在控制平面主机上执行一次备份脚本调用来备份集群的 etcd 数据。不要为每个控制平面主机都进行备份。 |
拥有 etcd 备份后,您可以恢复到之前的集群状态。
请按照以下步骤通过创建 etcd 快照并备份静态 Pod 的资源来备份 etcd 数据。如果以后需要恢复 etcd,可以保存此备份并在以后使用。
仅保存来自单个控制平面主机的备份。不要从集群中的每个控制平面主机进行备份。 |
您可以作为具有 `cluster-admin` 角色的用户访问集群。
您已检查集群范围代理是否已启用。
您可以通过查看 `oc get proxy cluster -o yaml` 的输出检查代理是否已启用。如果 `httpProxy`、`httpsProxy` 和 `noProxy` 字段已设置值,则表示代理已启用。 |
以 root 用户身份启动控制平面节点的调试会话
$ oc debug --as-root node/<node_name>
在调试 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>
在调试 shell 中运行 `cluster-backup.sh` 脚本,并将保存备份的位置作为参数传递。
`cluster-backup.sh` 脚本作为 etcd 集群操作员的组件维护,它是 `etcdctl snapshot save` 命令的包装器。 |
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
在此示例中,在控制平面主机上的 `/home/core/assets/backup/` 目录中创建了两个文件
`snapshot_<datetimestamp>.db`:此文件是 etcd 快照。`cluster-backup.sh` 脚本确认其有效性。
`static_kuberesources_<datetimestamp>.tar.gz`:此文件包含静态 Pod 的资源。如果启用了 etcd 加密,则它还包含 etcd 快照的加密密钥。
如果启用了 etcd 加密,建议出于安全原因将此第二个文件与 etcd 快照分开存储。但是,此文件是必须从 etcd 快照恢复所必需的。 请记住,etcd 加密仅加密值,而不是密钥。这意味着资源类型、命名空间和对象名称未加密。 |
etcd 的自动化备份功能支持定期备份和单次备份。定期备份会创建一个 cron 作业,每次作业触发时都会启动一次备份。
etcd 的自动化备份仅为技术预览功能。技术预览功能不受 Red Hat 生产服务等级协议 (SLA) 的支持,并且可能无法完全发挥功能。Red Hat 不建议在生产环境中使用它们。这些功能可让客户提前访问即将推出的产品功能,从而能够在开发过程中测试功能并提供反馈。 有关 Red Hat 技术预览功能的支持范围的更多信息,请参阅 技术预览功能支持范围。 |
请按照以下步骤启用 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
按照以下步骤,通过创建和应用自定义资源 (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 在挂载之前会一直处于 |
创建一个名为 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)
1 | PV 可用的存储量。请根据您的需求调整此值。 |
2 | 将此值替换为要将此 PV 附加到的节点。 |
运行以下命令验证 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
按照以下步骤创建 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 可用的存储量。请根据您的需求调整此值。 |
以下每个提供商都需要更改
|
运行以下命令应用 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 在挂载之前会一直处于 |
如果无法使用动态配置的存储,请完成以下步骤创建本地存储 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)
1 | PV 可用的存储量。请根据您的需求调整此值。 |
2 | 将此值替换为要将此 PV 附加到的主节点。 |
运行以下命令列出可用的节点。
|
运行以下命令验证 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)
1 | 保留类型。如果未指定,则默认为 RetentionNumber 。 |
2 | 要保留的最大备份数。根据您的需求调整此值。如果未指定,则默认为 15 个备份。 |
已知问题会导致保留的备份数量比配置的值多一个。 |
对于基于备份文件大小的保留,请使用以下内容。
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