5.5. より高い仮想マシンワークロード密度の設定
仮想マシンの数を増やすには、メモリー (RAM) の量をオーバーコミットして、クラスター内の仮想マシンワークロード密度を高く設定します。
より高いワークロード密度を設定する機能は、テクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビューの機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行いフィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
次のワークロードは、高いワークロード密度に特に適しています。
- 多数の類似ワークロード
- 過少使用されたワークロード
メモリーがオーバーコミットされると、ワークロード密度が高くなりますが、使用率の高いシステムのワークロードパフォーマンスが低下する可能性もあります。
5.5.1. wasp-agent
を使用して仮想マシンワークロード密度を高く設定する
wasp-agent
コンポーネントにより、OpenShift Container Platform クラスターはスワップリソースを仮想マシンワークロードに割り当てることができます。スワップの使用は、ワーカーノードでのみサポートされます。
スワップリソースは、Burstable
Quality of Service (QoS) クラスの仮想マシンワークロード (VM Pod) にのみ割り当てることができます。Guaranteed
QoS クラスの仮想マシン Pod と、仮想マシンに属していない任意の QoS クラスの Pod は、リソースをスワップできません。
QoS クラスの説明は、Configure Quality of Service for Pods (Kubernetes ドキュメント) を参照してください。
前提条件
-
oc
ツールが利用できる。 - cluster-admin ロールでクラスターにログイン済みである。
- メモリーのオーバーコミット率が定義済みである。
- ノードはワーカープールに属している。
手順
次のコマンドを入力して、特権サービスアカウントを作成します。
$ 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
注記wasp-agent
コンポーネントは、OCI フックをデプロイして、ノードレベルでコンテナーのスワップ使用を有効にします。低レベルの性質上、DaemonSet
オブジェクトには特権が必要です。次のように
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: serviceAccountName: wasp hostPID: true hostUsers: true terminationGracePeriodSeconds: 5 containers: - name: wasp-agent image: >- registry.redhat.io/container-native-virtualization/wasp-agent-rhel9:v4.16 imagePullPolicy: Always env: - name: "FSROOT" value: "/host" resources: requests: cpu: 100m memory: 50M securityContext: privileged: true volumeMounts: - name: host mountPath: "/host" volumes: - name: host hostPath: path: "/" priorityClassName: system-node-critical updateStrategy: type: RollingUpdate rollingUpdate: maxUnavailable: 10% maxSurge: 0 status: {}
スワップを許可するように
kubelet
サービスを設定します。例に示すように、
KubeletConfiguration
ファイルを作成します。KubeletConfiguration
ファイルの例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 evictionSoft: memory.available: "1Gi" evictionSoftGracePeriod: memory.available: "10s"
クラスターが既存の
KubeletConfiguration
ファイルをすでに使用している場合は、spec
セクションに以下を追加します。apiVersion: machineconfiguration.openshift.io/v1 kind: KubeletConfig metadata: name: custom-config # ... spec # ... kubeletConfig: evictionSoft: memory.available: 1Gi evictionSoftGracePeriod: memory.available: 1m30s failSwapOn: false
以下のコマンドを実行します。
$ oc wait mcp worker --for condition=Updated=True
次のとおり、スワップをプロビジョニングするための
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
アラートルールを次のようにデプロイします。
apiVersion: monitoring.openshift.io/v1 kind: AlertingRule metadata: name: wasp-alerts namespace: openshift-monitoring spec: groups: - name: wasp.rules rules: - alert: NodeSwapping annotations: description: Node {{ $labels.instance }} is swapping at a rate of {{ printf "%.2f" $value }} MB/s runbook_url: https://github.com/openshift-virtualization/wasp-agent/tree/main/runbooks/alerts/NodeSwapping.md summary: A node is swapping memory pages expr: | # In MB/s irate(node_memory_SwapFree_bytes{job="node-exporter"}[5m]) / 1024^2 > 0 for: 1m labels: severity: critical
OpenShift Container Platform Web コンソールを使用するか、次の例のとおり HyperConverged カスタムリソース (CR) ファイルを編集して、メモリーオーバーコミットを使用するように OpenShift Virtualization を設定します。
以下に例を示します。
apiVersion: hco.kubevirt.io/v1beta1 kind: HyperConverged metadata: name: kubevirt-hyperconverged namespace: openshift-cnv spec: higherWorkloadDensity: memoryOvercommitPercentage: 150
次のコマンドを入力して、クラスター内のコンピュートノードにすべての設定を適用します。
$ oc patch --type=merge \ -f <../manifests/hco-set-memory-overcommit.yaml> \ --patch-file <../manifests/hco-set-memory-overcommit.yaml>
注記すべての設定を適用すると、すべての
MachineConfigPool
ロールアウトの完了後にのみスワップ機能が完全に利用可能になります。
検証
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
スワップが正しくプロビジョニングされている場合、次のようにゼロより大きい値が表示されます。
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
返される値 (たとえば
150
) は、以前に設定した値と一致する必要があります。