3.2. etcd を別のディスクに移動する
etcd を共有ディスクから別のディスクに移動して、パフォーマンスの問題を防止または解決できます。
Machine Config Operator (MCO) は、OpenShift Container Platform 4.19 コンテナーストレージのセカンダリーディスクをマウントします。
このエンコードされたスクリプトは、次のデバイスタイプのデバイス名のみをサポートします。
- 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/ などのルートファイルシステムの一部を、インストール済みノードの別のディスクまたはパーティションに移動しません。
コントロールプレーンマシンセットを使用する場合は、この手順がサポートされません。
手順
新しいディスクをクラスターに接続し、デバッグシェルで
lsblkコマンドを実行して、ディスクがノード内で検出されることを確認します。$ oc debug node/<node_name># lsblklsblkコマンドで報告された新しいディスクのデバイス名をメモします。次のスクリプトを作成し、名前を
etcd-find-secondary-device.shにします。#!/bin/bash set -uo pipefail for device in <device_type_glob>; do1 /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>は、ブロックデバイスタイプのシェル glob に置き換えます。SCSI または SATA ドライブの場合は/dev/sd*を使用し、仮想ドライブの場合は/dev/vd*を使用し、NVMe ドライブの場合は/dev/nvme*[0-9]*n*を使用します。
etcd-find-secondary-device.shスクリプトから base64 でエンコードされた文字列を作成し、その内容をメモします。$ base64 -w0 etcd-find-secondary-device.sh次のような内容を含む
etcd-mc.ymlという名前のMachineConfigYAML ファイルを作成します。apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: master name: 98-var-lib-etcd spec: config: ignition: version: 3.5.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>を、メモしておいたエンコードされたスクリプトの内容に置き換えます。
作成した
MachineConfigYAML ファイルを適用します。$ oc create -f etcd-mc.yml
検証手順
ノードのデバッグシェルで
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