×

由于 etcd 将数据写入磁盘并在磁盘上持久保存提案,因此其性能取决于磁盘性能。虽然 etcd 不是特别 I/O 密集型,但它需要低延迟的块设备才能获得最佳性能和稳定性。由于 etcd 的共识协议依赖于将元数据持久存储到日志 (WAL),因此 etcd 对磁盘写入延迟很敏感。来自其他进程的慢速磁盘和磁盘活动会导致较长的 fsync 延迟。

这些延迟可能导致 etcd 错过心跳,无法及时将新的提案提交到磁盘,最终导致请求超时和临时领导者丢失。高写入延迟还会导致 OpenShift API 缓慢,从而影响集群性能。由于这些原因,请避免在对 I/O 敏感或密集型且共享相同底层 I/O 基础设施的控制平面节点上与其他工作负载共存。

在可以以低于 10 毫秒的速度写入至少 50 个 8KB 顺序 IOPS(包括 fdatasync)的块设备上运行 etcd。对于负载较重的集群,建议使用 8000 字节(2 毫秒)的 500 个顺序 IOPS。要测量这些数字,您可以使用基准测试工具,例如 fio。

为了实现这种性能,请在由低延迟和高吞吐量的 SSD 或 NVMe 磁盘支持的机器上运行 etcd。请考虑使用单层单元 (SLC) 固态硬盘 (SSD),它每个内存单元提供 1 位,耐用可靠,非常适合写入密集型工作负载。

etcd 上的负载来自静态因素,例如节点和 Pod 的数量,以及动态因素,包括由于 Pod 自动扩展、Pod 重启、作业执行和其他与工作负载相关的事件而导致的端点变化。为了准确地调整 etcd 设置的大小,您必须分析工作负载的具体要求。请考虑影响 etcd 负载的节点数、Pod 数和其他相关因素。

以下硬盘实践可提供最佳的 etcd 性能

  • 使用专用的 etcd 驱动器。避免使用通过网络通信的驱动器,例如 iSCSI。不要在 etcd 驱动器上放置日志文件或其他繁重的工作负载。

  • 优先选择低延迟驱动器,以支持快速读写操作。

  • 优先选择高带宽写入,以加快压缩和碎片整理速度。

  • 优先选择高带宽读取,以加快故障恢复速度。

  • 至少使用固态硬盘。生产环境优先选择 NVMe 驱动器。

  • 使用服务器级硬件以提高可靠性。

  • 避免使用 NAS 或 SAN 设置以及旋转式硬盘。Ceph Rados 块设备 (RBD) 和其他类型的网络附加存储可能会导致网络延迟不可预测。为了大规模地为 etcd 节点提供快速存储,请使用 PCI 直通将 NVM 设备直接传递给节点。

  • 始终使用 fio 等实用程序进行基准测试。您可以使用此类实用程序持续监控集群性能的增长。

  • 避免使用网络文件系统 (NFS) 协议或其他基于网络的文件系统。

在已部署的 OpenShift Container Platform 集群上监控的一些关键指标是 etcd 磁盘预写日志持续时间的 p99 和 etcd 领导者变更次数。使用 Prometheus 跟踪这些指标。

在正常操作期间,etcd 成员数据库大小在集群中可能会有所不同。即使领导者大小与其他成员不同,此差异也不会影响集群升级。

在创建 OpenShift Container Platform 集群之前或之后,可以使用 fio 验证 etcd 的硬件。

先决条件
  • 正在测试的机器上安装了 Podman 或 Docker 等容器运行时。

  • 数据写入 /var/lib/etcd 路径。

步骤
  • 运行 fio 并分析结果

    • 如果使用 Podman,请运行此命令

      $ sudo podman run --volume /var/lib/etcd:/var/lib/etcd:Z quay.io/cloud-bulldozer/etcd-perf
    • 如果使用 Docker,请运行此命令

      $ sudo docker run --volume /var/lib/etcd:/var/lib/etcd:Z quay.io/cloud-bulldozer/etcd-perf

输出报告通过将运行中捕获的 fsync 指标的第 99 个百分位数与 10 毫秒进行比较,来报告磁盘是否足够快以托管 etcd。一些可能受 I/O 性能影响的最重要的 etcd 指标如下所示

  • etcd_disk_wal_fsync_duration_seconds_bucket 指标报告 etcd 的 WAL fsync 持续时间

  • etcd_disk_backend_commit_duration_seconds_bucket 指标报告 etcd 后端提交延迟持续时间

  • etcd_server_leader_changes_seen_total 指标报告领导者变更次数

