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 ドキュメント) を参照してください。

仮想マシンマニフェストで spec.domain.resources.requests.memory を使用すると、メモリーのオーバーコミット設定が無効になります。代わりに spec.domain.memory.guest を使用してください。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールでクラスターにログイン済みである。
  • メモリーオーバーコミット率が定義済みである。
  • ノードはワーカープールに属している。
注記

wasp-agent コンポーネントは、Open Container Initiative (OCI) フックをデプロイして、ノードレベルでコンテナーのスワップ使用を有効にします。低レベルの性質上、DaemonSet オブジェクトには特権が必要です。

手順

  1. スワップの使用を許可するように kubelet サービスを設定します。

    1. 次の例に示すパラメーターを使用して 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
      Copy to Clipboard Toggle word wrap

    2. 次のコマンドを実行して、ワーカーノードが新しい設定と同期されるまで待ちます。

      $ oc wait mcp worker --for condition=Updated=True --timeout=-1s
      Copy to Clipboard Toggle word wrap
  2. 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
    Copy to Clipboard Toggle word wrap

    最悪のシナリオに備えて十分なスワップ領域を確保するには、オーバーコミットされた RAM と同量以上のスワップ領域をプロビジョニングしておく必要があります。次の式を使用して、ノードにプロビジョニングするスワップ領域の量を計算します。

    NODE_SWAP_SPACE = NODE_RAM * (MEMORY_OVER_COMMIT_PERCENT / 100% - 1)
    Copy to Clipboard Toggle word wrap

    NODE_SWAP_SPACE = 16 GB * (150% / 100% - 1)
                   = 16 GB * (1.5 - 1)
                   = 16 GB * (0.5)
                   =  8 GB
    Copy to Clipboard Toggle word wrap

  3. 次のコマンドを実行して、特権付きサービスアカウントを作成します。

    $ oc adm new-project wasp
    Copy to Clipboard Toggle word wrap
    $ oc create sa -n wasp wasp
    Copy to Clipboard Toggle word wrap
    $ oc create clusterrolebinding wasp --clusterrole=cluster-admin --serviceaccount=wasp:wasp
    Copy to Clipboard Toggle word wrap
    $ oc adm policy add-scc-to-user -n wasp privileged -z wasp
    Copy to Clipboard Toggle word wrap
  4. 次のコマンドを実行して、ワーカーノードが新しい設定と同期されるまで待ちます。

    $ oc wait mcp worker --for condition=Updated=True --timeout=-1s
    Copy to Clipboard Toggle word wrap
  5. 次のコマンドを実行して、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'
    Copy to Clipboard Toggle word wrap
  6. 次の例に示すように、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: "1000000000"
                - name: MAX_AVERAGE_SWAP_OUT_PAGES_PER_SECOND
                  value: "1000000000"
                - 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.19 
    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
    Copy to Clipboard Toggle word wrap
    1
    image の値を、前の手順のイメージ URL に置き換えます。
  7. 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
    Copy to Clipboard Toggle word wrap
  8. 次のコマンドを実行して、cluster-monitoring ラベルを wasp namespace に追加します。

    $ oc label namespace wasp openshift.io/cluster-monitoring="true"
    Copy to Clipboard Toggle word wrap
  9. Web コンソールまたは CLI を使用して、OpenShift Virtualization でメモリーのオーバーコミットを有効にします。

    • Web コンソール

      1. OpenShift Container Platform Web コンソールで、Virtualization Overview Settings General settings Memory density に移動します。
      2. Enable memory density をオンに設定します。
    • CLI

      • より高いメモリー密度を有効にし、オーバーコミットレートを設定するように OpenShift Virtualization を設定します。

        $ oc -n openshift-cnv patch HyperConverged/kubevirt-hyperconverged --type='json' -p='[ \
          { \
          "op": "replace", \
          "path": "/spec/higherWorkloadDensity/memoryOvercommitPercentage", \
          "value": 150 \
          } \
        ]'
        Copy to Clipboard Toggle word wrap

        正常な出力

        hyperconverged.hco.kubevirt.io/kubevirt-hyperconverged patched
        Copy to Clipboard Toggle word wrap

