全部產品
Search
文件中心

Container Service for Kubernetes:使用自訂鏡像建立CGroup V2節點

更新時間:Jul 19, 2024

Kubernetes採用CGroup實現容器的資源隔離。CGroup V2統一了訪問資源的路徑,支援Pod層級的資源監控、網路重新導向,同時在跨多資源協調上具備更強的資源隔離能力。本文介紹如何使用ack-image-builder工具構建CGroup V2的自訂鏡像,並在ACK控制台使用自訂鏡像建立CGroup V2節點。

背景資訊

CGroup

Kubernetes採用CGroup實現容器的資源隔離。CGroup分為V1和V2版本,V2版本提供了更一致的體驗和更豐富的功能。主要特性如下。

  • 統一了訪問資源的路徑,各種資源處於統一路徑下。

  • 新增PSI等功能特性。

  • 支援CGroup層級的eBPF掛載,可以實現Pod層級的資源監控、網路重新導向等。

  • 在跨多資源協調上具備更強的資源隔離能力。

    • 統一地管理各種類型的記憶體配置,例如網路記憶體、Kernel記憶體等。

    • 支援非同步資源變化的統計,例如通過Page Cache的Write-back統計實現非同步IO的限制。

Kubernetes在1.18版本中支援CGroup V2,進入Alpha階段,在1.22版本中進入Beta階段,在1.25中進入GA。更多資訊,請參見About cgroup v2

ack-image-builder

ack-image-builder是阿里雲推出的一款鏡像構建工具,旨在通過簡易的方式自動化構建鏡像。利用ack-image-builder可以構建出CGroup V2的系統鏡像,方便您在ACK叢集中添加CGroup V2的節點。關於ack-image-builder,請參見ack-image-builder

ack-image-builder基於開源工具HashiCorp Packer開發,HashiCorp Packer提供預設配置模板和校正指令碼。關於HashiCorp Packer,請參見HashiCorp Packer

使用限制

限制項

說明

作業系統

目前僅Alibaba Cloud Linux 3支援CGroup V2。所以僅支援使用Alibaba Cloud Linux 3作為基礎鏡像來構建支援CGroup V2的自訂鏡像。

運行時

僅支援containerd運行時。

Kubernetes

1.28及以上版本。

應用或組件

如果叢集上啟動並執行應用或者組件依賴於CGroup,請確保它們與CGroup V2相容。

  • 一般監控類的組件依賴CGroup,需要確保它們與CGroup V2相容。

  • 使用ack-koordinator組件來控制Pod資源,版本需為v1.1.0以上,以便相容CGroup V2。更多資訊,請參見ack-koordinator(ack-slo-manager)

注意事項

如果使用Java的應用,建議採用JDK 11.0.16或者JDK 15之後的版本,以便與CGroup V2相容。更多資訊,請參見JDK-8230305

前提條件

已前往配額平台申請使用自訂鏡像。

操作步驟

使用ack-image-builder建立Kubernetes叢集自訂節點鏡像的步驟如下。