由于 etcd 在所有成员之间复制请求,因此其性能很大程度上取决于网络输入/输出 (I/O) 延迟。高网络延迟会导致 etcd 心跳时间超过选举超时时间,从而导致领导者选举会破坏集群。在已部署的 OpenShift Container Platform 集群上监控的关键指标是在每个 etcd 集群成员上 etcd 网络对等体延迟的第 99 个百分位数。使用 Prometheus 跟踪该指标。

histogram_quantile(0.99, rate(etcd_network_peer_round_trip_time_seconds_bucket[2m])) 指标报告 etcd 完成在成员之间复制客户端请求的往返时间。确保它小于 50 毫秒。

通常,集群必须具有 3 个控制平面节点。但是,如果您的集群安装在裸机平台上,则可以将集群扩展到最多 5 个控制平面节点作为安装后任务。例如,要将安装后的 3 个控制平面节点扩展到 4 个,可以添加一个主机并将其安装为控制平面节点。然后,etcd 运算符会相应地进行扩展以考虑附加的控制平面节点。

仅裸机平台支持将集群扩展到 4 个或 5 个控制平面节点。

有关如何使用 Assisted Installer 扩展控制平面节点的更多信息,请参见“使用 API 添加主机”和“在健康集群上安装主控制平面节点”。

下表显示了不同大小集群的容错能力

表 1. 按集群大小划分的容错能力
集群大小 多数 容错能力

1 个节点

1

0

3 个节点

2

1

4 个节点

3

1

5 个节点

3

2

有关从仲裁丢失中恢复的更多信息,请参见“恢复到以前的集群状态”。

您可以将 etcd 从共享磁盘移动到单独的磁盘,以防止或解决性能问题。

对于 OpenShift Container Platform 4.17 容器存储,机器配置运算符 (MCO) 负责挂载辅助磁盘。

此编码脚本仅支持以下设备类型的设备名称

SCSI 或 SATA

/dev/sd*

虚拟设备

/dev/vd*

NVMe

/dev/nvme*[0-9]*n*

限制
  • 将新磁盘连接到集群后,etcd 数据库是根挂载的一部分。它不是辅助磁盘或在重新创建主节点时预期的磁盘的一部分。因此,主节点不会创建单独的 /var/lib/etcd 挂载点。

先决条件
  • 您有集群 etcd 数据的备份。

  • 您已安装 OpenShift CLI (oc)。

  • 您可以使用 cluster-admin 权限访问集群。

  • 在上传机器配置之前添加其他磁盘。

  • MachineConfigPool 必须与 metadata.labels[machineconfiguration.openshift.io/role] 匹配。这适用于控制器、工作程序或自定义池。

此过程不会将根文件系统的一部分(例如 /var/)移动到已安装节点上的另一个磁盘或分区。

使用控制平面机器集时不支持此过程。

