すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:カスタムイメージからcgroup v2ノードを作成する

最終更新日:Nov 14, 2024

Kubernetesはcgroupsを使用してコンテナーリソースを分離します。 cgroup v2は、リソースにアクセスするための統合APIデザインを提供し、ポッドに基づくリソースモニタリングと要求リダイレクトをサポートします。 cgroup v2は、複数のリソースにわたるリソース分離も強化します。 このトピックでは、ack-image-builderを使用してcgroup v2カスタムイメージを構築し、Container Service for Kubernetes (ACK) コンソールでカスタムイメージからcgroup v2ノードを作成する方法について説明します。

背景情報

CGroup

Kubernetesはcgroupsを使用してコンテナーリソースを分離します。 cgroupsにはv1とv2の2つのバージョンがあります。 cgroup v2は、強化されたユーザーエクスペリエンスと次の機能を提供します。

  • リソースにアクセスするための統合APIデザイン。

  • 圧力ストール情報 (PSI) などの新機能。

  • 拡張バークレーパケットフィルタ (eBPF) プログラムは、cgroupsに添付することができる。 ポッドに基づくリソース監視と要求リダイレクトもサポートされています。

  • 複数のリソースにわたるリソースの分離を強化しました。

    • ネットワークメモリやカーネルメモリなど、さまざまな種類のメモリ割り当てを一元管理します。

    • 即時ではないリソースの変更を説明します。 例えば、ページキャッシュのライトバックに関する統計を収集して、即時でない入出力を制限することができる。

Kubernetes 1.18はcgroup v2をAlphaに、Kubernetes 1.22はcgroup v2をBetaに、Kubernetes 1.25はcgroup v2をGA (general availability) にします。 詳細については、「cgroup v2について」をご参照ください。

ack-image-builder

ack-image-builderは、Alibaba Cloudが提供するイメージビルドツールです。 ack-image-builderは、イメージ構築の自動化に役立ちます。 ack-image-builderを使用して、cgroup v2のOSイメージを構築し、そのイメージからACKクラスターにcgroup v2ノードを作成できます。 詳細については、「ack-image-builder」をご参照ください。

ack-image-builderは、オープンソースの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を使用してポッドリソースを制御する場合は、ack-koordinatorがcgroup v2と互換性がない場合に備えて、ack-koordinatorのバージョンが1.1.0以降であることを確認してください。 詳細については、「ack-koordinator (ack-slo-manager) 」をご参照ください。

使用上の注意

Javaアプリケーションを使用する場合は、cgroup v2との互換性を確保するために、JDK 11.0.16またはJDK 15以降のバージョンを使用することを推奨します。 詳しくは、「JDK-8230305」をご参照ください。

前提条件

カスタムイメージ機能を使用するために、Quota Centerコンソールでアプリケーションを送信しました。

手順

ack-image-builderを使用してカスタムイメージを作成するには、次の手順を実行します。

cgroup

  1. Packerをインストールします。

    1. [Packerのインストール] ページに移動し、オペレーティングシステムに基づいてソフトウェアバージョンを選択し、Packerをインストールします。 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ペアをインポートします。 AccessKeyペアは、カスタムイメージを作成するときに一時的なリソースを作成するために使用されます。

      export ALICLOUD_ACCESS_KEY=XXXXXX
      export ALICLOUD_SECRET_KEY=XXXXXX
    2. 次のコマンドを実行して、カスタムイメージを作成します。

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

      cgroup_modeパラメーターは、イメージのcgroupモードを指定します。 デフォルト値はCGROUP_MODE_V1です。 パラメーターをCGROUP_MODE_V2に設定して、cgroup v2モードを使用するカスタムイメージを作成します。

      クリックして詳細を表示

      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. カスタムイメージからACKクラスターを作成します。

    次の例は、ACK Proクラスターの作成方法を示しています。

    1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

    2. の右上隅にクラスターページをクリックします。Kubernetesクラスターの作成.

    3. On theマネージドKubernetesタブで、作成したカスタムイメージに基づいてクラスターを設定し、プロンプトに従ってクラスターの作成を完了します。

      必要に応じて、次のキーパラメーターを設定します。 パラメーターの詳細については、「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でコンテナIOPSを制限する

cgroupv1によって収集された非同期ブロックIOPSは不正確であり、コンテナIOPSの値および限界は通常、実際の値よりもはるかに小さい。

cgroup v2は、コンテナの非同期IOPSを正確に収集できます。 したがって、cgroup v2を使用してコンテナIOPSを制限できます。

コンテナIOPSを制限する方法:

cgroup v2のio.maxインターフェイスファイルにディスクIOPS制限を書き込み、cgroupがコンテナーで使用できる最大IOPSを制限します。

詳細については、「コントロールグループv2」をご参照ください。

例:

コンテナの起動時にcgroup v2を使用してコンテナIOPSを制限し、ddコマンドを実行してIOPSが指定された帯域幅よりも低いことを確認します。

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" specifies the IOPS limit.
# "253:0" specifies the device ID of the disk. Replace it with the device ID of the disk that you write.
# "wbps" specifies the input upper limit of a disk. 10485760 is used in this example, which equals to 10MB/s.

前述のポッドをクラスターにデプロイした後、ポッドログを印刷して、ディスクのIOPSが10メガバイト/秒に制限されていることを確認できます。

# 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