Amazon EKS クラスターの Kubernetes バージョンの更新
Amazon EKS で利用可能な新しい Kubernetes バージョンがある場合には、Amazon EKS クラスターを最新バージョンに更新できます。
重要
クラスターをアップグレードすると、以前のバージョンにダウングレードすることはできません。新しい Kubernetes バージョンに更新する前に、「Amazon EKS Kubernetes のバージョン」で情報を確認し、さらに本トピック内の更新手順でも確認することをお勧めします。
新しい Kubernetes バージョンでは、大幅な変更が加えられている場合があります。このため、本稼働用クラスターで更新を行う前に、新しいバージョンの Kubernetes に対するアプリケーションの動作をテストしておくことをお勧めします。この際は、継続的な統合ワークフローを構築し、新しい Kubernetes バージョンに移行する前にアプリケーションの動作をテストします。
更新プロセスに含まれている Amazon EKS が、更新された Kubernetes バージョンを使用しながら新しい API サーバーノードを起動することで、既存のバージョンを置き換えます。Amazon EKS は、これらの新しいノードで、ネットワークトラフィックの標準インフラストラクチャと準備状況に関するヘルスチェックを実行し、想定どおりに動作していることを確認します。ただし、クラスターのアップグレードを開始すると、一時停止または停止することはできません。これらのヘルスチェックのいずれかが失敗すると、Amazon EKS はインフラストラクチャのデプロイを元に戻します。クラスターは前の Kubernetes バージョンのままになります。この際も、実行中のアプリケーションは影響を受けません。また、クラスターが不確定または回復不可能な状態のままになることもありません。Amazon EKS は定期的にすべてのマネージド型クラスターをバックアップします。さらに、必要に応じてクラスターを復元するメカニズムも存在します。Kubernetes インフラストラクチャの管理プロセスは、継続的に評価、改善されています。
クラスターをアップグレードする際、Amazon EKS には、クラスターの作成時に指定したサブネット内に、最大で 5 つの使用可能な IP アドレスが必要となります。Amazon EKS は、指定したサブネットのいずれかに、新しいクラスターの Elastic Network Interface (ネットワークインターフェイス) を作成します。新しいネットワークインターフェイスは、既存のネットワークインターフェイスがあるのとはbサブネット内に作成される場合があります。ですので、クラスター作成時に指定したサブネットのいずれでも必要なクラスターとの通信が許可されるよう、セキュリティグループルールを設定します。クラスターの作成時に指定したサブネットのいずれかが存在しない、使用できる十分な IP アドレスがない、または必要なクラスターとの通信を許可するセキュリティグループルールがない場合、更新が失敗する可能性があります。
注記
クラスターの API サーバーエンドポイントに常にアクセスできるように、Amazon EKS では高可用性を備えた Kubernetes コントロールプレーンを提供しており、アップデート実行中に API サーバーインスタンスのローリングアップデートを行います。Kubernetes API サーバーエンドポイントをサポートする API サーバーインスタンスの IP アドレスの変更を考慮するために、API サーバークライアントが再接続を適切に管理しているか確認する必要があります。kubectl
の最新バージョンと公式にサポートされている Kubernetes クライアントライブラリ
Amazon EKS クラスターに必要な Kubernetes バージョンを更新する
クラスターに必要な Kubernetes のバージョンの更新方法
-
クラスターコントロールプレーンの Kubernetes バージョンと、ノードの Kubernetes バージョンを比較します。
-
クラスターコントロールプレーンの Kubernetes バージョンを取得します。
kubectl version
-
ノードの Kubernetes バージョンを取得します。このコマンドでは、セルフマネージド型およびマネージド型の Amazon EC2 および Fargate ノードがすべて表示されます。各 Fargate Pod は、独自のノードとしてリストされます。
kubectl get nodes
コントロールプレーンを新しい Kubernetes バージョンに更新する前に、クラスター内のマネージド型ノードと Fargate ノードの双方の Kubernetes マイナーバージョンが、コントロールプレーンのバージョンと同じであることを確認してください。例えば、コントロールプレーンがバージョン
1.27
を実行し、かつノードの 1 つがバージョン1.26
を実行している場合、コントロールプレーンを 1.28 に更新する前に、ノードをバージョン1.27
に更新する必要があります。また、コントロールプレーンを更新する前に、セルフマネージド型ノードをコントロールプレーンと同じバージョンに更新することをお勧めします。詳細については、マネージド型ノードグループの更新 および セルフマネージド型ノードの更新 を参照してください。Fargate ノードのマイナーバージョンがコントロールプレーンのバージョンよりも古い場合、まずノードの示す Pod を削除します。次に、コントロールプレーンを更新します。残りの Pods は、再デプロイ後に新しいバージョンに更新されます。 -
-
最初にクラスターにデプロイした Kubernetes バージョンが Kubernetes
1.25
以降だった場合、このステップをスキップしてください。デフォルトでは、Amazon EKS クラスターで Pod セキュリティポリシーのアドミッションコントローラーが有効化されています。クラスターを更新する前に、適切な Pod セキュリティポリシーが指定されていることを確認してください。これは、潜在的なセキュリティの問題を回避するためのものです。
kubectl get psp eks.privileged
コマンドを使用して、デフォルトのポリシーを確認できます。kubectl get psp eks.privileged
以下のエラーが表示された場合は、先に進む前に「Amazon EKS での デフォルトの Pod セキュリティポリシー」を参照してください。
Error from server (NotFound): podsecuritypolicies.extensions "eks.privileged" not found
-
最初にクラスターにデプロイした Kubernetes バージョンが Kubernetes
1.18
以降だった場合、このステップをスキップしてください。CoreDNS マニフェストから、廃止された単語を削除する必要がある場合があります。
-
CoreDNS マニフェストに、
upstream
というワードのみの行があるかどうかを確認します。kubectl get configmap coredns -n kube-system -o jsonpath='{$.data.Corefile}' | grep upstream
出力が返されない場合は、マニフェストにこの行は含まれていません。この場合は、次のステップに進みます。
upstream
というワードが返された場合は、その行を削除します。 -
ConfigMap ファイルで、ファイルの先頭付近にある、
upstream
のみを含む行を削除します。このファイル内の他の部分は変更しないでください。行を削除したら、変更を保存します。kubectl edit configmap coredns -n kube-system -o yaml
-
-
eksctl
、AWS Management Console、またはAWS CLI を使用してクラスターを更新します。重要
-
バージョン
1.23
に更新してクラスターで Amazon EBS ボリュームを使用する場合は、ワークロードの中断を避けるために、クラスターをバージョン1.23
に更新する前にクラスターに Amazon EBS CSI ドライバーをインストールする必要があります。詳細については、Kubernetes 1.23 および Amazon EBS CSI ドライバー を参照してください。 -
Kubernetes
1.24
およびそれ以降では、デフォルトのコンテナランタイムとしてcontainerd
が使用されます。containerd
ランタイムに切り替える予定で、すでに Fluentd が Container Insights 用に構成されている場合は、クラスターを更新する前に Fluentd を Fluent Bit に移行する必要があります。Fluentd パーサーは JSON 形式のログメッセージのみを解析するように構成されています。dockerd
とは異なり、containerd
コンテナランタイムには JSON 形式ではないログメッセージがあります。Fluent Bit に移行しないと、構成された Fluentd's パーサーの一部が Fluentd コンテナー内で大量のエラーを生成します。移行の詳細については、「CloudWatch Logs へログを送信する DaemonSet として Fluent Bit を設定する」を参照してください。 -
Amazon EKS は可用性の高いコントロールプレーンを実行しているため、一回に更新できるのはマイナーバージョン 1 つのみです。この要件の詳細については、「Kubernetes Version and Version Skew Support Policy
」(Kubernetes のバージョンおよびバージョンスキューのサポートポリシー) を参照してください。現在のクラスターバージョンが 1.26
であり、1.28
に更新することを仮定します。最初にバージョン1.26
クラスターをバージョン1.27
に更新し、次にバージョン1.27
クラスターをバージョン1.28
に更新する必要があります。 -
更新を行う前に、マネージド型および Fargate ノードの
kubelet
が コントロールプレーンと同じ Kubernetes バージョンであることを確認してください。セルフマネージド型ノードは、コントロールプレーンと同じバージョンにしておくことをお勧めします。コントロールプレーンの現在のバージョンより最大 1 つ前のものにすることも可能です。 -
クラスターが
1.8.0
より前のバージョンの Amazon VPC CNI plugin for Kubernetes で設定されている場合、クラスターを更新する前に、プラグインを最新バージョンに更新することをお勧めします。プラグインのアップデートについては、「」を参照してくださいAmazon VPC CNI plugin for Kubernetes Amazon EKS アドオンの使用。 -
クラスターをバージョン
1.25
以降に更新しようとしており、クラスターに AWS Load Balancer Controller をデプロイしている場合は、クラスターのバージョンを1.25
に更新する前に、コントローラーをバージョン2.4.7
以降に更新してください。詳細については、Kubernetes1.25 のリリースノートを参照してください。
-
-
クラスターの更新が完了したら、更新したクラスターでの Kubernetes と同じマイナーバージョンに、ノードを更新する必要があります。詳細については、セルフマネージド型ノードの更新 および マネージド型ノードグループの更新 を参照してください。Fargate で起動される新しい Pods であれば、クラスターのバージョンと一致する
kubelet
バージョンを持っています。それまでに存在していた Fargate Pods は変更されていません。 -
(オプション) クラスターを更新する前に、そのクラスターに Kubernetes Cluster Autoscaler をデプロイしてある場合は、更新後の Kubernetes のメジャーバージョンとマイナーバージョンに一致するように、Cluster Autoscaler を最新バージョンに更新します。
-
ウェブブラウザで Cluster Autoscaler リリース
ページを開き、クラスターの Kubernetes メジャーバージョンとマイナーバージョンに一致する最新の Cluster Autoscaler バージョンを見つけます。例えば、クラスターの Kubernetes バージョンが 1.28
である場合、1.28
で始まる最新の Cluster Autoscaler リリースを見つけます。次のステップで使用するため、そのリリースのセマンティックバージョン番号 (例:1.28.n
) を書き留めておきます。 -
次のコマンドを使用して、Cluster Autoscaler イメージタグを、前のステップで書き留めたバージョンに設定します。必要に応じて、
を独自の値に置き換えます。1.28
.n
kubectl -n kube-system set image deployment.apps/cluster-autoscaler cluster-autoscaler=registry.k8s.io/autoscaling/cluster-autoscaler:v
1.28
.n
-
-
(GPU ノードを含むクラスターのみ) クラスターに GPU 対応のノードグループ (
p3.2xlarge
など) がある場合は、クラスターの Kubernetes 向け NVIDIA デバイスプラグインDaemonSet を更新する必要があります。次のコマンドを実行する前に、
を必要となる NVIDIA/k8s-device-pluginvX.X.X
バージョンに置き換えます。 kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/
vX.X.X
/nvidia-device-plugin.yml -
Amazon VPC CNI plugin for Kubernetes、CoreDNS、および
kube-proxy
アドオンを更新する サービスアカウントトークンにリストされている最小バージョンに対してアドオンを更新することをお勧めします。-
Amazon EKS アドオンを使用している場合は、Amazon EKS コンソールで [Clusters] (クラスター) をクリックし、左のナビゲーションペインで更新したクラスター名を選択します。通知がコンソールに表示されます。更新可能なアドオンごとに、新しいバージョンが利用可能であることが通知されます。アドオンを更新するには、[Add-ons] (アドオン) タブを選択します。更新があるアドオンが表示されているボックスで [今すぐ更新] を選択し、使用可能なバージョンを選択してから、[更新] を選択します。
-
別の方法として、AWS CLI または
eksctl
を使用してアドオンを更新することもできます。詳細については、「アドオンの更新」を参照してください。
-
-
必要に応じて、
kubectl
のバージョンを更新します。Amazon EKS クラスターコントロールプレーンとのマイナーバージョンの相違が 1 つ以内であるkubectl
バージョンを使用する必要があります。例えば、1.27
kubectl
クライアントは Kubernetes、1.26
、1.27
および1.28
クラスターで動作します。現在インストールされているバージョンは、次のコマンドで確認できます。kubectl version --client