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と互換性があることを確認してください。
|
使用上の注意
Javaアプリケーションを使用する場合は、cgroup v2との互換性を確保するために、JDK 11.0.16またはJDK 15以降のバージョンを使用することを推奨します。 詳しくは、「JDK-8230305」をご参照ください。
前提条件
カスタムイメージ機能を使用するために、Quota Centerコンソールでアプリケーションを送信しました。
手順
ack-image-builderを使用してカスタムイメージを作成するには、次の手順を実行します。
Packerをインストールします。
[Packerのインストール] ページに移動し、オペレーティングシステムに基づいてソフトウェアバージョンを選択し、Packerをインストールします。 Packerのインストール方法の詳細については、「Packerのインストール」をご参照ください。
次のコマンドを実行して、Packerのバージョンを表示します。
packer version
期待される出力:
Packer v1.*.*
上記の出力は、Packerがインストールされていることを示します。
次のコマンドを実行して、cgroup v2設定テンプレートをダウンロードします。
git clone https://github.com/AliyunContainerService/ack-image-builder.git cd ack-image-builder
cgroup v2ノードの作成に使用するカスタムイメージを作成します。
次のコマンドを実行して、AccessKeyペアをインポートします。 AccessKeyペアは、カスタムイメージを作成するときに一時的なリソースを作成するために使用されます。
export ALICLOUD_ACCESS_KEY=XXXXXX export ALICLOUD_SECRET_KEY=XXXXXX
次のコマンドを実行して、カスタムイメージを作成します。
packer build -var cgroup_mode=CGROUP_MODE_V2例 /ack-aliyunlinux3.json
cgroup_mode
パラメーターは、イメージのcgroupモードを指定します。 デフォルト値はCGROUP_MODE_V1
です。 パラメーターをCGROUP_MODE_V2
に設定して、cgroup v2モードを使用するカスタムイメージを作成します。scripts/set-cgroupv2.sh
はcgroupのバージョンを示し、m-xxxxxxxxxxxxxxxxx
はカスタムイメージのIDを示します。
カスタムイメージからACKクラスターを作成します。
次の例は、ACK Proクラスターの作成方法を示しています。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
の右上隅にクラスターページをクリックします。Kubernetesクラスターの作成.
On theマネージドKubernetesタブで、作成したカスタムイメージに基づいてクラスターを設定し、プロンプトに従ってクラスターの作成を完了します。
必要に応じて、次のキーパラメーターを設定します。 パラメーターの詳細については、「ACK管理クラスターの作成」をご参照ください。
クラスターパラメーターを設定したら、[次へ]: [ノードプールの設定] をクリックします。
[ノードプールの設定] ウィザードページで、[詳細オプションの表示] をクリックします。 [カスタムイメージ] の横にある [カスタムイメージの選択] をクリックします。
[カスタムイメージの選択] ダイアログボックスで、カスタムイメージを選択し、[使用] をクリックします。
クラスターのその他の設定を完了します。
カスタムイメージからクラスターが作成された後、クラスター内のノードはカスタムイメージを使用します。 スケーリング中にノードプールに追加された後続のノードも、このイメージを使用します。
クラスターノードにログインし、次のコマンドを実行して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