全部產品
Search
文件中心

Container Service for Kubernetes:啟用容器L3 Cache及記憶體頻寬隔離

更新時間:Oct 25, 2024

在Kubernetes叢集中,多個Pod可能會混合在部署在同一節點上,共用宿主機的三級緩衝L3 Cache(Last Level Cache)和記憶體頻寬MBA(Memory Bandwidth Allocation),在資源緊張時產生資源爭搶。推薦您開啟L3 Cache及記憶體頻寬的隔離能力,在資源競爭時優先保障高優應用的服務品質。

說明

為了協助您更好地理解本文檔並使用本功能,推薦您參見Kubernetes官方文檔瞭解Pod Qos類為容器和 Pod 分配記憶體資源等概念。

為什麼需要容器L3 Cache及記憶體頻寬隔離

為了充分利用節點資源,您可能會將多個Pod混合部署在同一台機器上,共用宿主機的L3 Cache記憶體頻寬。如果不進行隔離控制,叢集資源緊張時,不同優先順序的Pod在使用L3 Cache和記憶體頻寬等資源時可能會出現資源競爭,導致高優任務無法得到足夠的資源保障,繼而使得服務品質受到影響。

RDT(Resource Director Technology)提供了對不同優先順序應用的資源隔離能力。您可以通過ConfigMap開啟L3 Cache及MBA隔離功能,並在BE類型Pod的YAML中聲明可使用的L3 Cache和MBA資源量,以有效保障LS應用的服務品質。

前提條件

費用說明

ack-koordinator組件本身的安裝和使用是免費的,不過需要注意的是,在以下情境中可能產生額外的費用:

  • ack-koordinator是非託管組件,安裝後將佔用Worker節點資源。您可以在安裝組件時配置各模組的資源申請量。

  • ack-koordinator預設會將資源畫像、精細化調度等功能的監控指標以Prometheus的格式對外透出。若您配置組件時開啟了ACK-Koordinator開啟Prometheus監控指標選項並使用了阿里雲Prometheus服務,這些指標將被視為自訂指標併產生相應費用。具體費用取決於您的叢集規模和應用數量等因素。建議您在啟用此功能前,仔細閱讀阿里雲Prometheus計費說明,瞭解自訂指標的免費額度和收費策略。您可以通過賬單和用量查詢,監控和管理您的資源使用方式。

步驟一:檢查節點核心是否已開啟RDT

在使用容器L3 Cache及記憶體頻寬隔離功能前,您需要確保已開啟核心RDT能力。

  1. 執行以下命令,查看核心RDT能力是否開啟。

    cat /proc/cmdline

    預期輸出:

    #其他內容已省略,本樣本僅顯示BOOT_IMAGE欄位的RDT部分。
    BOOT_IMAGE=... rdt=cmt,l3cat,l3cdp,mba

    若輸出內容中包含l3catmba選項,表示核心RDT能力已開啟;若不包含,請執行下一步操作。

  2. 開啟核心RDT能力。

    1. 編輯/etc/default/grub檔案,在GRUB_CMDLINE_LINUX欄位增加RDT相關配置。

      # 其餘內容已省略,本樣本僅顯示GRUB_CMDLINE_LINUX欄位的RDT部分。
      GRUB_CMDLINE_LINUX="... rdt=cmt,mbmtotal,mbmlocal,l3cat,l3cdp,mba" 
      重要

      請使用空格符將新增的RDT配置與其他內容進行分隔。

    2. 執行以下命令,產生新版本grub.cfg檔案。

      # 檔案路徑以實際情況為準。
      sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    3. 執行以下命令,重啟節點。

      sudo systemctl reboot

步驟二:使用L3 Cache及MBA隔離功能

核心RDT開啟後,您可以在叢集維度通過ConfigMap啟用L3 Cache及MBA隔離功能。您也可以自行配置不同QoS類Pod可使用的L3 Cache和MBA資源比例,實現更靈活的、更精細化的資源管理。啟用後,您可以在Pod YAML中聲明其QoS層級,約束可使用L3 Cache及MBA資源量。

  1. 使用以下YAML內容,建立configmap.yaml檔案。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: ack-slo-config
      namespace: kube-system
    data:
      resource-qos-config: |
        {
          "clusterStrategy": {
            "beClass": {
              "resctrlQOS": {
                "enable": true # 配置為true,開啟對BE類型Pod的L3 Cache及MBA隔離機制。
              }
            }
          }
        }
  2. 查看命名空間kube-system下是否存在ConfigMap ack-slo-config

    • 存在:使用PATCH方式進行更新,避免幹擾ConfigMap中其他配置項。

      kubectl patch cm -n kube-system ack-slo-config --patch "$(cat configmap.yaml)"
    • 不存在:執行以下命令建立ConfigMap。

      kubectl apply -f configmap.yaml
  3. (可選)使用以下YAML內容,配置進階參數,按照QoS進行精細化配置。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: ack-slo-config
      namespace: kube-system
    data:
      resource-qos-config: |
        {
          "clusterStrategy": {
            "lsClass": {
              "resctrlQOS": {
                "enable": true,
                "catRangeEndPercent": 100,
                "mbaPercent": 100
              }
            },
            "beClass": {
              "resctrlQOS": {
                "enable": true,
                "catRangeEndPercent": 30,
                "mbaPercent": 100
              }
            }
          }
        }

    主要參數說明如下。

    參數

    類型

    取值範圍

    說明

    enable

    Boolean

    • true

    • false

    • true:叢集開啟L3 Cache及MBA的隔離能力。

    • false:叢集關閉L3 Cache及MBA的隔離能力。

    catRangeEndPercent

    Int

    [0, 100]

    對應QoS可以使用的L3 Cache比例。單位為百分比。LS等級預設值為100,BE等級預設值為30

    mbaPercent

    Int

    [0, 100]

    對應QoS可以使用的MBA比例。單位為百分比。當前MBA只支援以10%的粒度進行調節,LS等級和BE等級的預設值均為100

  4. 參見以下YAML內容,約束BE Pod對L3 Cache及MBA資源的使用,建立pod-demo.yaml。

    說明

    如需在工作負載(例如Deployment)中配置,請在template.metadata欄位下配置Pod對應的Annotation。

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-demo
      labels:
        koordinator.sh/qosClass: 'BE' # 指定Pod的QoS層級為BE。
    spec:
      containers:
      - name: pod-demo
        image: polinux/stress
        resources:
          requests:
            cpu: 1
            memory: "50Mi"
          limits:
            cpu: 1
            memory: "1Gi"
        command: ["stress"]
        args: ["--vm", "1", "--vm-bytes", "256M", "-c", "2", "--vm-hang", "1"]
  5. 執行以下命令,將pod-demo.yaml部署到叢集中。

    kubectl apply -f pod-demo.yaml