EKS クラスタのノードで、余剰リソースの解消、コスト削減、メンテナンスなどのために特定のノードを停止したい場面があります。5 台あるマネージドノードのうち、1 台の選択したノードを停止させ、4 台のノードにスケールインさせる手順を残しておきます。
EKS のバージョンは 1.25、eksctl で作成したマネージドノードグループで動作確認。
目次
kubectl drain コマンドで Pod をノードから排出する
kubectl drain
コマンドを使って、ノードをから Pod を排出します。このコマンドを実行すると、ノードで稼働していた Pod が終了されて、別のノードで稼働するようになります。新しい Pod も起動しなくなります。ドキュメントは Safely Drain a Node | Kubernetes を参照。
kubectl drain --ignore-daemonsets <node name>
kubectl drain
コマンドを実行する前に、対象のノードで稼働している Pod を確認したい場合は以下のコマンドで。
kubectl get pods --field-selector spec.nodeName=<node name>
kubectl ではなく eksctl が使えないかなとも思ったのですが、この記事を書いた 2023 年 7 月 31 日時点では、eksctl は EKS のノードグループを drain することはできますが、ノードを drain することはできませんでした。詳細は Managing nodegroups | Deleting and draining nodegroups - eksctl を参照。
AutoScalingGroup からノードをデタッチする
以下の手順で AutoScalingGroup からノードをデタッチします。AutoScalingGroup の管理下からインスタンスを外す作業です。ドキュメントは Detach EC2 instances from your Auto Scaling group - Amazon EC2 Auto Scaling を参照。
- Amazon EC2 コンソールを開き、左側のナビゲーションペインで [Auto Scaling グループ] を選択します。
- ノードグループの Auto Scaling グループの横にあるチェックボックスを選択します。
- ページの下部にスプリットペインが開きます。
- [Instance management] タブの [Instance] で、対象のノードのインスタンスを選択し、右上の [Actions] を選択し、[Detach] の順に選択します。
- [インスタンスをデタッチ] ダイアログボックスで、[インスタンスを置き換える] チェックボックスをオフにします。ここをオンのままにすると、デタッチしたインスタンスの代わりに新しくインスタンスが起動してしまうので、スケールインにならなくなります。
- ウィザードを進めてインスタンスをデタッチします。
ノードを終了する
以下の手順でデタッチした EC2 インスタンスを終了します。ドキュメントは Terminate your instance - Amazon Elastic Compute Cloud を参照。
- Amazon EC2 コンソールを開き、左側のナビゲーションペインで [Instances] を選択します。
- インスタンスを選択し、右上の [Instance state] [Terminate Instance] の順に選択します。
- ウィザードを進めてインスタンスを終了します。
EKS ノード数を減らす
AutoScalingGroup を直接操作したために、AutoScalingGroup と EKS のノードの数値が異なっています。以下の手順で EKS ノード数を減らします。ドキュメントは Updating a managed node group | Edit a node group configuration - Amazon EKS
- Amazon EKS コンソールを開き、EKS クラスターを選択します。
- [Compute] タブを選択します。
- 編集するノードグループを選択し、次に [Edit] を選択します。
- Edit Node Group ページで [Desired size] を 5 から 4 に減らします。
- 保存します。