步骤
  1. 将新磁盘连接到集群,并通过在调试 shell 中运行 lsblk 命令来验证节点中是否检测到该磁盘

    $ oc debug node/<node_name>
    # lsblk

    记下 lsblk 命令报告的新磁盘的设备名称。

  2. 创建以下脚本并将其命名为 etcd-find-secondary-device.sh

    #!/bin/bash
    set -uo pipefail
    
    for device in <device_type_glob>; do (1)
    /usr/sbin/blkid "${device}" &> /dev/null
     if [ $? == 2  ]; then
        echo "secondary device found ${device}"
        echo "creating filesystem for etcd mount"
        mkfs.xfs -L var-lib-etcd -f "${device}" &> /dev/null
        udevadm settle
        touch /etc/var-lib-etcd-mount
        exit
     fi
    done
    echo "Couldn't find secondary block device!" >&2
    exit 77
    1 <device_type_glob> 替换为块设备类型的 shell 通配符。对于 SCSI 或 SATA 驱动器,使用 /dev/sd*;对于虚拟驱动器,使用 /dev/vd*;对于 NVMe 驱动器,使用 /dev/nvme*[0-9]*n*
  3. etcd-find-secondary-device.sh 脚本创建 base64 编码字符串,并记下其内容

    $ base64 -w0 etcd-find-secondary-device.sh
  4. 创建名为 etcd-mc.ymlMachineConfig 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
        storage:
          files:
            - path: /etc/find-secondary-device
              mode: 0755
              contents:
                source: data:text/plain;charset=utf-8;base64,<encoded_etcd_find_secondary_device_script> (1)
        systemd:
          units:
            - name: find-secondary-device.service
              enabled: true
              contents: |
                [Unit]
                Description=Find secondary device
                DefaultDependencies=false
                After=systemd-udev-settle.service
                Before=local-fs-pre.target
                ConditionPathExists=!/etc/var-lib-etcd-mount
    
                [Service]
                RemainAfterExit=yes
                ExecStart=/etc/find-secondary-device
    
                RestartForceExitStatus=77
    
                [Install]
                WantedBy=multi-user.target
            - name: var-lib-etcd.mount
              enabled: true
              contents: |
                [Unit]
                Before=local-fs.target
    
                [Mount]
                What=/dev/disk/by-label/var-lib-etcd
                Where=/var/lib/etcd
                Type=xfs
                TimeoutSec=120s
    
                [Install]
                RequiredBy=local-fs.target
            - name: sync-var-lib-etcd-to-etcd.service
              enabled: true
              contents: |
                [Unit]
                Description=Sync etcd data if new mount is empty
                DefaultDependencies=no
                After=var-lib-etcd.mount var.mount
                Before=crio.service
    
                [Service]
                Type=oneshot
                RemainAfterExit=yes
                ExecCondition=/usr/bin/test ! -d /var/lib/etcd/member
                ExecStart=/usr/sbin/setsebool -P rsync_full_access 1
                ExecStart=/bin/rsync -ar /sysroot/ostree/deploy/rhcos/var/lib/etcd/ /var/lib/etcd/
                ExecStart=/usr/sbin/semanage fcontext -a -t container_var_lib_t '/var/lib/etcd(/.*)?'
                ExecStart=/usr/sbin/setsebool -P rsync_full_access 0
                TimeoutSec=0
    
                [Install]
                WantedBy=multi-user.target graphical.target
            - name: restorecon-var-lib-etcd.service
              enabled: true
              contents: |
                [Unit]
                Description=Restore recursive SELinux security contexts
                DefaultDependencies=no
                After=var-lib-etcd.mount
                Before=crio.service
    
                [Service]
                Type=oneshot
                RemainAfterExit=yes
                ExecStart=/sbin/restorecon -R /var/lib/etcd/
                TimeoutSec=0
    
                [Install]
                WantedBy=multi-user.target graphical.target
    1 <encoded_etcd_find_secondary-device_script> 替换为您记下的编码脚本内容。
验证步骤
  • 在节点的调试 shell 中运行 grep /var/lib/etcd /proc/mounts 命令以确保已挂载磁盘

    $ oc debug node/<node_name>
    # grep -w "/var/lib/etcd" /proc/mounts
    示例输出
    /dev/sdb /var/lib/etcd xfs rw,seclabel,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota 0 0

对于大型且密集的集群,如果键空间增长过大并超过空间配额,etcd 的性能可能会下降。定期维护和碎片整理 etcd 以释放数据存储中的空间。监控 Prometheus 以获取 etcd 指标,并在需要时进行碎片整理;否则,etcd 可能会发出集群范围的警报,使集群进入维护模式,该模式仅接受键读取和删除操作。

监控这些关键指标

  • etcd_server_quota_backend_bytes,这是当前的配额限制

  • etcd_mvcc_db_total_size_in_use_in_bytes,这表示历史压缩后的实际数据库使用情况

  • etcd_mvcc_db_total_size_in_bytes,这显示数据库大小,包括等待碎片整理的可用空间

在导致磁盘碎片化的事件(例如 etcd 历史压缩)之后,碎片整理 etcd 数据以回收磁盘空间。

历史压缩每五分钟自动执行一次,并在后端数据库中留下空隙。etcd 可以使用此碎片空间,但主机文件系统无法使用。必须碎片整理 etcd 以使此空间可用于主机文件系统。

碎片整理会自动发生,但您也可以手动触发它。

自动碎片整理适用于大多数情况,因为 etcd 运算符使用集群信息来确定对用户最有效的操作。

etcd 运算符会自动碎片整理磁盘。无需人工干预。

