クラスターの更新
既存の Amazon EKS クラスターを新しい Kubernetes バージョンまたはクラスターのシークレット暗号化
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 には、クラスターの作成時に指定したサブネット内に、2~3 の空き IP アドレスが必要となります。これらのサブネットに利用可能な IP アドレスがない場合、アップグレードが失敗することがあります。さらに、クラスターの作成時に指定された、サブネットやセキュリティグループのいずれかが削除された場合も、クラスターのアップグレードが失敗することがあります。
Amazon EKS では、可用性の高いコントロールプレーンが実行されていますが、更新時にはサービスが短時間中断する可能性はあります。例えば、終了直前または終了直後に新しいバージョンの Kubernetes を実行している新しい API サーバーに接続しようとすると、API コールエラーや接続の問題が発生する可能性があります。この場合は、成功するまで API オペレーションを繰り返し実行します。
Amazon EKS クラスターに必要な Kubernetes バージョンの更新方法
クラスターに必要な Kubernetes のバージョンの更新。
クラスターに必要な Kubernetes のバージョンの更新方法
-
クラスターコントロールプレーンの Kubernetes バージョンと、ノードの Kubernetes バージョンを比較します。
-
次のコマンドを使用して、クラスターコントロールプレーンの Kubernetes バージョンを取得します。
kubectl version --short
-
次のコマンドを使用して、ノードの Kubernetes バージョンを取得します。このコマンドでは、セルフマネージド型およびマネージド型の Amazon EC2 および Fargate ノードがすべて表示されます。各 Fargate ポッドは、独自のノードとしてリストされます。
kubectl get nodes
クラスター内の、マネージド型ノードと Fargate ノードの Kubernetes マイナーバージョンは、コントロールプレーンを新しい Kubernetes バージョンに更新する前に、コントロールプレーンの現在のバージョンと同じにする必要があります。例えば、コントロールプレーンがバージョン 1.20 を実行していて、いずれかのノードがバージョン 1.19を実行している場合には、コントロールプレーンの Kubernetes バージョンを 1.21 に更新する前に、ノードのバージョンを 1.20 に更新します。また、コントロールプレーンを更新する前に、セルフマネージド型ノードをコントロールプレーンと同じバージョンに更新することをお勧めします。詳細については、「マネージド型ノードグループの更新」および「セルフマネージド型ノードの更新」を参照してください。Fargate ノードのバージョンを更新するには、ノードと対応しているポッドを削除した上で、コントロールプレーンを更新した後に、ポッドを再デプロイします。
-
-
Amazon EKS クラスターのデフォルトでは、ポッドセキュリティポリシーのアドミッションコントローラーが有効化されています。クラスターを更新する際には、事前に適切なポッドセキュリティポリシーが指定されていることを確認して、問題が発生することを防ぎます。以下のコマンドを使用して、デフォルトのポリシーを表示できます。
kubectl get psp eks.privileged
以下のエラーが表示された場合は、先に進む前に「デフォルトのポッドセキュリティポリシー」を確認してください。
Error from server (NotFound): podsecuritypolicies.extensions "eks.privileged" not found
-
Kubernetes
1.17
以前にクラスターを最初にデプロイした場合は、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 を使用してクラスターを更新します。重要 -
Amazon EKS は可用性の高いコントロールプレーンを実行しているため、一回に更新できるのはマイナーバージョン 1 つのみです。この背後にある論理的根拠については、「Kubernetes Version and Version Skew Support Policy (Kubernetes のバージョンおよびバージョンスキューのサポートポリシー)
」を参照してください。したがって、現在のバージョン 1.19 を 1.21にアップグレードする場合には、最初にクラスターを 1.20 に更新した上で、その後に 1.20 から 1.21 への更新を行う必要があります。 -
更新を行う前に、マネージド型および Fargate ノードの各
kubelet
での Kubernetes バージョンは、コントロールプレーンのバージョンと同じにする必要があります。セルフマネージド型ノードのバージョンは、コントロールプレーンの現在のバージョンより最大 1 つ前のものにすることが可能ですが、コントロールプレーンのバージョンと同じにしておくことをお勧めします。 -
クラスターを新しいバージョンに更新すると、カスタム設定が上書きされる場合があります。
-
-
クラスターの更新が完了したら、更新したクラスターでの Kubernetes と同じマイナーバージョンに、ノードを更新する必要があります。詳細については、「セルフマネージド型ノードの更新」または「マネージド型ノードグループの更新」を参照してください。Fargate で起動される新しいポッドであれば、クラスターのバージョンと一致する
kubelet
バージョンを持っています。それまでに存在していた Fargate ポッドは変更されていません。 -
(オプション) クラスターを更新する前に、そのクラスターに Kubernetes Cluster Autoscaler をデプロイしてある場合は、更新後の Kubernetes のメジャーバージョンとマイナーバージョンに一致するように、Cluster Autoscaler を最新バージョンに更新します。
-
ウェブブラウザで Cluster Autoscaler リリース
ページを開き、クラスターの Kubernetes メジャーバージョンとマイナーバージョンに一致する最新の Cluster Autoscaler バージョンを見つけます。例えば、クラスターの Kubernetes バージョンが 1.21 の場合、1.21 で始まる Cluster Autoscaler リリースを見つけます。次のステップで使用するので、そのリリースのセマンティックバージョン番号 ( <1.21.n>
) を書き留めておきます。 -
次のコマンドを使用して、Cluster Autoscaler イメージタグを、前のステップで書き留めたバージョンに設定します。必要に応じて、
1.21
.n
を独自の値に置き換えます。kubectl -n kube-system set image deployment.apps/cluster-autoscaler cluster-autoscaler=k8s.gcr.io/autoscaling/cluster-autoscaler:v
1.21
.n
-
-
(GPU ノードを含むクラスターのみ) クラスターに GPU 対応のノードグループ (
p3.2xlarge
など) がある場合は、次のコマンドを使用して、クラスターの NVIDIA device plugin for Kubernetesデーモンセットを更新する必要があります。 kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.9.0/nvidia-device-plugin.yml
-
VPC CNI、CoreDNS、および
kube-proxy
アドオンを更新します。-
クラスターを 1.17 以前に更新した場合は、Amazon VPC CNI のセルフマネージド型アドオンを更新する、CoreDNS のセルフマネージド型アドオンを更新する、およびkube-proxy のセルフマネージド型アドオンを更新するを参照して、Amazon VPC CNI、CoreDNS、および
kube-proxy
アドオンを更新します。 -
クラスターを 1.18 に更新した場合は、Amazon EKS アドオンを追加できます。詳細については「Amazon VPC CNI Amazon EKS アドオンの追加します。」、「CoreDNS Amazon EKS アドオンの追加」または「kube-proxy Amazon EKS アドオンの追加」を参照してください。Amazon EKS アドオンの詳細については、「Amazon EKS アドオン」を参照してください。
-
1.19 以降に更新し、Amazon EKS アドオンを使用している場合は、Amazon EKS コンソールで[Clusters] (クラスター) をクリックし、左のナビゲーションペインで更新したクラスター名を選択します。更新可能なアドオンごとに、新しいバージョンが利用可能であることを知らせる通知がコンソールに表示されます。アドオンを更新するには、[設定] タブを開き、次に [アドオン] タブを表示します。更新があるアドオンが表示されているボックスで [今すぐ更新] を選択し、使用可能なバージョンを選択してから、[更新] を選択します。
-
別の方法として、AWS CLI または
eksctl
を使用して、Amazon VPC CNI、CoreDNS、および kube-proxy Amazon EKS アドオンを更新することもできます。
-
既存のクラスター上でシークレット暗号化を有効にする
シークレット暗号化
対称
データの暗号化および復号が可能
クラスターと同じリージョンに作成
KMS キーが別のアカウントで作成された場合、ユーザーには、その KMS キーへのアクセス権が必要となります。
詳細については、AWS Key Management Service デベロッパーガイドの「他のアカウントのユーザーに KMS キーの使用を許可する」を参照してください。
一度有効化したシークレット暗号化は無効化できません。このアクションを元に戻すことはできません。
クラスターで暗号化を有効にしたら、既存のすべてのシークレットを新しいキーで暗号化する必要があります。
eksctl
を使用している場合は、シークレットの自動的な再暗号化をオプトアウトしない限り、次のコマンドを実行する必要はありません。
kubectl get secrets --all-namespaces -o json | kubectl annotate --overwrite -f - kms-encryption-timestamp="
<time value>
"
既存のクラスターで有効にしたシークレット暗号化
create-key
コマンドでは、デフォルトで対称キーが作成されます。この際には、アカウントのルート管理者に AWS KMS アクションとリソースへのアクセスを許可する、キーポリシーが使用されます。アクセス許可の範囲を絞り込む場合は、kms:DescribeKey
API を呼び出すプリンシパルのポリシーで、kms:CreateGrant
および create-cluster
アクションが許可されていることを確認します。
Amazon EKS は、ポリシー条件 kms:GrantIsForAWSResource
をサポートしていません。このアクションが KMS キーポリシーステートメントにある場合、クラスターの作成は機能しません。