×

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 数据

请按照以下步骤通过创建 etcd 快照并备份静态 Pod 的资源来备份 etcd 数据。如果以后需要恢复 etcd,可以保存此备份并在以后使用。

仅保存来自单个控制平面主机的备份。不要从集群中的每个控制平面主机进行备份。

先决条件
  • 您可以作为具有 `cluster-admin` 角色的用户访问集群。

  • 您已检查集群范围代理是否已启用。

    您可以通过查看 `oc get proxy cluster -o yaml` 的输出检查代理是否已启用。如果 `httpProxy`、`httpsProxy` 和 `noProxy` 字段已设置值,则表示代理已启用。

步骤
  1. 以 root 用户身份启动控制平面节点的调试会话

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

    sh-4.4# chroot /host
  3. 如果启用了集群范围代理,请通过运行以下命令导出 `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>
  4. 在调试 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 备份

etcd 的自动化备份功能支持定期备份和单次备份。定期备份会创建一个 cron 作业,每次作业触发时都会启动一次备份。

etcd 的自动化备份仅为技术预览功能。技术预览功能不受 Red Hat 生产服务等级协议 (SLA) 的支持,并且可能无法完全发挥功能。Red Hat 不建议在生产环境中使用它们。这些功能可让客户提前访问即将推出的产品功能,从而能够在开发过程中测试功能并提供反馈。

有关 Red Hat 技术预览功能的支持范围的更多信息,请参阅 技术预览功能支持范围

请按照以下步骤启用 etcd 的自动备份。

在您的集群上启用 `TechPreviewNoUpgrade` 功能集可以阻止次要版本更新。`TechPreviewNoUpgrade` 功能集无法禁用。请勿在生产集群上启用此功能集。

先决条件
  • 您可以作为具有 `cluster-admin` 角色的用户访问集群。

  • 您可以访问 OpenShift CLI (oc)。

步骤
  1. 创建一个名为 `enable-tech-preview-no-upgrade.yaml` 的 `FeatureGate` 自定义资源 (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

创建单个 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

创建定期 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 密钥。

      提供商 accessModes storageClassName

      使用 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 附加到的主节点。

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

      $ 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