通过查看以下日志之一,验证碎片整理过程是否成功

  • etcd 日志

  • cluster-etcd-operator pod

  • 运算符状态错误日志

自动碎片整理可能会导致各种 OpenShift 核心组件(例如 Kubernetes 控制器管理器)出现领导者选举失败,从而触发失败组件的重启。重启是无害的,它要么触发故障转移到下一个正在运行的实例,要么组件在重启后恢复工作。

成功碎片整理的示例日志输出
etcd member has been defragmented: <member_name>, memberID: <member_id>
碎片整理失败的示例日志输出
failed defrag on member: <member_name>, memberID: <member_id>: <error_message>

当需要使用手动碎片整理时,Prometheus 警报会发出指示。警报会在两种情况下显示

  • 当 etcd 使用超过 50% 的可用空间超过 10 分钟时

  • 当 etcd 长期(超过 10 分钟)仅使用了其数据库总大小的不到 50% 时

您还可以使用 PromQL 表达式 (etcd_mvcc_db_total_size_in_bytes - etcd_mvcc_db_total_size_in_use_in_bytes)/1024/1024 检查碎片整理后将释放的 etcd 数据库大小(以 MB 为单位),以此确定是否需要进行碎片整理。

碎片整理 etcd 是一个阻塞操作。etcd 成员在碎片整理完成之前不会响应。因此,请在每个 pod 上的碎片整理操作之间至少等待一分钟,以允许集群恢复。

请按照以下步骤对每个 etcd 成员进行 etcd 数据碎片整理。

先决条件
  • 您拥有以 cluster-admin 角色访问集群的权限。

