【EKS】ノードグループバージョンを更新する手順

本記事では、EKS ノードグループのバージョンを更新する手順について解説する。

dashboard

前提


今回は、下記ケースのEKSノードグループの更新を行う。

  • バージョンアップ元:ノードグループ 1.28.x
  • バージョンアップ先:ノードグループ 1.29.x
  • EKSクラスターバージョン:EKS 1.29

説明


EKSを運用していく上でバージョンアップ必要なサービスは大きく以下の3つに分けられる。

ノードグループとは、アプリケーション(Podやコンテナ)の実行環境であるノード(EC2・Fargate)の集まりである。 そのため、EC2へのパッチ適応や、バージョンアップだと考えればよい。

  • EKSクラスター(kubernetes APIサーバー、kubernetes)
  • EKSノードグループ
  • EKSアドオン
  • ALB Load Balancer Controller

ノードグループ以外の3つのバージョンアップ手順についても、本ブログで詳細に解説している。

ダウンタイム・影響


バージョンアップ中のアプリケーションへのダウンタイム

EKSノードグループのバージョンアップ中に、そのEKSでホストしているアプリケーションに対して、ダウンタイムは基本発生しない。

バージョンアップでは、ノードが一つずつバージョンアップされる。そのため、Podは他のノードにスケジュール・移動され、ダウンタイムは基本発生しないが、ノードの最大数やアプリケーションの仕様によってはダウンタイムが発生する可能性がある。

バージョンアップ手順


EKSノードグループのバージョンを更新する

  1. 下記を実行し、ノードグループをアップデートする。{x.xx} には、EKSクラスターと同じバージョンを記載(1.29など)
eksctl upgrade nodegroup --name=<nodegroup-name> --cluster=<cluster-name> --region-=<region code> --kubernetes-version={x.xx}
  1. 下記コマンドを実行し、正常にバージョンが更新されたことを確認する
kubectl get node
  1. 下記コマンドを実行し、正常にImageのバージョンが更新されたことを確認する
txtkubectl describe pod cluster-autoscaler-xxxxxxxx -n kube-system

エラー


PodEvictionFailureエラー

マネージドノードグループの更新時において、アップグレードフェーズでは、Nodeから Pods がドレインされるが、この際 Pods が 15 分以内にノードを離れず、かつ強制フラグがない場合には、エラーが発生し、更新が失敗する。

[root@ip-172-16-10-30 ~]# eksctl upgrade nodegroup --name=test-node-group --cluster=test-cluster --region=ap-northeast-1 --kubernetes-version=1.29
2024-05-09 06:10:56 [ℹ]  setting ForceUpdateEnabled value to false
2024-05-09 06:10:56 [ℹ]  updating nodegroup stack
2024-05-09 06:10:57 [ℹ]  waiting for CloudFormation changeset "eksctl-update-nodegroup-12344803625" for stack "eksctl-test-cluster-nodegroup-test-node-group"
Error: error updating nodegroup stack: waiter state transitioned to Failure

PDB (Pod Disruption Budget) は、Kubernetes クラスタにおける Pod のアップデートや削除の際に、アプリケーションの可用性を確保するための設定で、PDB を使用することで、同時に停止できる Pod の最大数や最小数を制御できる。

そのため、PDB を設定している場合にエラーが発生する場合がある。

解決策


①Podの数を増やす

PDBの設定に合わせて、Podを増やせば、ドレインすることが出来るようになる。

メリットとして、更新によって発生するダウンタイムを避けることが出来る。

②PDB を一時的に削除する。

下記コマンドによって、PDBを確認することができる。

kubectl get pdb -A

一時的に削除することで、Podがドレインされるようになる。

➂強制更新オプションを使用する。

下記オプションを更新コマンドに指定することで、PDBの設定を無視した更新の実行が可能。

--force-upgrade

本問題の詳細や、その他の問題に関しては、Amazon EKS のマネージドノードグループの更新に関する問題をトラブルシューティングするにはどうすればよいですか?を参照