検証

  1. wasp-agent のデプロイメントを確認するには、次のコマンドを実行します。

    $ oc rollout status ds wasp-agent -n wasp
    Copy to Clipboard Toggle word wrap

    デプロイメントが成功すると、次のメッセージが表示されます。

    出力例

    daemon set "wasp-agent" successfully rolled out
    Copy to Clipboard Toggle word wrap

  2. スワップが正しくプロビジョニングされていることを確認するには、次の手順を実行します。

    1. 次のコマンドを実行して、ワーカーノードのリストを表示します。

      $ oc get nodes -l node-role.kubernetes.io/worker
      Copy to Clipboard Toggle word wrap
    2. リストからノードを選択し、次のコマンドを実行してそのメモリー使用量を表示します。

      $ oc debug node/<selected_node> -- free -m 
      1
      Copy to Clipboard Toggle word wrap
      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

         
  3. 次のコマンドを実行して、OpenShift Virtualization のメモリーオーバーコミットメント設定を確認します。

    $ oc -n openshift-cnv get HyperConverged/kubevirt-hyperconverged -o jsonpath='{.spec.higherWorkloadDensity}{"\n"}'
    Copy to Clipboard Toggle word wrap

    出力例

    {"memoryOvercommitPercentage":150}
    Copy to Clipboard Toggle word wrap

    返される値は、以前に設定した値と一致する必要があります。

5.5.2. wasp-agent コンポーネントの削除

メモリーのオーバーコミットが不要になった場合は、クラスターから wasp-agent コンポーネントと関連リソースを削除できます。

前提条件

  • cluster-admin ロールでクラスターにログイン済みである。
  • OpenShift CLI (oc) がインストールされている。

手順

  1. wasp-agent DaemonSet を削除します。

    $ oc delete daemonset wasp-agent -n wasp
    Copy to Clipboard Toggle word wrap
  2. アラートルールがデプロイされている場合は、削除します。

    $ oc delete prometheusrule wasp-rules -n wasp
    Copy to Clipboard Toggle word wrap
  3. 必要に応じて、他のリソースが依存していない場合は、wasp namespace を削除します。

    $ oc delete namespace wasp
    Copy to Clipboard Toggle word wrap
  4. メモリーのオーバーコミットメント設定を元に戻します。

    $ oc -n openshift-cnv patch HyperConverged/kubevirt-hyperconverged \
      --type='json' \
      -p='[{"op": "remove", "path": "/spec/higherWorkloadDensity"}]'
    Copy to Clipboard Toggle word wrap
  5. スワップメモリーをプロビジョニングする MachineConfig を削除します。

    $ oc delete machineconfig 90-worker-swap
    Copy to Clipboard Toggle word wrap
  6. 関連する KubeletConfig を削除します。

    $ oc delete kubeletconfig custom-config
    Copy to Clipboard Toggle word wrap
  7. ワーカーノードがリコンサイルされるまで待ちます。

    $ oc wait mcp worker --for condition=Updated=True --timeout=-1s
    Copy to Clipboard Toggle word wrap

検証

  • wasp-agent DaemonSet が削除されていることを確認します。

    $ oc get daemonset -n wasp
    Copy to Clipboard Toggle word wrap

    wasp-agent はリストに表示されないはずです。

  • ノードでスワップが有効になっていないことを確認します。

    $ oc debug node/<selected_node> -- free -m
    Copy to Clipboard Toggle word wrap

    Swap: 行に 0 と表示されていること、またはスワップ領域がプロビジョニング済みと表示されないことを確認します。

5.5.3. wasp-agent が使用する Pod エビクション条件

システムの負荷が高く、ノードが危険な状態にある場合、wasp エージェントは Pod エビクションを管理します。次のいずれかの条件が満たされた場合、エビクションがトリガーされます。

高スワップ I/O トラフィック

この条件は、スワップ関連の I/O トラフィックが過度に高い場合に満たされます。

状態

averageSwapInPerSecond > maxAverageSwapInPagesPerSecond
&&
averageSwapOutPerSecond > maxAverageSwapOutPagesPerSecond
Copy to Clipboard Toggle word wrap

デフォルトでは、maxAverageSwapInPagesPerSecondmaxAverageSwapOutPagesPerSecond は 1000 ページに設定されています。平均を計算するデフォルトの間隔は 30 秒です。

高スワップ使用率

この条件は、スワップ使用率が過度に高く、現在の仮想メモリー使用量が各要因が考慮されたしきい値を超えた場合に満たされます。MachineConfig オブジェクトの NODE_SWAP_SPACE 設定がこの状態に影響を与える可能性があります。

状態

nodeWorkingSet + nodeSwapUsage < totalNodeMemory + totalSwapMemory × thresholdFactor
Copy to Clipboard Toggle word wrap

5.5.3.1. 環境変数

次の環境変数を使用して、エビクション条件の計算に使用される値を調整できます。

Expand

環境変数

機能

MAX_AVERAGE_SWAP_IN_PAGES_PER_SECOND

maxAverageSwapInPagesPerSecond の値を設定します。

MAX_AVERAGE_SWAP_OUT_PAGES_PER_SECOND

maxAverageSwapOutPagesPerSecond の値を設定します。

SWAP_UTILIZATION_THRESHOLD_FACTOR

高スワップ使用率の計算に使用される thresholdFactor 値を設定します。

AVERAGE_WINDOW_SIZE_SECONDS

平均スワップ使用量の計算間隔を設定します。

トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat