5.5. より高い仮想マシンワークロード密度の設定
メモリー (RAM) をオーバーコミットすることで、ノード上の仮想マシン数を増やすことができます。仮想マシンのワークロード密度を高めることは、次のような状況で役立ちます。
- 類似したワークロードが多数ある場合。
- 過小使用のワークロードがある場合。
使用率の高いシステムでは、メモリーのオーバーコミットによりワークロードのパフォーマンスが低下する可能性があります。
5.5.1. wasp-agent を使用して仮想マシンのワークロード密度を高める
wasp-agent
コンポーネントは、ワーカーノードにスワップリソースを割り当てることで、メモリーのオーバーコミットを容易にします。また、スワップ I/O トラフィックや使用率が大きいことでノードがリスクにさらされている場合の Pod のエビクションも管理します。
スワップリソースは、Burstable
Quality of Service (QoS) クラスの仮想マシンワークロード (VM Pod) にのみ割り当てることができます。Guaranteed
QoS クラスの仮想マシン Pod と、仮想マシンに属していない任意の QoS クラスの Pod は、リソースをスワップできません。
QoS クラスの説明は、Configure Quality of Service for Pods (Kubernetes ドキュメント) を参照してください。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 -
cluster-admin
ロールでクラスターにログイン済みである。 - メモリーオーバーコミット率が定義済みである。
- ノードはワーカープールに属している。
wasp-agent
コンポーネントは、Open Container Initiative (OCI) フックをデプロイして、ノードレベルでコンテナーのスワップ使用を有効にします。低レベルの性質上、DaemonSet
オブジェクトには特権が必要です。
手順
スワップの使用を許可するように
kubelet
サービスを設定します。次の例に示すパラメーターを使用して
KubeletConfig
ファイルを作成または編集します。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
オブジェクトを作成してスワップをプロビジョニングします。以下に例を示します。apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: worker name: 90-worker-swap spec: config: ignition: version: 3.4.0 systemd: units: - contents: | [Unit] Description=Provision and enable swap ConditionFirstBoot=no [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 && \ sudo systemctl set-property --runtime system.slice MemorySwapMax=0 IODeviceLatencyTargetSec=\"/ 50ms\"" [Install] RequiredBy=kubelet-dependencies.target enabled: true name: swap-provision.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 adm new-project wasp
$ oc create sa -n wasp wasp
$ oc create clusterrolebinding wasp --clusterrole=cluster-admin --serviceaccount=wasp:wasp
$ oc adm policy add-scc-to-user -n wasp privileged -z wasp
次のコマンドを実行して、ワーカーノードが新しい設定と同期されるまで待ちます。
$ oc wait mcp worker --for condition=Updated=True --timeout=-1s
次のコマンドを実行して、wasp エージェントイメージのプル URL を決定します。
$ oc get csv -n openshift-cnv -l=operators.coreos.com/kubevirt-hyperconverged.openshift-cnv -ojson | jq '.items[0].spec.relatedImages[] | select(.name|test(".*wasp-agent.*")) | .image'
次の例に示すように、
DaemonSet
オブジェクトを作成してwasp-agent
をデプロイします。kind: DaemonSet apiVersion: apps/v1 metadata: name: wasp-agent namespace: wasp labels: app: wasp tier: node spec: selector: matchLabels: name: wasp template: metadata: annotations: description: >- Configures swap for workloads labels: name: wasp spec: containers: - env: - name: SWAP_UTILIZATION_THRESHOLD_FACTOR value: "0.8" - name: MAX_AVERAGE_SWAP_IN_PAGES_PER_SECOND value: "1000" - name: MAX_AVERAGE_SWAP_OUT_PAGES_PER_SECOND value: "1000" - name: AVERAGE_WINDOW_SIZE_SECONDS value: "30" - name: VERBOSITY value: "1" - name: FSROOT value: /host - name: NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName image: >- quay.io/openshift-virtualization/wasp-agent:v4.17 1 imagePullPolicy: Always name: wasp-agent resources: requests: cpu: 100m memory: 50M securityContext: privileged: true volumeMounts: - mountPath: /host name: host - mountPath: /rootfs name: rootfs hostPID: true hostUsers: true priorityClassName: system-node-critical serviceAccountName: wasp terminationGracePeriodSeconds: 5 volumes: - hostPath: path: / name: host - hostPath: path: / name: rootfs updateStrategy: type: RollingUpdate rollingUpdate: maxUnavailable: 10% maxSurge: 0
- 1
image
の値を、前の手順のイメージ URL に置き換えます。
PrometheusRule
オブジェクトを作成してアラートルールをデプロイします。以下に例を示します。apiVersion: monitoring.coreos.com/v1 kind: PrometheusRule metadata: labels: tier: node wasp.io: "" name: wasp-rules namespace: wasp spec: groups: - name: alerts.rules rules: - alert: NodeHighSwapActivity annotations: description: High swap activity detected at {{ $labels.instance }}. The rate of swap out and swap in exceeds 200 in both operations in the last minute. This could indicate memory pressure and may affect system performance. runbook_url: https://github.com/openshift-virtualization/wasp-agent/tree/main/docs/runbooks/NodeHighSwapActivity.md summary: High swap activity detected at {{ $labels.instance }}. expr: rate(node_vmstat_pswpout[1m]) > 200 and rate(node_vmstat_pswpin[1m]) > 200 for: 1m labels: kubernetes_operator_component: kubevirt kubernetes_operator_part_of: kubevirt operator_health_impact: warning severity: warning
次のコマンドを実行して、
cluster-monitoring
ラベルをwasp
namespace に追加します。$ oc label namespace wasp openshift.io/cluster-monitoring="true"
Web コンソールまたは CLI を使用して、OpenShift Virtualization でメモリーのオーバーコミットを有効にします。
Web コンソール
-
OpenShift Container Platform Web コンソールで、Virtualization
Overview Settings General settings Memory concentration に移動します。 - Enable memory density をオンに設定します。
CLI
以下のコマンドを実行します。
$ oc patch --type=merge \ -f <../manifests/openshift/hco-set-memory-overcommit.yaml> \ --patch-file <../manifests/openshift/hco-set-memory-overcommit.yaml>
-
OpenShift Container Platform Web コンソールで、Virtualization
検証
wasp-agent
のデプロイメントを確認するには、次のコマンドを実行します。$ oc rollout status ds wasp-agent -n wasp
デプロイメントが成功すると、次のメッセージが表示されます。
出力例
daemon set "wasp-agent" successfully rolled out
スワップが正しくプロビジョニングされていることを確認するには、次の手順を実行します。
次のコマンドを実行して、ワーカーノードのリストを表示します。
$ oc get nodes -l node-role.kubernetes.io/worker
リストからノードを選択し、次のコマンドを実行してそのメモリー使用量を表示します。
$ oc debug node/<selected_node> -- free -m 1
- 1
<selected_node>
をノード名に置き換えます。
スワップがプロビジョニングされている場合、
Swap:
行にゼロより大きい値が表示されます。表5.1 出力例 total
used
free
shared
buff/cache
available
Mem:
31846
23155
1044
6014
14483
8690
Swap:
8191
2337
5854
次のコマンドを実行して、OpenShift Virtualization のメモリーオーバーコミットメント設定を確認します。
$ oc get -n openshift-cnv HyperConverged kubevirt-hyperconverged -o jsonpath="{.spec.higherWorkloadDensity.memoryOvercommitPercentage}"
出力例
150
返される値は、以前に設定した値と一致する必要があります。
5.5.2. 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.5.2.1. 環境変数
次の環境変数を使用して、エビクション条件の計算に使用される値を調整できます。
環境変数 | 機能 |
|
|
|
|
|
高スワップ使用率の計算に使用される |
| 平均スワップ使用量の計算間隔を設定します。 |