Container Service for Kubernetes (ACK) は、安定性、効率性、予測可能性に優れたノード管理を提供します。新しいノードを作成したり、既存のノードプールをスケールアウトしたりする際、ACK は標準化された初期化プロセスに従います。このプロセスでは、ノードプールの設定に基づいてソフトウェアのインストールと構成が完了し、ノードが Kubernetes クラスターに参加します。
適用範囲
このトピックは、クラスターバージョン 1.20 以降を実行するACK マネージドクラスターおよびACK 専用クラスター内の Elastic Compute Service (ECS) ノードプールと EGS ノードプールに適用されます。
プロセスの概要
ステップ 1:ノードの作成
ノードプールのスケールアウトやノードの自動追加のリクエストを受け取ると、ACK はインスタンスタイプ、イメージ、ディスクなどのノードプール設定に基づいて ECS または EGS インスタンスを作成します。その後、オペレーティングシステムはネットワークの設定やシステムディスクのマウントなど、基本的な初期化タスクを完了します。
次に、cloud-init ツールがユーザーデータスクリプトを実行します。このスクリプトは、事前定義済みカスタムデータ スクリプト、ACK 初期化スクリプト、および ユーザーデータ スクリプトで構成されます。
ステップ 2:事前カスタマイズスクリプトの実行
cloud-init は、まず 事前定義済みカスタムデータ スクリプトを実行します。このスクリプトは通常、特定のシステム依存パッケージや監視エージェントのインストール、または予備的な環境チェックと構成の実行に使用されます。
ステップ 3:ACK 初期化スクリプトの実行
この段階には複数のサブステップが含まれており、さまざまなシナリオのニーズに対応するための柔軟なスキップメカニズムが提供されています。
3.1 基本環境の準備
この段階では、ノード上で Kubernetes を実行するために必要な基本環境を構成します。
実行フロー
-
chronyd サービスの起動:ノードの時計が NTP サーバーと同期されるようにします。
-
ノード ID とホスト名の設定:
-
ノード ID:Kubernetes クラスター内のノード ID を計算して設定します。
-
ホスト名:ノードプールに ノード名のカスタマイズ が設定されている場合、この名前はノードのホスト名としても設定されます。
-
-
データディスクの初期化:ノードプールにデータディスクが設定されている場合、システムはデフォルトで辞書式順序 (NVMe 優先) で最後のデータディスクを検出し、フォーマットしてマウントします。このディスクには、containerd の作業ディレクトリ
/var/lib/containerdなど、コンテナランタイム環境が格納されます。
スキップメカニズム
-
データディスクのパーティションとファイルシステムを手動で管理する場合、またはデータを含む既存のデータディスクを使用する場合は、事前カスタマイズデータでファイル
/var/.skip-auto-fdiskを作成して、自動フォーマットをスキップできます。 -
自動フォーマットをスキップしないものの、イメージキャッシュなど元のランタイムディレクトリのデータを保持して移行したい場合は、ファイル
/var/.keep-container-dataを作成できます。データディスクがマウントされた後、システムは古いデータを新しいディレクトリにコピーします。これにより、イメージの再プルを回避できます。
3.2 Kubernetes コンポーネントのインストール
この段階では、Kubernetes の実行に必要なコアコンポーネントをインストールします。
-
kubelet のインストールと構成。詳細については、「ノードプールの Kubelet のカスタム設定」をご参照ください。
-
ランタイムのインストール:containerd などのコンテナランタイムをインストールして構成します。詳細については、「ノードプールの Containerd のカスタム設定」をご参照ください。
3.3 必要に応じたコンポーネントのインストール
ACK は、ノードプールの構成に基づいてコンポーネントをインストールします。
-
異種ハードウェアドライバーと device-plugin のインストール:ノードが GPU や NPU インスタンスなどの異種コンピューティングインスタンスである場合、システムは対応するドライバーと、NVIDIA Device Plugin などの Kubernetes device-plugin を自動的にインストールします。これにより、クラスターはこれらのリソースを認識してスケジューリングできるようになります。
-
イメージアクセラレーションソフトウェアのインストール:コンテナ起動を高速化するためのコンテナイメージのオンデマンドローディングなどの機能が有効になっている場合、システムは関連するアクセラレーションソフトウェアをインストールし、コンテナランタイムの構成を変更してコンテナの起動速度を向上させます。
-
SGX 関連ソフトウェアのインストール:ACK-TEE 機密コンピューティングが有効になっている場合、システムは SGX ドライバーと関連する依存関係をインストールします。これにより、機密コンテナを実行するための信頼できる実行環境が提供されます。
3.4 クラスターへの参加
コアコンポーネントがインストールされると、kubelet が起動し、クラスターの API サーバーに登録されます。登録後、ノードは正式にクラスターに参加し、その初期ステータスは NotReady とマークされます。
3.5 追加の基本ソフトウェアのインストール
ノードの安定性とセキュリティを確保するため、ACK はデフォルトで追加の基本ソフトウェアパッケージをインストールし、セキュリティ更新を実行します。
実行フロー
-
基本ツールパッケージのインストール:ストレージやネットワークの高度な機能をサポートするために、
pigz、container-selinux、zlibなどの共通ツールをインストールします。 -
セキュリティ更新 (Alibaba Cloud Linux のみ):
-
必要に応じた
systemdのアップグレード:安定性と機能を確保するために、systemdのバージョンがアップグレードされることがあります。 -
minimalセキュリティ脆弱性修正の適用:yum update-minimal --exclude kernel* --security -yコマンドを実行して、CVE セキュリティ脆弱性修正を自動的に適用します。
-
スキップメカニズム
-
/var/.skip-yumファイルを作成して、CVE 修正を含むこのステップを完全にスキップできます。これは、オフライン環境や厳密なバージョン管理が必要なシナリオに適しています。 -
/var/.skip-security-fixファイルを作成して、CVE 脆弱性修正のみをスキップし、基本ツールパッケージはインストールすることができます。
3.6 ノードプールの OS 設定の適用
すべてのソフトウェアがインストールおよび更新された後、システムはノードプールの OS 設定を再適用して、すべての設定が最終的な環境で有効であることを確認します。詳細については、「ノードプールの OS パラメーターの管理」をご参照ください。
3.7 必要に応じたセキュリティ強化の実行
ノードプールに設定された セキュリティの強化 機能 (例:Alibaba Cloud OS 強化、) に基づいて、システムは対応するセキュリティ強化スクリプトを実行します。これらのスクリプトは、例えば、カーネルパラメーターを強化し、システムの権限を調整して、企業のセキュリティ仕様を満たします。
ステップ 4:カスタムスクリプトの実行
次に、システムは ユーザーデータ スクリプトを実行します。このスクリプトは通常、アプリケーションのデータカタログの初期化や、コンテナ化されていないヘルパーサービスの起動など、アプリケーションレベルの初期化操作を実行します。
並列実行フロー
状態遷移 (NotReady から Ready へ)
ノードがクラスターに参加し、NotReady 状態になると、ノードの kubelet はコントロールプレーンと継続的に通信します。ノード上の重要なコンポーネントが準備完了となり、ノードがすべてのヘルスチェックに合格すると、そのステータスは自動的に Ready に変わります。その後、Kubernetes スケジューラはノードを利用可能なリソースとみなし、ノードは Pod の受信と実行を開始します。
並列メカニズムの説明
ノードの状態遷移と ユーザーデータ スクリプトの実行は並列タスクです。
-
ブロッキングなし:ユーザーデータ スクリプトの実行と、ノードが
Readyになるプロセスは独立しています。スクリプトの実行結果 (成功、失敗、または実行時間) は、ノードがReady状態に遷移するのを妨げません。 -
実行タイミング:両方のタスクは並行して実行されます。ユーザーデータ スクリプトが終了したときにアプリケーション Pod がノード上で実行されている、またはその逆であると想定しないでください。
-
ログの追跡:カスタムスクリプトの実行ステータスを確認するには、ノードにログインし、
cat /var/log/cloud-init-output.logコマンドを実行して実行ログと最終ステータスを表示します。