EKSのバージョンアップ: 経験からの教訓と対策

2023/06/29に公開

はじめに

こんにちは、アダコテックのテックリード、kackyです。弊社では、機械学習基盤にKubernetesを採用し、AWSのEKS(Elastic Kubernetes Service)を運用しています。Kubernetesには定期的なバージョンアップが必要となり、またサポート期間も決められています。この度、EKSのバージョンアップを行った際に発生したインシデントを共有し、皆さんの学びにつながれば幸いです。

Kubernetesアップデート概要

弊社の環境では、Kubernetesのバージョンはv1.24であり、今回の目的は最新版であるv1.27へのアップデートでした。

このアップデート作業では、最初にアップデート専用のクラスタを立ち上げ、そこでKubernetesのバージョンアップが問題なく機能するかをテストしました。その後、開発環境から本番環境へと順にアップデートを行いました。

しかし、この過程でいくつかのインシデントが発生しました。以下にそれらを詳細に解説します。

発生したインシデント

Kubernetes 1.25でPSP(Pod SecurityPolicy)が削除された影響でhelm_releaseの更新に失敗する

Kubernetesはリソースの整理を定期的に行っており、その一環でPod Security Policy(PSP)というリソースがv1.21から非推奨とされ、v1.25で完全に削除されました。これにより、既存のhelm_releaseでPSPが利用されていた場合、v1.25へのアップデートで動作しなくなり、その後の更新作業も失敗してしまいました。

この問題を解決するには、helm_releaseを手動で削除し、再度helm_releaseを作成する必要があります。ただし、v1.25へのアップデート前に、helm_releaseのパラメータを編集しPSPを利用しない形にデプロイすることで、この問題を回避することも可能です。

1.25アップデート後にVPCに接続できなくなる

v1.25へのアップデート後に新しく立ち上がったNodeからPodが起動した際に、VPC(Virtual Private Cloud)への接続が不可能となる現象が発生しました。原因は、EKSクラスタ作成時のデフォルトのCNI(Container Network Interface)プラグインが更新されていなかったことでした。

具体的な解決策としては、EKSでは現在、コアコンポーネントのバージョンアップが可能となるアドオン機能が提供されています。これを利用し、CNIプラグインを最新版に更新しました。更新後、PodからVPCへの接続が正常に行われることを確認しました。つまり、アップデート前にCNIプラグインのバージョンを最新に保つことで、この問題を未然に防ぐことができます。

CoreDNSが意図しないNode Groupに配置されてしまう

こちらは私の確認ミスにより、CoreDNSが意図しないNode(具体的にはargo workflowのworkerとして割り当てられたテンポラリなNode)に割り当てられ、そのNodeが削除されないという現象が発生しました。原因は、addonのインストール時にNodeSelectorやNodeAffinityの設定が適切でなかったことでした。

具体的な対応策としては、まず該当のCoreDNSのdeploymentを修正しました。具体的には、addonをインストールする際のパラメータとして、NodeSelectorやNodeAffinityを正しく設定し直しました。これにより、特定のラベルが付与されたNodeにのみ割り当てることが可能となり、意図しないNodeへの配置を防ぐことができました。つまり、addonのインストール時には、NodeSelectorやNodeAffinityの設定を確認することで、このような問題を未然に防ぐことができます。

まとめ

本記事では、EKSのバージョンアップを行った際に発生したインシデントとその解決策について解説しました。コアインフラであるEKSのバージョンアップは、本番環境への適用が非常にクリティカルな作業となります。そのため、まずは開発環境で実行し、発生した問題を解決することで、成功へと導くことが重要です。今回の経験が皆様の参考になれば幸いです。

Discussion