cgroup

  1. 安裝Packer。

    1. 單擊下載頁面,選擇作業系統對應的軟體版本並安裝Packer。關於安裝Packer,請參見安裝文檔

    2. 執行如下命令,查看Packer版本資訊。

      packer version

      預期輸出:

      Packer v1.*.*

      表示Packer已安裝成功。

  2. 執行如下命令,下載CGroup V2的配置模板。

    git clone https://github.com/AliyunContainerService/ack-image-builder.git
    cd ack-image-builder
  3. 構建CGroup V2的節點自訂鏡像。

    1. 執行如下命令,匯入AccessKey資訊用於建立構建鏡像過程中的臨時資源。

      export ALICLOUD_ACCESS_KEY=XXXXXX
      export ALICLOUD_SECRET_KEY=XXXXXX
    2. 執行如下命令,製作自訂鏡像。

      packer build  -var cgroup_mode=CGROUP_MODE_V2 examples/ack-aliyunlinux3.json

      其中cgroup_mode的參數為鏡像採用的CGroup模式,預設為CGROUP_MODE_V1。此處指定為CGROUP_MODE_V2,構建出的自訂鏡像採用CGroup V2的CGroup模式。

      展開查看預期輸出

      salicloud-ecs output will be in this color.
      
      ==> alicloud-ecs: Prevalidating source region and copied regions...
      ==> alicloud-ecs: Prevalidating image name...
          alicloud-ecs: Found image ID: aliyun_3_x64_20G_alibase_20221102.vhd
      ==> alicloud-ecs: Creating temporary keypair: xxxxxx
      ==> alicloud-ecs: Creating vpc...
          alicloud-ecs: Created vpc: xxxxxx
      ==> alicloud-ecs: Creating vswitch...
          alicloud-ecs: Created vswitch: xxxxxx
      ==> alicloud-ecs: Creating security group...
          alicloud-ecs: Created security group: xxxxxx
      ==> alicloud-ecs: Creating instance...
          alicloud-ecs: Created instance: xxxxxx
      ==> alicloud-ecs: Allocating eip...
          alicloud-ecs: Allocated eip: xxxxxx
          alicloud-ecs: Attach keypair xxxxxx to instance: xxxxxx
      ==> alicloud-ecs: Starting instance: xxxxxx
      ==> alicloud-ecs: Using ssh communicator to connect: xx.xx.xx.xx
      ==> alicloud-ecs: Waiting for SSH to become available...
      ==> alicloud-ecs: Connected to SSH!
      ......
      ==> alicloud-ecs: Provisioning with shell script: scripts/set-cgroupv2.sh
          alicloud-ecs: CGROUP_MODE_V2
          alicloud-ecs: set cgroup mode to CGROUP_MODE_V2
      ......
      ==> alicloud-ecs: Stopping instance: xxxxxx
      ==> alicloud-ecs: Waiting instance stopped: xxxxxx
      ==> alicloud-ecs: Creating image: test_image1564110199
          alicloud-ecs: Detach keypair xxxxxx from instance: xxxxxxx
      ==> alicloud-ecs: Cleaning up 'EIP'
      ==> alicloud-ecs: Cleaning up 'instance'
      ==> alicloud-ecs: Cleaning up 'security group'
      ==> alicloud-ecs: Cleaning up 'vSwitch'
      ==> alicloud-ecs: Cleaning up 'VPC'
      ==> alicloud-ecs: Deleting temporary keypair...
      Build 'alicloud-ecs' finished.
      
      ==> Builds finished. The artifacts of successful builds are:
      --> alicloud-ecs: Alicloud images were created:
      
      cn-hangzhou: m-xxxxxxxxxxxxxxxxx

      其中scripts/set-cgroupv2.sh為設定CGroup版本,m-xxxxxxxxxxxxxxxxx為自訂鏡像ID。

  4. 採用CGroup V2鏡像建立叢集。

    下文以建立ACK叢集Pro版為例。

    1. 登入Container Service管理主控台,在左側導覽列選擇叢集

    2. 叢集列表頁面,單擊頁面右上方的建立叢集

    3. ACK託管版頁簽下,配置使用自訂鏡像建立叢集的參數,然後按照頁面指引完成叢集的建立。

      以下僅介紹重點參數的配置方法。關於參數的詳細配置,請參見建立ACK託管叢集

      1. 完成叢集配置後,單擊下一步:節點池配置

      2. 節點池配置嚮導頁面,單擊顯示進階選項。單擊自訂鏡像後面的選擇

      3. 選擇自訂鏡像頁面,選擇目標鏡像,然後單擊使用

      4. 完成叢集的其他配置。

      叢集建立完成後,該叢集的節點會使用了自訂鏡像,後續節點池中擴容的節點也均會使用該鏡像。

  5. 登入叢集節點,執行如下命令查看CGroup類型。驗證叢集中的節點是否採用了CGroup V2。

    df -T /sys/fs/cgroup

    預期結果:

    Filesystem     Type    1K-blocks  Used Available Use% Mounted on
    cgroup2        cgroup2         0     0         0    - /sys/fs/cgroup

    表示叢集中的節點採用了CGroup V2。

CGroup V2常用使用情境

使用CGroup V2限制容器IO速度

"CGroup V1"對非同步"blockio"統計不準確,導致容器的IO的統計和限制通常大大小於實際應用IO的量。

而在"CGroup V2"中會同時將這部分非同步IO統計到正確容器中,所以我們可以採用"CGroup V2"來限制容器的IO。

限制方式:

通過將對應的磁碟的I/O限制寫入到容器的"CGroupV2"的"io.max"限制檔案中達到限制容器IO的效果。

詳細配置內容參考連結

樣本:

在容器啟動時,我們對容器的"CGroupV2"做IO的限制,隨後啟動"dd"命令來驗證限制後整體io被控制在限制的頻寬值:

apiVersion: v1
kind: Pod
metadata:
  name: write-file-pod
spec:
  restartPolicy: Never
  containers:
    - name: dd-container
      image: alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/alinux3
      command:
      - bash
      - -c
      - "yum install -y sysstat; \ 
         echo '253:0 wbps=10485760' > /sys/fs/cgroup$(cat /proc/1/cgroup | awk -F ':' '{print $3}')/io.max; \
         dd if=/dev/zero of=/writefile bs=100M count=10 & iostat -dh 1 30;"
      securityContext:
        privileged: true
# 其中 "echo '253:0 wbps=10485760' > /sys/fs/cgroup/.../io.max"為io限制配置
# "253:0" 為磁碟的裝置id,可以根據實際環境中寫入的磁碟裝置調整
# "wbps"  是磁碟寫入頻寬節流設定, 10485760=10MB/s

將如上Pod部署到叢集中後,查看Pod日誌可以看到磁碟的IO被限制到配置的10MB/s。

# kubectl logs write-file-pod -f  
....
      tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn Device
    91.00         0.0k        10.8M       0.0k      10.8M vda

      tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn Device
    88.00         0.0k         9.6M       0.0k       9.6M vda