AWS

EKSクラスタ(Kubernetes)をアップグレードする方法と注意点

「クラウドネイティブってよく聞くけどなんだろう」

「DevOps って用語が登場したけど、オレは最初から開発も運用も両方やってるし・・・」

「GitOps に最適な CI/CD の本命ってなんですか?」

コンテナ界隈が騒がしい昨今ですが、AWS なら ECS や EKS、GCP なら GKE など、コンテナ運用の手助けをしてくれるマネージドサービスも安定感を増してきました。

といっても、Kubernetes を使ったクラスタ運用は難しさしか感じません・・・。

今回は、EKS クラスタ(Kubernetes)のバージョンアップをしなければいけない局面に遭遇したので、先駆者の知恵を借りながら頭の中にメモったことを、ザックリと備忘録として残しておきたいと思います。

アップデートするための事前知識

公式ドキュメントにも記載されている通り、AWS の EKS クラスタのマイナーバージョンアップは、1 回の更新で 1 つ上のバージョンまでしか更新ができません。

例えば、現在が 1.15 の場合は 1.16 へ、1.16 の場合は 1.17 にという感じですね。

Amazon EKS は可用性の高いコントロールプレーンを実行しているため、一度に更新できるのは 1 マイナーバージョンのみです

また、最新バージョンは英語版のドキュメントから優先されて更新されていくので、そちらをチェックしておくと、そろそろ新しいマイナーバージョンが登場することがわかります。

なお、2020 年 11 月時点で、日本語版のドキュメントにも 1.18 の情報が反映されました。

AWS がサポートするバージョンは 4 世代前までになり、5 世代前のバージョンはサポート終了のタイミングで使えなくなります。

これが何を意味するかというと、大体 3 ヶ月ごとに新しいマイナーバージョンが登場するので、リリースから 1 年後が賞味期限という非常に短いサイクルと付き合っていく必要があるということです。

1.18 が正式にリリースされた場合、1.14 のサポート期限が近いはずなので、更新を忘れていると自動的に 1.15 へアップデートされることになり注意が必要です。

EKSクラスタ(Kubernetes)をアップグレードする方法と注意点

各バージョンのサポート終了期限については、「Amazon EKS Kubernetes リリースカレンダー」を見ておくと計画を立てやすいと思います。

Kubernetes1.16へのアップデート

EKS クラスタのバージョンアップは、以下のドキュメントを見ながら行うと効率的です。

ただマイナーバージョンアップと言っても、バージョンによっては EKS クラスタやアドオンのバージョンアップだけで済む場合もありますが、サードパーティーのモジュールなどに手を加えないといけないケースも出てきます。

特に、1.15 から 1.16 へのアップデートには、以下の通り前提条件が明記されているので要注意です。

DaemonSet や Deployment の API バージョンにおいて「apps/v1」を利用することになっているので、「extensions/v1beta1」や「apps/v1beta1」などが指定されている場合は修正が必要です。

基本的にはバージョン指定だけ変更すれば大丈夫ですが、定義の変更を求められる場合もあるので、その時はドキュメントと睨めっこするしかないですね。

特にサードパーティー製のツールを使用している場合は、今後のバージョンアップに備えてチェックしておくと慌てなくて済みそうです。

また下位互換のないツールでは、EKS クラスタより先にイメージバージョンを上げてしまうとエラーが出力されるケースがあるので要注意です。

EKS クラスタより先に更新しておくもの、後に更新するものを事前に確認しておくことをオススメします。

EKSクラスタのアップデート

ここから EKS クラスタのバージョンアップ作業です。

EKS クラスタのアップデートは AWS のコンソール上からもできますが、eksctl コマンドを利用する場合は以下になります。先にドライランしておくと安心です。

ドライランの結果に問題なければ実行しましょう。

アドオンのアップデート

公式ドキュメントに書かれている通り、アドオンは EKS クラスタのバージョンアップと一緒に行われません。

Amazon EKS は、クラスターの更新時に Kubernetes アドオンを変更しません。

2020 年 11 月時点の英語版ドキュメントのバージョン対応表を確認してみると、下記の 3 つのアドオンについて詳しく明記されているのでチェックしておきましょう。

・Amazon VPC CNI プラグイン
・DNS (CoreDNS)
・KubeProxy

EKSクラスタ(Kubernetes)をアップグレードする方法と注意点

各アドオンについては、現在のバージョン確認方法やアップデート方法も詳しく公式ドキュメントに書かれているので、ここでハマることは少なそうです。

ワーカーノードの作成と削除

最後に、新しくワーカーノードを作成して、pod を移していきます。

まずはワーカーノードの作成から。

次に、pod を新しいワーカーに移動させていきます。

–delete-local-data のオプションは公式のドキュメントに書かれていないのですが、以下のパターンに当てはまる場合は付けておくといいでしょう。

emptyDir(ノードが排出されたときに削除されるローカルデータ)を使用するポッドがあっても続行する

Kubernetesでnodeを安全に除外する

最後に古いワーカーノードを削除して完了です。こちらもドライランから。

問題なければ削除を実行します。

まとめ

基本的には公式のドキュメントをベースにバージョンアップ作業を進めていけば問題ありません。

ただし、アドオンやプラグインなど、関連するモジュールの対応バージョンについては事前に確認しておくことをオススメします。

ECS(Fargate)もプラットフォームバージョンの更新で悩まされるケースがありますが、こちらはサービスの設定を切り替えるだけなので運用は楽です。

その点、EKS(Kubernetes)の運用はマネージド以外の領域が多いので、今回のようなバージョンアップは一苦労です。

検証環境でじっくり確認してから本番環境に挑みたいですね。