搜索

第 5 章 control plane 备份和恢复

download PDF

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.y.z 集群必须使用从 4.y.z 中获得的 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 的输出来检查代理是否已启用。如果 httpProxyhttpsProxynoProxy 字段设置了值,则会启用代理。

流程

  1. 以 root 用户身份为 control plane 节点启动一个 debug 会话:

    $ oc debug --as-root node/<node_name>
  2. 在 debug shell 中将根目录改为 /host

    sh-4.4# chroot /host
  3. 如果启用了集群范围的代理,请确定已导出了 NO_PROXYHTTP_PROXYHTTPS_PROXY 环境变量。
  4. 在 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)。

流程

  1. 使用以下内容创建名为 enable-tech-preview-no-upgrade.yamlFeatureGate 自定义资源 (CR) 文件:

    apiVersion: config.openshift.io/v1
    kind: FeatureGate
    metadata:
      name: cluster
    spec:
      featureSet: TechPreviewNoUpgrade
  2. 应用 CR 并启用自动备份:

    $ oc apply -f enable-tech-preview-no-upgrade.yaml
  3. 启用相关的 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 备份:

    1. 创建名为 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 可用的存储量。根据您的要求调整这个值。
    2. 运行以下命令来应用 PVC:

      $ oc apply -f etcd-backup-pvc.yaml
    3. 运行以下命令验证 PVC 的创建:

      $ oc get pvc

      输出示例

      NAME              STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
      etcd-backup-pvc   Bound                                                       51s

      注意

      动态 PVC 处于 Pending 状态,直到它们被挂载为止。

    4. 创建名为 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 名称。根据您的环境调整这个值。
    5. 应用 CR 以启动单个备份:

      $ oc apply -f etcd-single-backup.yaml
  • 如果动态置备的存储不可用,请完成以下步骤来创建单个自动 etcd 备份:

    1. 创建名为 etcd-backup-local-storage.yamlStorageClass CR 文件,其内容如下:

      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:
        name: etcd-backup-local-storage
      provisioner: kubernetes.io/no-provisioner
      volumeBindingMode: Immediate
    2. 运行以下命令来应用 StorageClass CR:

      $ oc apply -f etcd-backup-local-storage.yaml
    3. 创建名为 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 附加到的节点。
    4. 运行以下命令验证 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

    5. 创建名为 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 可用的存储量。根据您的要求调整这个值。
    6. 运行以下命令来应用 PVC:

      $ oc apply -f etcd-backup-pvc.yaml
    7. 创建名为 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) 的名称。根据您的环境调整这个值。
    8. 应用 CR 以启动单个备份:

      $ oc apply -f etcd-single-backup.yaml

5.1.3.2. 创建重复的 etcd 备份

按照以下步骤创建自动重复备份 etcd。

如果可能,使用动态置备的存储将创建的 etcd 备份数据保存在安全的外部位置。如果动态置备的存储不可用,请考虑将备份数据存储在 NFS 共享上,以便更易访问备份恢复。

先决条件

  • 您可以使用具有 cluster-admin 角色的用户访问集群。
  • 您可以访问 OpenShift CLI(oc)。

流程

  1. 如果动态置备的存储可用,请完成以下步骤来创建自动重复备份:

    1. 创建名为 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 可用的存储量。根据您的要求调整这个值。
      注意

      每个供应商都需要更改 accessModesstorageClassName 密钥:

      供应商accessModesstorageClassName value

      带有 versioned-installer-efc_operator-ci 配置集的 AWS

      - ReadWriteMany

      efs-sc

      Google Cloud Platform

      - ReadWriteMany

      filestore-csi

      Microsoft Azure

      - ReadWriteMany

      azurefile-csi

    2. 运行以下命令来应用 PVC:

      $ oc apply -f etcd-backup-pvc.yaml
    3. 运行以下命令验证 PVC 的创建:

      $ oc get pvc

      输出示例

      NAME              STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
      etcd-backup-pvc   Bound                                                       51s

      注意

      动态 PVC 处于 Pending 状态,直到它们被挂载为止。

  2. 如果动态置备的存储不可用,请完成以下步骤来创建本地存储 PVC:

    警告

    如果您删除或丢失对包含存储备份数据的节点的访问,可能会丢失数据。

    1. 创建名为 etcd-backup-local-storage.yamlStorageClass CR 文件,其内容如下:

      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:
        name: etcd-backup-local-storage
      provisioner: kubernetes.io/no-provisioner
      volumeBindingMode: Immediate
    2. 运行以下命令来应用 StorageClass CR:

      $ oc apply -f etcd-backup-local-storage.yaml
    3. 从应用的 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 的 master 节点。
      提示

      运行以下命令来列出可用的节点:

      $ oc get nodes
    4. 运行以下命令验证 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

    5. 创建名为 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 可用的存储量。根据您的要求调整这个值。
    6. 运行以下命令来应用 PVC:

      $ oc apply -f etcd-backup-pvc.yaml
  3. 创建名为 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。

  4. 运行以下命令,创建 CRD 定义的 cron 作业:

    $ oc create -f etcd-recurring-backup.yaml
  5. 要查找创建的 cron 任务,请运行以下命令:

    $ oc get cronjob -n openshift-etcd
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.