步骤
  1. 确定哪个 etcd 成员是领导者,因为领导者应该最后进行碎片整理。

    1. 获取 etcd pod 列表

      $ oc -n openshift-etcd get pods -l k8s-app=etcd -o wide
      示例输出
      etcd-ip-10-0-159-225.example.redhat.com                3/3     Running     0          175m   10.0.159.225   ip-10-0-159-225.example.redhat.com   <none>           <none>
      etcd-ip-10-0-191-37.example.redhat.com                 3/3     Running     0          173m   10.0.191.37    ip-10-0-191-37.example.redhat.com    <none>           <none>
      etcd-ip-10-0-199-170.example.redhat.com                3/3     Running     0          176m   10.0.199.170   ip-10-0-199-170.example.redhat.com   <none>           <none>
    2. 选择一个 pod 并运行以下命令以确定哪个 etcd 成员是领导者

      $ oc rsh -n openshift-etcd etcd-ip-10-0-159-225.example.redhat.com etcdctl endpoint status --cluster -w table
      示例输出
      Defaulting container name to etcdctl.
      Use 'oc describe pod/etcd-ip-10-0-159-225.example.redhat.com -n openshift-etcd' to see all of the containers in this pod.
      +---------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
      |         ENDPOINT          |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
      +---------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
      |  https://10.0.191.37:2379 | 251cd44483d811c3 |   3.5.9 |  104 MB |     false |      false |         7 |      91624 |              91624 |        |
      | https://10.0.159.225:2379 | 264c7c58ecbdabee |   3.5.9 |  104 MB |     false |      false |         7 |      91624 |              91624 |        |
      | https://10.0.199.170:2379 | 9ac311f93915cc79 |   3.5.9 |  104 MB |      true |      false |         7 |      91624 |              91624 |        |
      +---------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+

      根据此输出的 IS LEADER 列,https://10.0.199.170:2379 端点是领导者。将此端点与上一步的输出匹配,领导者的 pod 名称是 etcd-ip-10-0-199-170.example.redhat.com

  2. 碎片整理 etcd 成员。

    1. 连接到正在运行的 etcd 容器,传入 _不是_ 领导者的 pod 名称

      $ oc rsh -n openshift-etcd etcd-ip-10-0-159-225.example.redhat.com
    2. 取消设置 ETCDCTL_ENDPOINTS 环境变量

      sh-4.4# unset ETCDCTL_ENDPOINTS
    3. 碎片整理 etcd 成员

      sh-4.4# etcdctl --command-timeout=30s --endpoints=https://127.0.0.1:2379 defrag
      示例输出
      Finished defragmenting etcd member[https://127.0.0.1:2379]

      如果出现超时错误,请增加 --command-timeout 的值,直到命令成功。

    4. 验证数据库大小是否已减小

      sh-4.4# etcdctl endpoint status -w table --cluster
      示例输出
      +---------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
      |         ENDPOINT          |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
      +---------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
      |  https://10.0.191.37:2379 | 251cd44483d811c3 |   3.5.9 |  104 MB |     false |      false |         7 |      91624 |              91624 |        |
      | https://10.0.159.225:2379 | 264c7c58ecbdabee |   3.5.9 |   41 MB |     false |      false |         7 |      91624 |              91624 |        | (1)
      | https://10.0.199.170:2379 | 9ac311f93915cc79 |   3.5.9 |  104 MB |      true |      false |         7 |      91624 |              91624 |        |
      +---------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+

      此示例显示此 etcd 成员的数据库大小现在为 41 MB,而起始大小为 104 MB。

    5. 重复这些步骤以连接到其他每个 etcd 成员并对其进行碎片整理。始终最后碎片整理领导者。

      碎片整理操作之间至少等待一分钟,以允许 etcd pod 恢复。在 etcd pod 恢复之前,etcd 成员将不会响应。

  3. 如果由于超过空间配额而触发任何 NOSPACE 警报,请清除它们。

    1. 检查是否存在任何 NOSPACE 警报

      sh-4.4# etcdctl alarm list
      示例输出
      memberID:12345678912345678912 alarm:NOSPACE
    2. 清除警报

      sh-4.4# etcdctl alarm disarm

您可以将控制平面硬件速度设置为 "Standard""Slower" 或默认值 ""

默认设置允许系统决定使用哪种速度。此值支持从不存在此功能的版本进行升级,因为系统可以选择以前版本的 value。

通过选择其他值之一,您将覆盖默认值。如果您由于超时或丢失心跳而看到许多领导者选举,并且您的系统设置为 """Standard",请将硬件速度设置为 "Slower",以使系统对增加的延迟更具容忍性。

要更改 etcd 的硬件速度容差,请完成以下步骤。

步骤
  1. 输入以下命令查看当前值

    $ oc describe etcd/cluster | grep "Control Plane Hardware Speed"
    示例输出
    Control Plane Hardware Speed:  <VALUE>

    如果输出为空,则表示尚未设置该字段,应将其视为默认值 ("")。

  2. 输入以下命令更改值。将 <value> 替换为有效值之一:"""Standard""Slower"

    $ oc patch etcd/cluster --type=merge -p '{"spec": {"controlPlaneHardwareSpeed": "<value>"}}'

    下表显示每个配置文件的心跳间隔和领导者选举超时。这些值可能会更改。

    配置文件

    ETCD_HEARTBEAT_INTERVAL

    ETCD_LEADER_ELECTION_TIMEOUT

    ""

    取决于平台而异

    取决于平台而异

    标准

    100

    1000

    较慢

    500

    2500

  3. 查看输出

    示例输出
    etcd.operator.openshift.io/cluster patched

    如果您输入任何非有效值,则会显示错误输出。例如,如果您输入 "Faster" 作为值,则输出如下所示

    示例输出
    The Etcd "cluster" is invalid: spec.controlPlaneHardwareSpeed: Unsupported value: "Faster": supported values: "", "Standard", "Slower"
  4. 输入以下命令验证值是否已更改

    $ oc describe etcd/cluster | grep "Control Plane Hardware Speed"
    示例输出
    Control Plane Hardware Speed:  ""
  5. 等待 etcd pod 滚动更新

    $ oc get pods -n openshift-etcd -w

    以下输出显示 master-0 的预期条目。在继续之前,请等待所有 master 显示 4/4 Running 状态。

    示例输出
    installer-9-ci-ln-qkgs94t-72292-9clnd-master-0           0/1     Pending             0          0s
    installer-9-ci-ln-qkgs94t-72292-9clnd-master-0           0/1     Pending             0          0s
    installer-9-ci-ln-qkgs94t-72292-9clnd-master-0           0/1     ContainerCreating   0          0s
    installer-9-ci-ln-qkgs94t-72292-9clnd-master-0           0/1     ContainerCreating   0          1s
    installer-9-ci-ln-qkgs94t-72292-9clnd-master-0           1/1     Running             0          2s
    installer-9-ci-ln-qkgs94t-72292-9clnd-master-0           0/1     Completed           0          34s
    installer-9-ci-ln-qkgs94t-72292-9clnd-master-0           0/1     Completed           0          36s
    installer-9-ci-ln-qkgs94t-72292-9clnd-master-0           0/1     Completed           0          36s
    etcd-guard-ci-ln-qkgs94t-72292-9clnd-master-0            0/1     Running             0          26m
    etcd-ci-ln-qkgs94t-72292-9clnd-master-0                  4/4     Terminating         0          11m
    etcd-ci-ln-qkgs94t-72292-9clnd-master-0                  4/4     Terminating         0          11m
    etcd-ci-ln-qkgs94t-72292-9clnd-master-0                  0/4     Pending             0          0s
    etcd-ci-ln-qkgs94t-72292-9clnd-master-0                  0/4     Init:1/3            0          1s
    etcd-ci-ln-qkgs94t-72292-9clnd-master-0                  0/4     Init:2/3            0          2s
    etcd-ci-ln-qkgs94t-72292-9clnd-master-0                  0/4     PodInitializing     0          3s
    etcd-ci-ln-qkgs94t-72292-9clnd-master-0                  3/4     Running             0          4s
    etcd-guard-ci-ln-qkgs94t-72292-9clnd-master-0            1/1     Running             0          26m
    etcd-ci-ln-qkgs94t-72292-9clnd-master-0                  3/4     Running             0          20s
    etcd-ci-ln-qkgs94t-72292-9clnd-master-0                  4/4     Running             0          20s
  6. 输入以下命令查看值

    $ oc describe -n openshift-etcd pod/<ETCD_PODNAME> | grep -e HEARTBEAT_INTERVAL -e ELECTION_TIMEOUT

    这些值可能没有从默认值更改。

其他资源

您可以为每个 etcd 实例设置以 gibibytes (GiB) 为单位的磁盘配额。如果您为 etcd 实例设置磁盘配额,则可以指定 8 到 32 之间的整数值。默认值为 8。您只能指定递增的值。

如果您遇到 低空间 警报,则可能需要增加磁盘配额。此警报表示集群太大,无法容纳在 etcd 中,即使进行了自动压缩和碎片整理也是如此。如果您看到此警报,则需要立即增加磁盘配额,因为 etcd 空间不足后,写入将失败。

您可能需要增加磁盘配额的另一种情况是,如果您遇到 数据库增长过快 警报。此警报警告数据库可能在接下来的四个小时内增长过大。在这种情况下,请考虑增加磁盘配额,以免最终遇到 低空间 警报和可能的写入失败。

如果您增加了磁盘配额,则您指定的磁盘空间不会立即被保留。相反,etcd 可以根据需要增长到该大小。确保 etcd 运行在比您为磁盘配额指定的值更大的专用磁盘上。

对于大型 etcd 数据库,控制平面节点必须具有额外的内存和存储空间。因为您必须考虑 API 服务器缓存,所以所需的最小内存至少是 etcd 数据库配置大小的三倍。

增加 etcd 数据库大小仅为技术预览功能。技术预览功能不受 Red Hat 生产服务级别协议 (SLA) 的支持,可能功能不完整。Red Hat 不建议在生产环境中使用它们。这些功能可让客户提前访问即将推出的产品功能,从而能够在开发过程中测试功能并提供反馈。

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

要更改 etcd 的数据库大小,请完成以下步骤。

步骤
  1. 通过输入以下命令检查每个 etcd 实例的磁盘配额的当前值

    $ oc describe etcd/cluster | grep "Backend Quota"
    示例输出
    Backend Quota Gi B: <value>
  2. 通过输入以下命令更改磁盘配额的值

    $ oc patch etcd/cluster --type=merge -p '{"spec": {"backendQuotaGiB": <value>}}'
    示例输出
    etcd.operator.openshift.io/cluster patched
验证
  1. 通过输入以下命令验证是否已设置磁盘配额的新值

    $ oc describe etcd/cluster | grep "Backend Quota"

    etcd 运算符会自动推出具有新值的新 etcd 实例。

  2. 通过输入以下命令验证 etcd pod 是否正在运行

    $ oc get pods -n openshift-etcd

    以下输出显示预期的条目。

    示例输出
    NAME                                                   READY   STATUS      RESTARTS   AGE
    etcd-ci-ln-b6kfsw2-72292-mzwbq-master-0                4/4     Running     0          39m
    etcd-ci-ln-b6kfsw2-72292-mzwbq-master-1                4/4     Running     0          37m
    etcd-ci-ln-b6kfsw2-72292-mzwbq-master-2                4/4     Running     0          41m
    etcd-guard-ci-ln-b6kfsw2-72292-mzwbq-master-0          1/1     Running     0          51m
    etcd-guard-ci-ln-b6kfsw2-72292-mzwbq-master-1          1/1     Running     0          49m
    etcd-guard-ci-ln-b6kfsw2-72292-mzwbq-master-2          1/1     Running     0          54m
    installer-5-ci-ln-b6kfsw2-72292-mzwbq-master-1         0/1     Completed   0          51m
    installer-7-ci-ln-b6kfsw2-72292-mzwbq-master-0         0/1     Completed   0          46m
    installer-7-ci-ln-b6kfsw2-72292-mzwbq-master-1         0/1     Completed   0          44m
    installer-7-ci-ln-b6kfsw2-72292-mzwbq-master-2         0/1     Completed   0          49m
    installer-8-ci-ln-b6kfsw2-72292-mzwbq-master-0         0/1     Completed   0          40m
    installer-8-ci-ln-b6kfsw2-72292-mzwbq-master-1         0/1     Completed   0          38m
    installer-8-ci-ln-b6kfsw2-72292-mzwbq-master-2         0/1     Completed   0          42m
    revision-pruner-7-ci-ln-b6kfsw2-72292-mzwbq-master-0   0/1     Completed   0          43m
    revision-pruner-7-ci-ln-b6kfsw2-72292-mzwbq-master-1   0/1     Completed   0          43m
    revision-pruner-7-ci-ln-b6kfsw2-72292-mzwbq-master-2   0/1     Completed   0          43m
    revision-pruner-8-ci-ln-b6kfsw2-72292-mzwbq-master-0   0/1     Completed   0          42m
    revision-pruner-8-ci-ln-b6kfsw2-72292-mzwbq-master-1   0/1     Completed   0          42m
    revision-pruner-8-ci-ln-b6kfsw2-72292-mzwbq-master-2   0/1     Completed   0          42m
  3. 通过输入以下命令验证 etcd pod 的磁盘配额值是否已更新

    $ oc describe -n openshift-etcd pod/<etcd_podname> | grep "ETCD_QUOTA_BACKEND_BYTES"

    该值可能未从默认值 8 更改。

    示例输出
    ETCD_QUOTA_BACKEND_BYTES:                               8589934592

    虽然您设置的值是 GiB 为单位的整数,但输出中显示的值已转换为字节。

如果您在尝试增加 etcd 的数据库大小时遇到问题,以下故障排除步骤可能会有所帮助。

如果您指定的值小于 8,则会看到以下错误消息

$ oc patch etcd/cluster --type=merge -p '{"spec": {"backendQuotaGiB": 5}}'
错误消息示例
The Etcd "cluster" is invalid:
* spec.backendQuotaGiB: Invalid value: 5: spec.backendQuotaGiB in body should be greater than or equal to 8
* spec.backendQuotaGiB: Invalid value: "integer": etcd backendQuotaGiB may not be decreased

要解决此问题,请指定 832 之间的整数。

如果您指定的值大于 32,则会看到以下错误消息

$ oc patch etcd/cluster --type=merge -p '{"spec": {"backendQuotaGiB": 64}}'
错误消息示例
The Etcd "cluster" is invalid: spec.backendQuotaGiB: Invalid value: 64: spec.backendQuotaGiB in body should be less than or equal to 32

要解决此问题,请指定 832 之间的整数。

如果将值设置为 832 之间的有效值,则无法减小该值。否则,您会看到一条错误消息。

  1. 通过输入以下命令查看当前值

    $ oc describe etcd/cluster | grep "Backend Quota"
    示例输出
    Backend Quota Gi B: 10
  2. 通过输入以下命令减小磁盘配额值

    $ oc patch etcd/cluster --type=merge -p '{"spec": {"backendQuotaGiB": 8}}'
    错误消息示例
    The Etcd "cluster" is invalid: spec.backendQuotaGiB: Invalid value: "integer": etcd backendQuotaGiB may not be decreased
  3. 要解决此问题,请指定大于 10 的整数。