5.5. 配置更高的虚拟机工作负载密度


要增加虚拟机 (VM) 的数量,您可以通过过量使用内存 (RAM) 来在集群中配置更高的虚拟机工作负载密度。

重要

配置更高的工作负载密度只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

以下工作负载特别适用于更高的工作负载密度:

  • 许多类似的工作负载
  • 低使用的工作负载
注意

虽然过度使用的内存可能会导致工作负载密度更高,但也可能会降低高使用系统的工作负载性能。

5.5.1. 使用 wasp-agent 来配置更高的虚拟机工作负载密度

wasp-agent 组件允许 OpenShift Container Platform 集群为虚拟机(VM) 工作负载分配交换资源。只有在 worker 节点上才支持交换使用量。

重要

交换资源只能分配给 Burstable 服务质量 (QoS) 类的虚拟机工作负载 (VM pod)。属于虚拟机的 Guaranteed QoS 类和任何 QoS 类的 pod 不能交换资源。

有关 QoS 类的描述,请参阅为 Pod 配置服务质量 (Kubernetes 文档)。

先决条件

  • oc 工具可用。
  • 使用 cluster-admin 角色登录到集群。
  • 定义内存 over-commit 比率。
  • 节点属于 worker 池。

流程

  1. 输入以下命令来创建特权服务帐户:

    $ 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 hook,以便在节点级别上为容器启用交换使用情况。低级性质要求 DaemonSet 对象具有特权。

  2. 通过创建 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: {}
  3. kubelet 服务配置为允许交换:

    1. 如示例所示,创建一个 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
    2. 运行以下命令:

      $ oc wait mcp worker --for condition=Updated=True
  4. 创建 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)

    Example:

    NODE_SWAP_SPACE = 16 GB * (150% / 100% - 1)
                    = 16 GB * (1.5 - 1)
                    = 16 GB * (0.5)
                    =  8 GB
  5. 按如下方式部署警报规则:

    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
  6. 使用 OpenShift Container Platform Web 控制台或编辑 HyperConverged 自定义资源 (CR) 文件,将 OpenShift Virtualization 配置为使用内存过量使用,如下例所示。

    Example:

    apiVersion: hco.kubevirt.io/v1beta1
    kind: HyperConverged
    metadata:
      name: kubevirt-hyperconverged
      namespace: openshift-cnv
    spec:
      higherWorkloadDensity:
        memoryOvercommitPercentage: 150
  7. 输入以下命令将所有配置应用到集群中的计算节点:

    $ oc patch --type=merge \
      -f <../manifests/hco-set-memory-overcommit.yaml> \
      --patch-file <../manifests/hco-set-memory-overcommit.yaml>
    注意

    应用所有配置后,交换功能仅在所有 MachineConfigPool rollouts 完成后完全可用。

验证

  1. 要验证 wasp-agent 的部署,请运行以下命令:

    $  oc rollout status ds wasp-agent -n wasp

    如果部署成功,则会显示以下信息:

    daemon set "wasp-agent" successfully rolled out
  2. 要验证是否正确置备了 swap,请执行以下操作:

    1. 运行以下命令:

      $ oc get nodes -l node-role.kubernetes.io/worker
    2. 从提供的列表中选择节点并运行以下命令:

      $ oc debug node/<selected-node> -- free -m

      如果正确置备了 swap,则会显示大于零的数量,如下所示:

       

      total

      使用的

      free

      shared

      buff/cache

      可用

      Mem:

      31846

      23155

      1044

      6014

      14483

      8690

      Swap:

      8191

      2337

      5854

         
  3. 运行以下命令验证 OpenShift Virtualization 内存过量使用配置:

    $ oc get -n openshift-cnv HyperConverged kubevirt-hyperconverged -o jsonpath="{.spec.higherWorkloadDensity.memoryOvercommitPercentage}"
    150

    返回的值(如 150)必须与之前配置的值匹配。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.