ノードプールの期待されるノード数を設定して、トラフィックの増加に対応するためにスケールアウトしたり、コストを削減するためにスケールインしたりします。
ACK では、ノードの自動スケーリングまたはノードの即時スケーリングを使用して、ワークロードに基づいてノードリソースを調整できます。
仕組み
[期待されるノード数] フィールドは、ノードプールのターゲットノード数を設定します。変更を送信すると、ACK は実際のノード数をそのターゲットに合わせるように動作し、必要に応じて Elastic Compute Service (ECS) インスタンスを作成または削除します。
スケールアウト — 期待されるノード数を現在の数より増やします。 ACK は Auto Scaling を使用して ECS インスタンスをプロビジョニングし、それぞれで cloud-init スクリプトを実行して、プールに追加します。 作成に失敗した場合、ACK は自動的に再試行します。 インスタンスタイプとゾーンは、ノードプールの スケーリングポリシー によって決まります。
スケールイン — [期待されるノード数] を現在の数より減らします。スケールイン中にリリースされるのは、従量課金の ECS インスタンスのみです。ノードのシステムディスクとデータディスクのライフサイクルは、ノードに紐づいています。スケールイン中にノードがリリースされると、そのディスクも一緒にリリースされ、ディスク上のすべてのデータは完全に失われ、回復できません。永続化が必要なデータについては、ストレージがノードのライフサイクルから切り離されるように、PersistentVolume (PV) を使用して管理してください。
Expected Nodes を変更してスケールインがトリガーされると、ACK はノードのドレインに失敗した場合でもノードを削除します。厳密なドレイン要件がある場合は、代わりに対象のノードを手動で削除してください。「ノードの削除」をご参照ください。
スケールイン時の削除順序は、スケーリングポリシーによって異なります:
| スケーリングポリシー | 削除順序 |
|---|---|
| 優先度 | 新しく作成されたインスタンスが最初に削除されます。 |
| 分散バランシング | ゾーンはポリシーによってフィルターされ、ゾーン間の数を均等にするために、新しく作成されたインスタンスが最初に削除されます。 |
| コスト最適化 | インスタンスは vCPU 価格の降順で削除されます。 |
スケールアウト時の課金
課金は、作成された ECS インスタンスの実際の仕様に基づきます。例えば、2 つのインスタンスタイプ、従量課金、および優先度スケーリングポリシーを使用する場合:
-
最優先の vSwitch のゾーンに、2 つのノード A インスタンスが作成されます。
-
ノード A の在庫が不足している場合、2 番目の優先度の vSwitch のゾーンに、3 つのノード B インスタンスが作成されます。
1 時間のコスト = (ノード A の単価 × 2 × 1) + (ノード B の単価 × 3 × 1)。
GPU ノードプール
ebmgn7 または ebmgn7e の ECS ベアメタルインスタンスファミリーからインスタンスを追加する場合、ACK はそれらのインスタンスに残っている Multi-Instance GPU (MIG) 構成をリセットします。このリセットには時間がかかり、インスタンスがクラスターに参加できなくなる可能性があります。
-
参加失敗のトラブルシューティングについては、「ECS ベアメタルインスタンスの追加に失敗した場合はどうすればよいですか?」をご参照ください。
前提条件
以下が準備できていることを確認してください:
-
少なくとも 1 つのノードプールを持つ ACK クラスター
-
(RAM ユーザーの場合、オプション) AliyunOOSLifecycleHook4CSRole ロールが Alibaba Cloud アカウントに割り当てられており、[AliyunRAMReadOnlyAccess] が RAM ユーザーにアタッチされています。
ノードプールのスケーリング
kubectl delete node を実行しないでください。これにより、ECS インスタンスを解放せずに Kubernetes からノードが削除され、ノードプールがキャパシティを追跡できなくなります。ノードプールをスケーリングするには、ACK コンソールを使用してください。
-
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
-
[クラスター] ページで、目的のクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、[ノード] > [ノードプール] を選択します。
-
スケールするノードプールを探し、[アクション] 列の [スケール] をクリックします。
-
(オプション) CloudOps Orchestration Service (OOS) がまだ権限付与されていない場合は、AliyunOOSLifecycleHook4CSRole をクリックしてロールを作成し、権限付与を完了します。
RAM ユーザーを使用する場合、RAM ユーザーに AliyunRAMReadOnlyAccess をアタッチする前に、Alibaba Cloud アカウントに AliyunOOSLifecycleHook4CSRole ロールがあることを確認してください。
-
[期待されるノード数] の値を設定し、変更を確認します。[ステータス] 列は、[更新中]、[スケールアウト中] (または [削除中])、そして [アクティブ] の順に表示が変わります。
-
ステータスが [スケールアウト中] と表示されている場合、ノードプールはスケールアウト中です。[アクティブ] に戻ると、スケールアウトは完了です。
-
ステータスが [削除中] と表示されている場合、ノードプールはスケールイン中です。[アクティブ] に戻ると、スケールインは完了です。
重要クラスターのセキュリティグループが
100.64.0.0/10へのアクセスをブロックしている場合、新しいノードはクラスターに参加できません。 -
スケールアウトタスクの詳細を表示するには、ノードプール名をクリックし、[スケーリングアクティビティ] タブを開きます。
ノードの運用ログを表示します:
grep cloud-init /var/log/messages
ノードがプールに参加した後、/var/log/messages はクリアされ、参加に失敗したエントリのみが保持されます。ノードの参加に失敗した場合、ログは [クラスタータスク] タブのタスク結果に同期されます。
避けるべき操作
以下の操作は、期待されるノード数のメカニズムをバイパスし、調整ループやデータ損失を引き起こす可能性があります。
| 操作 | 現象 | 代替策 |
|---|---|---|
kubectl delete node |
Container Service for Kubernetes (ACK) は、Kubernetes のノードリストではなく、スケーリンググループ内の ECS インスタンスに対して期待されるノード数を追跡します。ECS インスタンスは実行を継続しますが、ノードは [不明] と表示されます。 | ノードプール名をクリックし、[ノード] タブを開いてノードを削除します。必要に応じて [ECS インスタンスのリリース] を選択します。手動で追加されたノードとサブスクリプションノードは、ECS コンソール から手動で解放する必要があります。 |
| ECS コンソールまたは API からの ECS インスタンスの直接リリース | ノードプールが不一致を検出し、期待される数に復元するために新しい ECS インスタンスを作成します。 | ACK コンソールを使用してノードを削除します。詳細については、「ノードの削除」をご参照ください。手動で追加されたノードとサブスクリプションノードは、ECS コンソール から手動で解放する必要があります。 |
| Auto Scaling コンソールにおける、期待される数を変更しないスケーリンググループからの ECS インスタンスの削除 | ノードプールが変更を検出し、代替インスタンスを作成します。 | ノードプールで使用されるスケーリンググループは、Auto Scaling コンソールで直接変更しないでください。 |
| サブスクリプション ECS インスタンスの有効期限切れ | ノードプールがリリースを検出し、代替インスタンスを作成します。 | サブスクリプションインスタンスが有効期限切れになる前に、削除または更新してください。詳細については、「ノードの削除」、サブスクリプションインスタンスの更新」をご参照ください。 |
| Auto Scaling コンソール | ヘルスチェックによって異常な (一時停止など) インスタンスが特定されると、Auto Scaling は代替の ECS インスタンスを作成します。 | ACK で使用されるスケーリンググループでは、ヘルスチェックはデフォルトで無効になっています。これらの設定は変更しないでください。 |
スケーリング失敗のトラブルシューティング
スケーリングに失敗した場合は、[クラスター] ページでクラスター名をクリックし、[クラスタータスク] タブを開き、[原因の表示] をクリックしてエラー詳細を確認します。
| エラーコード | 原因 | 解決策 |
|---|---|---|
RecommendEmpty.InstanceTypeNoStock |
現在のゾーンで ECS の在庫が不足しています。 | ノードプールを変更して、異なるゾーンに vSwitch を追加し、複数のインスタンスタイプを設定します。詳細については、「ノードプールのスケーラビリティの確認」をご参照ください。 |
NodepoolScaleFailed.FailedJoinCluster |
ノードが ACK クラスターに参加できませんでした。 | ノードにログインし、grep cloud-init /var/log/messages を実行してエラーを確認します。 |
InvalidAccountStatus.NotEnoughBalance / InsufficientBalance.CreditPay / Account.Arrearage |
アカウントの残高が不足しています。 | アカウントにチャージしてください。 |
InvalidParameter.NotMatch (ブートモードの不一致) |
インスタンスタイプが OS イメージのブートモード (BIOS) をサポートしていません。 | 別のインスタンスタイプを選択してください。ノードプールの [概要] タブで OS とイメージ ID を確認します。DescribeImageSupportInstanceTypes を呼び出して、サポートされているインスタンスタイプをクエリします。 |
QuotaExceed.ElasticQuota |
現在のリージョンで指定されたインスタンスタイプの ECS クォータを超過しました。 | 別のインスタンスタイプを選択するか、既存の ECS インスタンスを減らすか、クォータセンターでクォータの引き上げをリクエストしてください。 |
InvalidResourceType.NotSupported |
インスタンスタイプがサポートされていないか、現在のゾーンで在庫切れです。 | DescribeAvailableResource |
InvalidImage.NotSupported |
OS イメージがセキュリティ強化型インスタンスをサポートしていません。 | 別のインスタンスタイプを選択してください。サポートされているイメージについては、「ECS コンソールで信頼されたインスタンスを作成する」をご参照ください。 |
InvalidParameter.NotMatch (vTPM イメージの不一致) |
OS イメージには vTPM 対応のインスタンスタイプが必要です。 | 別のインスタンスタイプを選択してください。ノードプールの [概要] タブで OS とイメージ ID を確認します。 |
QuotaExceeded.PrivateIpAddress |
現在の vSwitch に利用可能なプライベート IP アドレスがありません。 | ノードプールに vSwitch を追加して再試行してください。 |
InvalidParameter.KmsNotEnabled |
Key Management Service (KMS) キーが無効になっています。 | KMS コンソールにログインし、キーを有効にします。 |
InvalidInstanceType.NotSupported |
インスタンスタイプが OS イメージのアーキテクチャをサポートしていません。 | 別のインスタンスタイプを選択してください。DescribeImageSupportInstanceTypes を呼び出して互換性のあるインスタンスタイプをクエリします。ACK がサポートするイメージについては、「OS イメージ」をご参照ください。 |
ApiServer.InternalError / Err.QueryEndpoints |
ACK クラスターの API サーバーに到達できません。 | API サーバーのアクセシビリティを確認します。詳細については、「ACK コンソールにおけるクラスターアクセス問題のトラブルシューティング」をご参照ください。 |
RecommendEmpty.InstanceTypeNotAuthorized |
指定されたインスタンスタイプを使用する権限がありません。 | チケットを送信して ECS の権限をリクエストしてください。 |
RecommendEmpty.DiskTypeNoStock |
ゾーン内のクラウドディスクの在庫が不足しています。 | vSwitch を追加するか、別のディスクタイプを選択してください。 |
InvalidParameter.KMSKeyId.KMSUnauthorized |
KMS にアクセスする権限がありません。 | ECS コンソールで、AliyunECSDiskEncryptDefaultRole ロールを ECS に割り当てます。詳細については、「暗号化関連の権限」をご参照ください。 |
InvalidParameter.Conflict |
クラウドディスクタイプがインスタンスタイプと互換性がありません。 | 別のインスタンスタイプまたはディスクタイプを選択してください。 |
NotSupportSnapshotEncrypted.DiskCategory |
システムディスクの暗号化には ESSD が必要です。 | ESSD を選択してください。ディスクタイプと暗号化については、「ディスクタイプと暗号化」をご参照ください。 |
ScalingActivityInProgress |
ノードプールはすでにスケーリング中です。 | 現在のスケーリングアクティビティが完了するのを待ってから再試行してください。Auto Scaling コンソールで直接ノードプールをスケーリングしないでください。 |
Instance.StartInstanceFailed |
ECS インスタンスの起動に失敗しました。 | 再試行してください。問題が解決しない場合は、チケットを送信して ECS チームにお問い合わせください。 |
OperationDenied.NoStock |
指定されたゾーンでインスタンスタイプの在庫がありません。 | 別のインスタンスタイプを選択してください。詳細については、「ノードプールのスケーラビリティの確認」をご参照ください。 |
NodepoolScaleFailed.WaitForDesiredSizeTimeout |
スケールアウトタスクがタイムアウトしました。 | ACK コンソールで、[クラスター] > クラスター名 > [ノード] > [ノードプール] に移動し、ノードプール名をクリックして [スケーリングアクティビティ] タブを開き、タスクの詳細を表示します。 |
ApiServer.TooManyRequests |
Kubernetes API サーバーがリクエストをスロットルしました。 | リクエストの頻度を減らすか、後で再試行してください。 |
NodepoolScaleFailed.PartialSuccess |
在庫不足のため、一部のノードの作成に失敗しました。 | ノードプールに設定されているインスタンスタイプを変更してください。詳細については、「ノードプールのスケーラビリティの確認」および「ノードプールの編集」をご参照ください。 |
次のステップ
-
ノードの削除 — ノードプールからノードを削除する際の操作と注意事項。
-
ノードプールの運用保守 — ノードプールのスペックアップ、自動修復、および OS CVE パッチ適用。
-
ノードとノードプールのベストプラクティス:デプロイメントセット、プリエンプティブルインスタンスベースのノードプールなど。