×

作为第 2 天操作,您可以通过将 etcd 从根卷(由 OpenStack Cinder 提供)移动到专用的临时本地磁盘来解决和防止 Red Hat OpenStack Platform (RHOSP) 安装的性能问题。

在本地磁盘上部署 RHOSP

如果您有现有的 RHOSP 云,您可以将 etcd 从该云移动到专用的临时本地磁盘。

先决条件
  • 您有一个具有正常运行的 Cinder 的 OpenStack 云。

  • 您的 OpenStack 云至少有 75 GB 的可用存储空间,以容纳 OpenShift 控制平面的 3 个根卷。

  • OpenStack 云使用使用本地存储后端而不是 `rbd` 的 Nova 临时存储进行部署。

步骤
  1. 通过运行以下命令创建一个至少有 10 GB 临时磁盘的控制平面 Nova 实例规格,根据您的环境替换 `--ram`、`--disk` 和 <flavor_name> 的值

    $ openstack flavor create --<ram 16384> --<disk 0> --ephemeral 10 --vcpus 4 <flavor_name>
  2. 部署一个带有控制平面根卷的集群;例如

    示例 YAML 文件
    # ...
    controlPlane:
      name: master
      platform:
        openstack:
          type: ${CONTROL_PLANE_FLAVOR}
          rootVolume:
            size: 25
            types:
            - ${CINDER_TYPE}
      replicas: 3
    # ...
  3. 通过运行以下命令部署您创建的集群

    $ openshift-install create cluster --dir <installation_directory> (1)
    1 对于 `<installation_directory>`,请指定您之前创建的自定义 `./install-config.yaml 文件` 的位置。
  4. 在继续下一步之前,通过运行以下命令验证您部署的集群是否健康

    $ oc wait clusteroperators --all --for=condition=Progressing=false (1)
    1 确保集群操作员已完成进度,并且集群没有在部署或更新。
  5. 使用以下 YAML 文件创建一个名为 `98-var-lib-etcd.yaml` 的文件

    详情
    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
      labels:
        machineconfiguration.openshift.io/role: master
      name: 98-var-lib-etcd
    spec:
      config:
        ignition:
          version: 3.4.0
        systemd:
          units:
          - contents: |
              [Unit]
              Description=Mount local-etcd to /var/lib/etcd
    
              [Mount]
              What=/dev/disk/by-label/local-etcd (1)
              Where=/var/lib/etcd
              Type=xfs
              Options=defaults,prjquota
    
              [Install]
              WantedBy=local-fs.target
            enabled: true
            name: var-lib-etcd.mount
          - contents: |
              [Unit]
              Description=Create local-etcd filesystem
              DefaultDependencies=no
              After=local-fs-pre.target
              ConditionPathIsSymbolicLink=!/dev/disk/by-label/local-etcd (2)
    
              [Service]
              Type=oneshot
              RemainAfterExit=yes
              ExecStart=/bin/bash -c "[ -L /dev/disk/by-label/ephemeral0 ] || ( >&2 echo Ephemeral disk does not exist; /usr/bin/false )"
              ExecStart=/usr/sbin/mkfs.xfs -f -L local-etcd /dev/disk/by-label/ephemeral0 (3)
    
              [Install]
              RequiredBy=dev-disk-by\x2dlabel-local\x2detcd.device
            enabled: true
            name: create-local-etcd.service
          - contents: |
              [Unit]
              Description=Migrate existing data to local etcd
              After=var-lib-etcd.mount
              Before=crio.service (4)
    
              Requisite=var-lib-etcd.mount
              ConditionPathExists=!/var/lib/etcd/member
              ConditionPathIsDirectory=/sysroot/ostree/deploy/rhcos/var/lib/etcd/member (5)
    
              [Service]
              Type=oneshot
              RemainAfterExit=yes
    
              ExecStart=/bin/bash -c "if [ -d /var/lib/etcd/member.migrate ]; then rm -rf /var/lib/etcd/member.migrate; fi" (6)
    
              ExecStart=/usr/bin/cp -aZ /sysroot/ostree/deploy/rhcos/var/lib/etcd/member/ /var/lib/etcd/member.migrate
              ExecStart=/usr/bin/mv /var/lib/etcd/member.migrate /var/lib/etcd/member (7)
    
              [Install]
              RequiredBy=var-lib-etcd.mount
            enabled: true
            name: migrate-to-local-etcd.service
          - contents: |
              [Unit]
              Description=Relabel /var/lib/etcd
    
              After=migrate-to-local-etcd.service
              Before=crio.service
              Requisite=var-lib-etcd.mount
    
              [Service]
              Type=oneshot
              RemainAfterExit=yes
    
              ExecCondition=/bin/bash -c "[ -n \"$(restorecon -nv /var/lib/etcd)\" ]" (8)
    
              ExecStart=/usr/sbin/restorecon -R /var/lib/etcd
    
              [Install]
              RequiredBy=var-lib-etcd.mount
            enabled: true
            name: relabel-var-lib-etcd.service
    1 etcd 数据库必须由设备而不是标签挂载,以确保 `systemd` 生成此配置中使用的设备依赖项以触发文件系统创建。
    2 如果文件系统 `dev/disk/by-label/local-etcd` 已经存在,则不要运行。
    3 如果 `dev/disk/by-label/ephemeral0` 不存在,则会发出警报消息并失败。
    4 将现有数据迁移到本地 etcd 数据库。此配置在挂载 `/var/lib/etcd` 后但 CRI-O 启动前执行此操作,因此 etcd 尚未运行。
    5 要求挂载 etcd 且不包含成员目录,但 ostree 包含。
    6 清理任何之前的迁移状态。
    7 分步复制和移动以确保完整成员目录的原子创建。
    8 在执行完全递归重命名之前,对挂载点目录进行快速检查。如果文件路径 `/var/lib/etcd` 中的 restorecon 无法重命名目录,则不执行递归重命名。

    将 `98-var-lib-etcd.yaml` 文件应用于系统后,请勿将其删除。删除此文件将破坏 etcd 成员并导致系统不稳定。

    如果需要回滚,请修改ControlPlaneMachineSet 对象以使用不包含临时磁盘的规格。此更改将重新生成控制平面节点,而不会为 etcd 分区使用临时磁盘,从而避免与98-var-lib-etcd.yaml 文件相关的 문제점。只有在ControlPlaneMachineSet 对象更新完成且没有任何控制平面节点使用临时磁盘后,才能安全地删除98-var-lib-etcd.yaml 文件。

  6. 运行以下命令创建新的MachineConfig 对象:

    $ oc create -f 98-var-lib-etcd.yaml

    将 etcd 数据库移动到每个控制平面机器的本地磁盘需要一些时间。

  7. 运行以下命令验证 etcd 数据库是否已转移到每个控制平面的本地磁盘:

    1. 运行以下命令验证集群是否仍在更新:

      $ oc wait --timeout=45m --for=condition=Updating=false machineconfigpool/master
    2. 运行以下命令验证集群是否已准备就绪:

      $ oc wait node --selector='node-role.kubernetes.io/master' --for condition=Ready --timeout=30s
    3. 运行以下命令验证集群操作符是否在集群中运行:

      $ oc wait clusteroperators --timeout=30m --all --for=condition=Progressing=false