5.6. より高い仮想マシンワークロード密度の設定
メモリー (RAM) をオーバーコミットすることで、ノード上の仮想マシン数を増やすことができます。仮想マシンのワークロード密度を高めることは、次のような状況で役立ちます。
- 類似したワークロードが多数ある場合。
- 過小使用のワークロードがある場合。
使用率の高いシステムでは、メモリーのオーバーコミットによりワークロードのパフォーマンスが低下する可能性があります。
5.6.1. wasp-agent を使用して仮想マシンのワークロード密度を高める リンクのコピーリンクがクリップボードにコピーされました!
wasp-agent コンポーネントは、ワーカーノードにスワップリソースを割り当てることで、メモリーのオーバーコミットを容易にします。また、スワップ I/O トラフィックや使用率が大きいことでノードがリスクにさらされている場合の Pod の退避も管理します。
HyperConverged カスタムリソース(CR)を最初に作成すると、memoryOvercommitPercentage が 100 を超える場合に wasp-agent コンポーネントが自動的にデプロイされます。
スワップリソースは、Burstable Quality of Service (QoS) クラスの仮想マシンワークロード (VM Pod) にのみ割り当てることができます。Guaranteed QoS クラスの仮想マシン Pod と、仮想マシンに属していない任意の QoS クラスの Pod は、リソースをスワップできません。
QoS クラスの説明は、Configure Quality of Service for Pods (Kubernetes ドキュメント) を参照してください。
仮想マシンマニフェストで spec.domain.resources.requests.memory を使用すると、メモリーのオーバーコミット設定が無効になります。代わりに spec.domain.memory.guest を使用してください。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-adminロールでクラスターにログイン済みである。 - メモリーオーバーコミット率が定義済みである。
- ノードはワーカープールに属している。
wasp-agent コンポーネントは、Open Container Initiative (OCI) フックをデプロイして、ノードレベルでコンテナーのスワップ使用を有効にします。低レベルの性質上、DaemonSet オブジェクトには特権が必要です。
手順
スワップの使用を許可するように
kubeletサービスを設定します。次の例に示すパラメーターを使用して
KubeletConfigファイルを作成または編集します。apiVersion: machineconfiguration.openshift.io/v1 kind: KubeletConfig metadata: name: custom-config spec: machineConfigPoolSelector: matchLabels: pools.operator.machineconfiguration.openshift.io/worker: '' # MCP #machine.openshift.io/cluster-api-machine-role: worker # machine #node-role.kubernetes.io/worker: '' # node kubeletConfig: failSwapOn: false次のコマンドを実行して、ワーカーノードが新しい設定と同期されるまで待ちます。
$ oc wait mcp worker --for condition=Updated=True --timeout=-1s
MachineConfigオブジェクトを作成し、スワップをプロビジョニングします。以下の例に示されているパラメーターを使用して
MachineConfigファイルを作成します。apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: worker name: 90-worker-swap spec: config: ignition: version: 3.5.0 systemd: units: - contents: | [Unit] Description=Provision and enable swap ConditionFirstBoot=no ConditionPathExists=!/var/tmp/swapfile [Service] Type=oneshot Environment=SWAP_SIZE_MB=5000 ExecStart=/bin/sh -c "sudo dd if=/dev/zero of=/var/tmp/swapfile count=${SWAP_SIZE_MB} bs=1M && \ sudo chmod 600 /var/tmp/swapfile && \ sudo mkswap /var/tmp/swapfile && \ sudo swapon /var/tmp/swapfile && \ free -h" [Install] RequiredBy=kubelet-dependencies.target enabled: true name: swap-provision.service - contents: | [Unit] Description=Restrict swap for system slice ConditionFirstBoot=no [Service] Type=oneshot ExecStart=/bin/sh -c "sudo systemctl set-property --runtime system.slice MemorySwapMax=0 IODeviceLatencyTargetSec=\"/ 50ms\"" [Install] RequiredBy=kubelet-dependencies.target enabled: true name: cgroup-system-slice-config.service最悪のシナリオに備えて十分なスワップ領域を確保するには、オーバーコミットされた RAM と同量以上のスワップ領域をプロビジョニングしておく必要があります。次の式を使用して、ノードにプロビジョニングするスワップ領域の量を計算します。
NODE_SWAP_SPACE = NODE_RAM * (MEMORY_OVER_COMMIT_PERCENT / 100% - 1)以下に例を示します。
NODE_SWAP_SPACE = 16 GB * (150% / 100% - 1) = 16 GB * (1.5 - 1) = 16 GB * (0.5) = 8 GB次のコマンドを実行して、ワーカーノードが新しい設定と同期されるまで待ちます。
$ oc wait mcp worker --for condition=Updated=True --timeout=-1s
Web コンソールまたは CLI を使用して、OpenShift Virtualization でメモリーのオーバーコミットを有効にします。
Web コンソール
-
OpenShift Container Platform Web コンソールで、Virtualization
Overview Settings General settings Memory density に移動します。 - Enable memory density をオンに設定します。
-
OpenShift Container Platform Web コンソールで、Virtualization
CLI
より高いメモリー密度を有効にし、オーバーコミットレートを設定するように OpenShift Virtualization を設定します。
$ oc -n openshift-cnv patch HyperConverged/kubevirt-hyperconverged --type='json' -p='[ \ { \ "op": "replace", \ "path": "/spec/higherWorkloadDensity/memoryOvercommitPercentage", \ "value": 150 \ } \ ]'正常な出力:
hyperconverged.hco.kubevirt.io/kubevirt-hyperconverged patched
検証
wasp-agentのデプロイメントを確認するには、次のコマンドを実行します。$ oc rollout status ds wasp-agent -n openshift-cnvデプロイメントが成功すると、次のメッセージが表示されます。
出力例:
daemon set "wasp-agent" successfully rolled outスワップが正しくプロビジョニングされていることを確認するには、次の手順を実行します。
次のコマンドを実行して、ワーカーノードのリストを表示します。
$ oc get nodes -l node-role.kubernetes.io/workerリストからノードを選択し、次のコマンドを実行してそのメモリー使用量を表示します。
$ oc debug node/<selected_node> -- free -m1 - 1
<selected_node>をノード名に置き換えます。
スワップがプロビジョニングされている場合、
Swap:行にゼロより大きい値が表示されます。Expand 表5.1 出力例 total
used
free
shared
buff/cache
available
Mem:
31846
23155
1044
6014
14483
8690
Swap:
8191
2337
5854
次のコマンドを実行して、OpenShift Virtualization のメモリーオーバーコミットメント設定を確認します。
$ oc -n openshift-cnv get HyperConverged/kubevirt-hyperconverged -o jsonpath='{.spec.higherWorkloadDensity}{"\n"}'出力例:
{"memoryOvercommitPercentage":150}返される値は、以前に設定した値と一致する必要があります。
5.6.2. wasp-agent コンポーネントの削除 リンクのコピーリンクがクリップボードにコピーされました!
メモリーのオーバーコミットが不要になった場合は、クラスターから wasp-agent コンポーネントと関連リソースを削除できます。
前提条件
-
cluster-adminロールでクラスターにログインしている。 -
OpenShift CLI (
oc) がインストールされている。
手順
次のコマンドを実行して、メモリーのオーバーコミット設定を元に戻します。
$ oc -n openshift-cnv patch HyperConverged/kubevirt-hyperconverged \ --type='json' \ -p='[{"op": "remove", "path": "/spec/higherWorkloadDensity"}]'次のコマンドを実行して、スワップメモリーをプロビジョニングする
MachineConfigを削除します。$ oc delete machineconfig 90-worker-swap次のコマンドを実行して、関連付けられた
KubeletConfigカスタムリソース(CR)を削除します。$ oc delete kubeletconfig custom-config以下のコマンドを実行して出力を確認し、ワーカーノードが調整されるのを待ちます。
$ oc wait mcp worker --for condition=Updated=True --timeout=-1s
検証
以下のコマンドを実行して出力を確認し、スワップがノードで有効にされていないことを確認します。
$ oc debug node/<selected_node> -- free -mSwap:行に0と表示されていること、またはスワップ領域がプロビジョニング済みと表示されないことを確認します。
5.6.3. wasp-agent が使用する Pod 退避条件 リンクのコピーリンクがクリップボードにコピーされました!
システムの負荷が高く、ノードが危険な状態にある場合、wasp エージェントは Pod 退避を管理します。エビクションは、以下の条件のいずれかが発生した場合にトリガーされます。
- 高スワップ I/O トラフィック
この状態は、スワップ関連の I/O トラフィックが非常に高い場合に発生します。
条件:
averageSwapInPerSecond > maxAverageSwapInPagesPerSecond && averageSwapOutPerSecond > maxAverageSwapOutPagesPerSecondデフォルトでは、
maxAverageSwapInPagesPerSecondとmaxAverageSwapOutPagesPerSecondの値は 1000 ページです。平均を計算するデフォルトの間隔は 30 秒です。- 高スワップ使用率
この状態は、スワップの使用率が過剰に高く、現在の仮想メモリー使用量が推定しきい値を超えると発生します。
MachineConfigオブジェクトのNODE_SWAP_SPACE設定がこの状態に影響を与える可能性があります。条件:
nodeWorkingSet + nodeSwapUsage < totalNodeMemory + totalSwapMemory × thresholdFactor
5.6.3.1. 環境変数 リンクのコピーリンクがクリップボードにコピーされました!
次の環境変数を使用して、退避条件の計算に使用される値を調整できます。
| 環境変数 | 機能 |
|
|
|
|
|
|
|
|
高スワップ使用率の計算に使用される |
|
| 平均スワップ使用量の計算間隔を設定します。 |