翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
クラスターアップグレードのベストプラクティス
このガイドでは、クラスター管理者が Amazon EKSアップグレード戦略を計画および実行する方法について説明します。また、セルフマネージド型ノード、マネージド型ノードグループ、Karpenter ノード、Fargate ノードをアップグレードする方法について説明します。AnywhereEKS、セルフマネージド型 Kubernetes、AWSOutposts、またはAWSローカルゾーンに関するガイダンスは含まれません。
概要
Kubernetes バージョンには、コントロールプレーンとデータプレーンの両方が含まれます。円滑なオペレーションを実現するには、コントロールプレーンとデータプレーンの両方が 1.24 などの同じ Kubernetes マイナーバージョン
-
コントロールプレーン — コントロールプレーンのバージョンは、Kubernetes APIサーバーによって決定されます。Amazon EKSクラスターでは、 AWSがこのコンポーネントの管理を担当します。コントロールプレーンのアップグレードはAWS、 を介して開始できますAPI。
-
データプレーン — データプレーンバージョンは、個々のノードで実行されている Kubelet バージョンに関連付けられます。同じクラスター内のノードで異なるバージョンを実行することができます。を実行すると、すべてのノードのバージョンを確認できます
kubectl get nodes
。
アップグレード前
Amazon で Kubernetes バージョンをアップグレードする場合はEKS、アップグレードを開始する前にいくつかの重要なポリシー、ツール、手順を実施する必要があります。
-
非推奨ポリシーを理解する — Kubernetes 非推奨ポリシー
の仕組みを深く理解します。既存のアプリケーションに影響を与える可能性のある今後の変更に注意してください。新しいバージョンの Kubernetes では、多くの場合、特定の APIsおよび 機能が段階的に廃止されるため、アプリケーションの実行に問題が発生する可能性があります。 -
Kubernetes 変更ログの確認 — Amazon Kubernetes バージョンとともに Kubernetes 変更ログ
を徹底的に確認し、ワークロードに影響を与える可能性のある変更の中断など、クラスターへの影響の可能性を理解します。 EKS -
クラスターアドオンの互換性の評価 — Amazon EKS は、新しいバージョンがリリースされたとき、またはクラスターを新しい Kubernetes マイナーバージョンに更新した後に、アドオンを自動的に更新しません。アドオンの更新を確認して、アップグレード先のクラスターバージョンとの既存のクラスターアドオンの互換性を理解します。
-
コントロールプレーンログ記録を有効にする — アップグレードプロセス中に発生する可能性のあるログ、エラー、または問題をキャプチャするためのコントロールプレーンログ記録を有効にします。異常がないか、これらのログを確認することを検討してください。非本番環境でクラスターのアップグレードをテストするか、自動テストを継続的統合ワークフローに統合して、アプリケーション、コントローラー、カスタム統合とのバージョン互換性を評価します。
-
クラスター管理の eksctl を調べる — EKSクラスターの管理に eksctl
を使用することを検討してください。これにより、コントロールプレーンの更新、アドオンの管理、ワーカーノードの更新の処理 を行うことができますout-of-the-box。 -
マネージドノードグループまたは EKS Fargate で Opt - EKSマネージドノードグループまたは Fargate でワーカーノードのアップグレードを合理化および自動化します。 EKS これらのオプションにより、プロセスが簡素化され、手動介入が軽減されます。
-
kubectl 変換プラグインを利用する — kubectl 変換プラグイン
を活用して、さまざまなAPIバージョン間で Kubernetes マニフェストファイルの変換 を容易にします。これにより、設定が新しい Kubernetes バージョンと互換性を保つことができます。
クラスターを保持する up-to-date
Kubernetes の更新を最新の状態に保つことは、Amazon の 責任共有モデルを反映した、安全で効率的なEKS環境にとって最も重要ですEKS。これらの戦略を運用ワークフローに統合することで、最新の機能と改善を最大限に活用する up-to-dateの安全なクラスターを維持する体制を整えることができます。戦術:
-
サポートされているバージョンポリシー — Kubernetes コミュニティに合わせて、Amazon EKSは通常 3 つのアクティブな Kubernetes バージョンを提供します。Kubernetes マイナーバージョンは、リリース後最初の 14 EKS か月間、Amazon で標準サポートされています。標準サポート終了日を過ぎたバージョンは、次の 12 か月間の延長サポートに入ります。非推奨通知は、バージョンが標準サポート終了日に達する少なくとも 60 日前に発行されます。詳細については、EKS「バージョンライフサイクルドキュメント」を参照してください。
-
自動アップグレードポリシー — EKSクラスター内の Kubernetes 更新と同期しておくことを強くお勧めします。Kubernetes バージョンで実行され、26 か月のライフサイクル (14 か月の標準サポートと 12 か月の延長サポート) を完了したクラスターは、次のバージョンに自動的にアップグレードされます。延長サポート を無効にすることができることに注意してください。バージョンが end-of-life自動アップグレードをトリガーする前にプロアクティブにアップグレードしないと、ワークロードとシステムが中断される可能性があります。詳細については、 EKSバージョン FAQsを参照してください。
-
アップグレードランブックの作成 — アップグレードを管理するための文書化されたプロセスを確立します。プロアクティブアプローチの一環として、アップグレードプロセスに合わせたランブックと特殊なツールを開発します。これにより、準備が強化されるだけでなく、複雑な移行も簡素化されます。クラスターを少なくとも 1 年に 1 回はアップグレードすることを標準慣行としてください。このプラクティスは、継続的な技術の進歩に合わせて、環境の効率とセキュリティを向上させます。
EKS リリースカレンダーを確認する
EKS Kubernetes リリースカレンダーを確認して、新しいバージョンがいつリリースされるか、特定のバージョンのサポートが終了するかを確認してください。一般的に、 は Kubernetes のマイナーバージョンを毎年 3 つEKSリリースし、各マイナーバージョンは約 14 か月間サポートされています。
さらに、アップストリーム Kubernetes リリース情報
責任共有モデルがクラスターのアップグレードにどのように適用されるかを理解する
クラスターコントロールプレーンとデータプレーンの両方のアップグレードを開始する責任があります。アップグレードを開始する方法について説明します。クラスターのアップグレードを開始すると、 はクラスターコントロールプレーンのアップグレードAWSを管理します。Fargate ポッドやアドオン など、データプレーンのアップグレードはお客様の責任となります。クラスターで実行されているワークロードのアップグレードを検証して計画し、クラスターのアップグレード後に可用性とオペレーションに影響がないことを確認する必要があります。
クラスターをインプレースでアップグレードする
EKS は、インプレースクラスターアップグレード戦略をサポートします。これにより、クラスターリソースが維持され、クラスター設定が一貫して維持されます (APIエンドポイント、、OIDCENIs、ロードバランサーなど)。これはクラスターユーザーにとってそれほど破壊的ではなく、ワークロードを再デプロイしたり、外部リソース ( 、ストレージなど) を移行したりすることなくDNS、クラスター内の既存のワークロードとリソースを使用します。
インプレースクラスターアップグレードを実行する場合、一度に実行できるマイナーバージョンアップグレードは 1 つだけであることに注意してください (例: 1.24 から 1.25)。
つまり、複数のバージョンを更新する必要がある場合は、一連のシーケンシャルアップグレードが必要になります。シーケンシャルアップグレードの計画はより複雑であり、ダウンタイムのリスクが高くなります。この場合は、「」を参照してくださいインプレースクラスターアップグレードの代替としてブルー/グリーンクラスターを評価する。
コントロールプレーンとデータプレーンを順番にアップグレードする
クラスターをアップグレードするには、次のアクションを実行する必要があります。
-
Managed Node Groups が使用されている場合は、コントロールプレーンと同じ Kubernetes バージョンにあることを確認します。EKS EKS Fargate Profiles によって作成されたマネージドノードグループとノードは、Kubernetes バージョン 1.27 以下のコントロールプレーンとデータプレーン間の 2 つのマイナーバージョンスキューをサポートしています。1.28 以降、EKSFargate Profiles によって作成されたEKSマネージドノードグループとノードは、コントロールプレーンとデータプレーン間で 3 つのマイナーバージョンスキューをサポートしています。例えば、EKSコントロールプレーンのバージョンが 1.28 の場合、1.25 という古いバージョンの kubelet を安全に使用できます。EKS バージョンが 1.27 の場合、使用できる最も古い kubelet バージョンは 1.25 です。
-
アドオンの互換性を確認します。必要に応じて、Kubernetes アドオンとカスタムコントローラーをアップグレードします。
-
クラスターデータプレーンをアップグレードします。ノードをアップグレードしたクラスターと同じ Kubernetes マイナーバージョンにアップグレードします。
EKS ドキュメントを使用してアップグレードチェックリストを作成する
EKS Kubernetes バージョンドキュメントには、バージョンごとの変更の詳細なリストが含まれています。アップグレードごとにチェックリストを作成します。
特定のEKSバージョンアップグレードのガイダンスについては、ドキュメントで各バージョンに特筆すべき変更点と考慮事項を確認してください。
Kubernetes を使用してアドオンとコンポーネントをアップグレードする API
クラスターをアップグレードする前に、使用している Kubernetes コンポーネントのバージョンを理解しておく必要があります。クラスターコンポーネントをインベントリし、Kubernetes APIを直接使用するコンポーネントを特定します。これには、モニタリングおよびログ記録エージェント、クラスターオートスケーラー、コンテナストレージドライバー (、 などEBSCSIEFSCSI)、イングレスコントローラー、Kubernetes APIに直接依存するその他のワークロードやアドオンなどの重要なクラスターコンポーネントが含まれます。
ヒント
重要なクラスターコンポーネントは、多くの場合、*-system
名前空間にインストールされます。
kubectl get ns | grep '-system'
Kubernetes に依存するコンポーネントを特定したらAPI、そのドキュメントでバージョンの互換性とアップグレード要件を確認してください。例えば、バージョンの互換性については、AWSLoad Balancerコントローラー
クラスターには、Kubernetes を使用する多くのワークロードが含まれていることが多く、進入コントローラー、継続的デリバリーシステム、モニタリングツールなどのワークロード機能にAPI必要です。EKS クラスターをアップグレードするときは、アドオンとサードパーティーのツールもアップグレードして、互換性があることを確認する必要があります。
一般的なアドオンの例と、関連するアップグレードドキュメントを参照してください。
-
Amazon VPCCNI: 各クラスターバージョンの Amazon VPCCNIアドオンの推奨バージョンについては、「Kubernetes セルフマネージドアドオン の Amazon VPCCNIプラグインの更新」を参照してください。Amazon EKS アドオンとしてインストールする場合、一度にアップグレードできるマイナーバージョンは 1 つだけです。
-
kube-proxy:「Kubernetes kube-proxy セルフマネージドアドオンの更新」を参照してください。
-
Core DNS: CoreDNS セルフマネージドアドオンの更新を参照してください。
-
AWS Load Balancer Controller: AWS Load Balancer Controller は、デプロイしたEKSバージョンと互換性がある必要があります。詳細については、インストールガイドを参照してください。
-
Amazon Elastic Block Store (Amazon EBS) Container Storage Interface (CSI) ドライバー: インストールとアップグレードについては、「Amazon EKS アドオン としての Amazon EBSCSIドライバーの管理」を参照してください。
-
Amazon Elastic File System (Amazon EFS) Container Storage Interface (CSI) ドライバー: インストールとアップグレードについては、「Amazon EFSCSIドライバー」を参照してください。
-
Kubernetes メトリクスサーバー: 詳細については、「」の「メトリクスサーバー
」を参照してくださいGitHub。 -
Kubernetes Cluster Autoscaler: Kubernetes Cluster Autoscaler のバージョンをアップグレードするには、デプロイ内のイメージのバージョンを変更します。Cluster Autoscaler は Kubernetes スケジューラと緊密に結合されています。クラスターをアップグレードするときには常にアップグレードする必要があります。GitHub リリース
を確認して、Kubernetes マイナーバージョンに対応する最新リリースのアドレスを見つけます。 -
Karpenter: インストールとアップグレードについては、Karpenter ドキュメントを参照してください。
アップグレード前に基本EKS要件を確認する
AWS では、アップグレードプロセスを完了するために、アカウント内の特定のリソースが必要です。これらのリソースが存在しない場合、クラスターをアップグレードすることはできません。コントロールプレーンのアップグレードには、次のリソースが必要です。
-
使用可能な IP アドレス: Amazon EKSでは、クラスターを更新するために、クラスターの作成時に指定したサブネットから最大 5 つの使用可能な IP アドレスが必要です。そうでない場合は、バージョン更新を実行する前に、クラスター設定を更新して新しいクラスターサブネットを含めます。
-
EKS IAM ロール: コントロールプレーンIAMロールは、必要なアクセス許可を持つアカウント内にまだ存在します。
-
クラスターでシークレット暗号化が有効になっている場合は、クラスターIAMロールに AWS Key Management Service (AWS KMS) キーを使用するアクセス許可があることを確認してください。
使用可能な IP アドレスを確認する
クラスターを更新するには、Amazon では、クラスターの作成時に指定したサブネットから最大 5 つの使用可能な IP アドレスEKSが必要です。
サブネットにクラスターをアップグレードするのに十分な IP アドレスがあることを確認するには、次のコマンドを実行します。
CLUSTER=<cluster name> aws ec2 describe-subnets --subnet-ids \ $(aws eks describe-cluster --name ${CLUSTER} \ --query 'cluster.resourcesVpcConfig.subnetIds' \ --output text) \ --query 'Subnets[*].[SubnetId,AvailabilityZone,AvailableIpAddressCount]' \ --output table ---------------------------------------------------- | DescribeSubnets | +---------------------------+--------------+-------+ | subnet-067fa8ee8476abbd6 | us-east-1a | 8184 | | subnet-0056f7403b17d2b43 | us-east-1b | 8153 | | subnet-09586f8fb3addbc8c | us-east-1a | 8120 | | subnet-047f3d276a22c6bce | us-east-1b | 8184 | +---------------------------+--------------+-------+
VPC CNI Metrics Helper
-
は、クラスターの作成時に選択された の同じセットに属AZsします。
-
クラスターの作成時にVPC提供されたものと同じ に属している
既存のCIDRブロックの IP アドレスがなくなった場合は、追加のVPCCIDRブロックの関連付けを検討してください。AWS では、追加のCIDRブロックを既存のクラスター に関連付けることができVPC、IP アドレスプールを効果的に拡張できます。この拡張は、追加のプライベート IP 範囲 (RFC 1918) を導入するか、必要に応じてパブリック IP 範囲 ( 1918 年以外RFC) を導入することで実現できます。Amazon が新しい を使用する前にEKS、新しいVPCCIDRブロックを追加し、VPC更新の完了を許可する必要がありますCIDR。その後、新しく設定されたCIDRブロックに基づいてサブネットを に更新できますVPC。
EKS IAM ロールを検証する
IAM ロールが使用可能で、アカウントで正しいロールの引き受けポリシーがあることを確認するには、次のコマンドを実行します。
CLUSTER=<cluster name> ROLE_ARN=$(aws eks describe-cluster --name ${CLUSTER} \ --query 'cluster.roleArn' --output text) aws iam get-role --role-name ${ROLE_ARN##*/} \ --query 'Role.AssumeRolePolicyDocument' { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "eks.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
EKS アドオンに移行する
Amazon は、Kubernetes、、kube-proxy
および CoreDNS 用の Amazon VPCCNIプラグインなどのアドオンをクラスターごとにEKS自動的にインストールします。アドオンは、セルフマネージド型でも、Amazon EKS アドオンとしてインストールすることもできます。Amazon EKS アドオンは、 EKS を使用してアドオンを管理する代替方法ですAPI。
Amazon EKS アドオンを使用して、1 つのコマンドでバージョンを更新できます。例:
aws eks update-addon —cluster-name my-cluster —addon-name vpc-cni —addon-version version-number \ --service-account-role-arn arn:aws:iam::111122223333:role/role-name —configuration-values '{}' —resolve-conflicts PRESERVE
以下を含むEKSアドオンがあるかどうかを確認します。
aws eks list-addons --cluster-name <cluster name>
警告
EKS アドオンは、コントロールプレーンのアップグレード中に自動的にアップグレードされません。EKS アドオンの更新を開始し、目的のバージョンを選択する必要があります。
-
利用可能なすべてのバージョンから互換性のあるバージョンを選択する責任があります。アドオンバージョンの互換性に関するガイダンスを確認してください。
-
Amazon EKS Add-ons は、一度に 1 つのマイナーバージョンしかアップグレードできません。
EKSアドオンとして利用可能なコンポーネントと、使用を開始する方法について説明します。
EKSアドオンにカスタム設定を提供する方法について説明します。
コントロールプレーンをアップグレードする前に、削除されたAPI使用状況を特定して修正する
EKS コントロールプレーンをアップグレードAPIsする前に、削除された APIの使用を特定する必要があります。そのためには、実行中のクラスターまたは静的にレンダリングされた Kubernetes マニフェストファイルをチェックできるツールを使用することをお勧めします。
静的マニフェストファイルに対してチェックを実行する方が一般的に正確です。ライブクラスターに対して実行した場合、これらのツールは誤検出を返す可能性があります。
非推奨の Kubernetes APIは、 API が削除されたことを意味するものではありません。Kubernetes 非推奨ポリシー
クラスターインサイト
Cluster Insights は、EKSクラスターを新しいバージョンの Kubernetes にアップグレードする機能に影響を与える可能性のある問題に関する検出結果を提供する機能です。これらの検出結果は Amazon によってキュレーションおよび管理EKSされ、修正方法に関する推奨事項を提供します。Cluster Insights を活用することで、新しい Kubernetes バージョンへのアップグレードにかかる労力を最小限に抑えることができます。
EKS クラスターのインサイトを表示するには、 コマンドを実行します。
aws eks list-insights --region <region-code> --cluster-name <my-cluster> { "insights": [ { "category": "UPGRADE_READINESS", "name": "Deprecated APIs removed in Kubernetes v1.29", "insightStatus": { "status": "PASSING", "reason": "No deprecated API usage detected within the last 30 days." }, "kubernetesVersion": "1.29", "lastTransitionTime": 1698774710.0, "lastRefreshTime": 1700157422.0, "id": "123e4567-e89b-42d3-a456-579642341238", "description": "Checks for usage of deprecated APIs that are scheduled for removal in Kubernetes v1.29. Upgrading your cluster before migrating to the updated APIs supported by v1.29 could cause application impact." } ] }
受信したインサイトに関するよりわかりやすい出力については、 コマンドを実行できます。
aws eks describe-insight --region <region-code> --id <insight-id> --cluster-name <my-cluster>
Amazon EKSコンソールUpgrade Insights
タブの下に表示されます。
でクラスターインサイトが見つかった場合は"status": ERROR
、クラスターのアップグレードを実行する前に問題に対処する必要があります。aws eks describe-insight
コマンドを実行して、次の修復アドバイスを共有します。
影響を受けるリソース:
"resources": [ { "insightStatus": { "status": "ERROR" }, "kubernetesResourceUri": "/apis/policy/v1beta1/podsecuritypolicies/null" } ]
APIs 非推奨:
"deprecationDetails": [ { "usage": "/apis/flowcontrol.apiserver.k8s.io/v1beta2/flowschemas", "replacedWith": "/apis/flowcontrol.apiserver.k8s.io/v1beta3/flowschemas", "stopServingVersion": "1.29", "clientStats": [], "startServingReplacementVersion": "1.26" } ]
推奨されるアクション:
"recommendation": "Update manifests and API clients to use newer Kubernetes APIs if applicable before upgrading to Kubernetes v1.26."
EKS コンソールを通じてクラスターインサイトを活用するか、EKSクラスターバージョンを正常にアップグレードするプロセスを高速化CLIします。詳細については、次のリソースを参照してください。* 公式EKSドキュメント * クラスターインサイト起動ブログ
Kube-no-trouble
Kube-no-troublekubent
。引数kubent
なしで を実行すると、現在の KubeConfigコンテキストを使用し、クラスターをスキャンして、廃止および削除される内容を含むレポートを印刷APIsします。
kubent 4:17PM INF >>> Kube No Trouble `kubent` <<< 4:17PM INF version 0.7.0 (git sha d1bb4e5fd6550b533b2013671aa8419d923ee042) 4:17PM INF Initializing collectors and retrieving data 4:17PM INF Target K8s version is 1.24.8-eks-ffeb93d 4:l INF Retrieved 93 resources from collector name=Cluster 4:17PM INF Retrieved 16 resources from collector name="Helm v3" 4:17PM INF Loaded ruleset name=custom.rego.tmpl 4:17PM INF Loaded ruleset name=deprecated-1-16.rego 4:17PM INF Loaded ruleset name=deprecated-1-22.rego 4:17PM INF Loaded ruleset name=deprecated-1-25.rego 4:17PM INF Loaded ruleset name=deprecated-1-26.rego 4:17PM INF Loaded ruleset name=deprecated-future.rego __________________________________________________________________________________________ >>> Deprecated APIs removed in 1.25 <<< ------------------------------------------------------------------------------------------ KIND NAMESPACE NAME API_VERSION REPLACE_WITH (SINCE) PodSecurityPolicy <undefined> eks.privileged policy/v1beta1 <removed> (1.21.0)
また、静的マニフェストファイルや helm パッケージのスキャンにも使用できます。マニフェストがデプロイされる前に問題を特定するために、継続的統合 (CI) プロセスkubent
の一部として を実行することをお勧めします。マニフェストのスキャンは、ライブクラスターのスキャンよりも正確です。
Kube-no-trouble は、サンプルサービスアカウントとロール
冥王星
もう kubent
1 つのオプションは https://pluto.docs.fairwinds.com/
pluto detect-all-in-cluster NAME KIND VERSION REPLACEMENT REMOVED DEPRECATED REPL AVAIL eks.privileged PodSecurityPolicy policy/v1beta1 false true true
リソース
アップグレードAPIs前にクラスターが廃止されていないことを確認するには、以下をモニタリングする必要があります。
-
Kubernetes v1.19
apiserver_requested_deprecated_apis
以降のメトリクス:
kubectl get --raw /metrics | grep apiserver_requested_deprecated_apis apiserver_requested_deprecated_apis{group="policy",removed_release="1.25",resource="podsecuritypolicies",subresource="",version="v1beta1"} 1
-
が
k8s.io/deprecated
に設定されている監査ログのイベントtrue
:
CLUSTER="<cluster_name>" QUERY_ID=$(aws logs start-query \ --log-group-name /aws/eks/${CLUSTER}/cluster \ --start-time $(date -u --date="-30 minutes" "+%s") # or date -v-30M "+%s" on MacOS \ --end-time $(date "+%s") \ --query-string 'fields @message | filter `annotations.k8s.io/deprecated`="true"' \ --query queryId --output text) echo "Query started (query id: $QUERY_ID), please hold ..." && sleep 5 # give it some time to query aws logs get-query-results --query-id $QUERY_ID
非推奨の場合に行APIsを出力します。
{ "results": [ [ { "field": "@message", "value": "{\"kind\":\"Event\",\"apiVersion\":\"audit.k8s.io/v1\",\"level\":\"Request\",\"auditID\":\"8f7883c6-b3d5-42d7-967a-1121c6f22f01\",\"stage\":\"ResponseComplete\",\"requestURI\":\"/apis/policy/v1beta1/podsecuritypolicies?allowWatchBookmarks=true\\u0026resourceVersion=4131\\u0026timeout=9m19s\\u0026timeoutSeconds=559\\u0026watch=true\",\"verb\":\"watch\",\"user\":{\"username\":\"system:apiserver\",\"uid\":\"8aabfade-da52-47da-83b4-46b16cab30fa\",\"groups\":[\"system:masters\"]},\"sourceIPs\":[\"::1\"],\"userAgent\":\"kube-apiserver/v1.24.16 (linux/amd64) kubernetes/af930c1\",\"objectRef\":{\"resource\":\"podsecuritypolicies\",\"apiGroup\":\"policy\",\"apiVersion\":\"v1beta1\"},\"responseStatus\":{\"metadata\":{},\"code\":200},\"requestReceivedTimestamp\":\"2023-10-04T12:36:11.849075Z\",\"stageTimestamp\":\"2023-10-04T12:45:30.850483Z\",\"annotations\":{\"authorization.k8s.io/decision\":\"allow\",\"authorization.k8s.io/reason\":\"\",\"k8s.io/deprecated\":\"true\",\"k8s.io/removed-release\":\"1.25\"}}" }, [...]
Kubernetes ワークロードを更新します。kubectl-convert を使用してマニフェストを更新する
更新する必要があるワークロードとマニフェストを特定したら、マニフェストファイル内のリソースタイプ ( など PodSecurityStandards) PodSecurityPolicies を変更する必要があります。そのためには、置き換えるリソースに応じて、リソース仕様を更新し、追加の調査を行う必要があります。
リソースタイプが同じままでAPIバージョンを更新する必要がある場合は、 kubectl-convert
コマンドを使用してマニフェストファイルを自動的に変換できます。例えば、古いデプロイを に変換しますapps/v1
。詳細については、Kubernetes ウェブサイトの「kubectl 変換プラグインのインストール
kubectl-convert -f <file> --output-version <group>/<version>
データプレーンのアップグレード中にワークロードの可用性 topologySpreadConstraints を確保するために PodDisruptionBudgets と を設定する
データプレーンのアップグレード中にワークロードが確実に利用可能topologySpreadConstraints
ワークロードが複数のアベイラビリティーゾーンに分散され、トポロジースプレッドを持つ複数のホストに分散されていることを確認すると、ワークロードがインシデントなしで新しいデータプレーンに自動的に移行されるという信頼度が高まります。
これは、レプリカの 80% が常に利用可能で、レプリカをゾーンとホストに分散するワークロードの例です。
apiVersion: policy/v1 kind: PodDisruptionBudget metadata: name: myapp spec: minAvailable: "80%" selector: matchLabels: app: myapp --- apiVersion: apps/v1 kind: Deployment metadata: name: myapp spec: replicas: 10 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - image: public.ecr.aws/eks-distro/kubernetes/pause:3.2 name: myapp resources: requests: cpu: "1" memory: 256M topologySpreadConstraints: - labelSelector: matchLabels: app: host-zone-spread maxSkew: 2 topologyKey: kubernetes.io/hostname whenUnsatisfiable: DoNotSchedule - labelSelector: matchLabels: app: host-zone-spread maxSkew: 2 topologyKey: topology.kubernetes.io/zone whenUnsatisfiable: DoNotSchedule
AWS Resilience Hub
Managed Node Groups または Karpenter を使用してデータプレーンのアップグレードを簡素化する
Managed Node Groups と Karpenter はどちらもノードのアップグレードを簡素化しますが、アプローチは異なります。
マネージド型ノードグループは、ノードのプロビジョニングとライフサイクル管理を自動化します。つまり、1 回のオペレーションでノードを作成、自動更新、終了できます。
デフォルト設定では、Karpenter は最新の互換性のある EKS Optimized を使用して新しいノードを自動的に作成しますAMI。EKS リリースがEKS最適化AMIsまたはクラスターがアップグレードされると、Karpenter は自動的にこれらのイメージの使用を開始します。Karpenter は、ノードを更新するために Node Expiry も実装します。
Karpenter は、カスタム を使用するように設定できますAMIs。
既存のノードとコントロールプレーンとのバージョン互換性を確認する
Amazon で Kubernetes アップグレードを進める前にEKS、マネージドノードグループ、セルフマネージドノード、コントロールプレーン間の互換性を確保することが重要です。互換性は使用している Kubernetes バージョンによって決まり、シナリオによって異なります。戦術:
-
Kubernetes v1.28+ — ** Kubernetes バージョン 1.28 以降では、コアコンポーネントのより寛大なバージョンポリシーがあります。具体的には、Kubernetes APIサーバーと kubelet 間のサポートされているスキューは、n-2 から n-3 の 1 つのマイナーバージョンで拡張されています。例えば、EKSコントロールプレーンのバージョンが 1.28 の場合、kubelet バージョンは 1.25 という古いバージョンを安全に使用できます。このバージョンスキューは、AWSFargate 、マネージドノードグループ 、セルフマネージドノード でサポートされています。セキュリティ上の理由から、Amazon マシンイメージ (AMI) のバージョン up-to-dateを保管することを強くお勧めします。古い kubelet バージョンは、古い kubelet バージョンを使用する利点を上回る可能性のある一般的な脆弱性と露出 (CVEs) により、セキュリティ上のリスクをもたらす可能性があります。
-
Kubernetes < v1.28 — v1.28 より前のバージョンを使用している場合、APIサーバーと kubelet 間のサポートされているスキューは n-2 です。例えば、EKSバージョンが 1.27 の場合、使用できる最も古い kubelet バージョンは 1.25 です。このバージョンスキューは、AWSFargate 、マネージドノードグループ 、セルフマネージドノード に適用されます。
Karpenter マネージドノードのノードの有効期限を有効にする
Karpenter がノードアップグレードを実装する 1 つの方法は、ノードの有効期限という概念を使用することです。これにより、ノードのアップグレードに必要な計画が削減されます。プロビジョナーでttlSecondsUntil期限切れの値を設定すると、ノードの有効期限が有効になります。ノードが定義された経過時間を数秒で経過すると、ノードは安全にドレインおよび削除されます。これは、ノードが使用中であっても当てはまります。ノードを新しくプロビジョニングされたアップグレードされたインスタンスに置き換えることができます。ノードが置き換えられると、Karpenter は最新の EKSに最適化された を使用しますAMIs。詳細については、Karpenter ウェブサイトの「プロビジョニングの解除
Karpenter は、この値にジッターを自動的に追加しません。ワークロードの過剰な中断を防ぐには、Kubernetes ドキュメントに示すように、ポッドの中断予算
プロビジョナーでttlSecondsUntil期限切れを設定する場合、これはプロビジョナーに関連付けられた既存のノードに適用されます。
Karpenter マネージドノードにドリフト機能を使用する
Karpenter の Drift 機能
EKS クラスターのアップグレードが完了すると、Karpenter の Drift 機能は、Karpenter がプロビジョニングしたノードが以前のクラスターバージョンAMIsに EKS-Optimized を使用していることを検出し、それらのノードを自動的にコード、ドレイン、および置き換えます。新しいノードへのポッドの移動をサポートするには、適切なポッドリソースクォータ を設定し
eksctl を使用してセルフマネージド型ノードグループのアップグレードを自動化する
セルフマネージド型ノードグループは、アカウントにデプロイされ、EKSサービス外のクラスターにアタッチされたEC2インスタンスです。これらは通常、何らかのオートメーションツールによってデプロイおよび管理されます。セルフマネージド型ノードグループをアップグレードするには、ツールのドキュメントを参照してください。
例えば、eksctl はセルフマネージド型ノードの削除とドレインをサポートしています。
一般的なツールには、次のようなものがあります。
アップグレード前にクラスターをバックアップする
新しいバージョンの Kubernetes では、Amazon EKSクラスターに大きな変更が加えられます。クラスターをアップグレードした後は、ダウングレードできません。
Velero
現在 でサポートされている Kubernetes バージョンの新しいクラスターのみを作成できることに注意してくださいEKS。クラスターが現在実行しているバージョンが引き続きサポートされており、アップグレードが失敗した場合、元のバージョンで新しいクラスターを作成し、データプレーンを復元できます。を含むAWSリソースはIAM、Velero によるバックアップに含まれていないことに注意してください。これらのリソースは再作成する必要があります。
コントロールプレーンのアップグレード後に Fargate デプロイを再起動する
Fargate データプレーンノードをアップグレードするには、ワークロードを再デプロイする必要があります。-o wide
オプションですべてのポッドを一覧表示することで、ファーゲートノードで実行されているワークロードを特定できます。で始まるノード名fargate-
は、クラスターに再デプロイする必要があります。
インプレースクラスターアップグレードの代替としてブルー/グリーンクラスターを評価する
一部のお客様は、ブルー/グリーンアップグレード戦略の実行を好みます。これには利点がありますが、考慮すべき欠点も含まれます。
利点は次のとおりです。
-
複数のEKSバージョンを一度に変更可能 (例: 1.23 から 1.25)
-
古いクラスターに切り替えることができる
-
新しいシステム (例: terraform) で管理できる新しいクラスターを作成します。
-
ワークロードは個別に移行できます
欠点には、次のようなものがあります。
-
API コンシューマーの更新を必要とするエンドポイントとOIDC変更 (kubectl や CI/CD など)
-
移行中に 2 つのクラスターを並行して実行する必要があるため、コストがかかり、リージョンの容量が制限される可能性があります
-
ワークロードが相互に依存して移行する場合は、さらに調整が必要です
-
ロードバランサーと外部は複数のクラスターに簡単にまたがるDNSことはできません
この戦略は可能ですが、インプレースアップグレードよりもコストがかかり、調整やワークロードの移行により多くの時間が必要です。状況によっては必要になる場合があり、慎重に計画する必要があります。
のような高度な自動化と宣言システムを使用すると GitOps、これが容易になる場合があります。データをバックアップして新しいクラスターに移行するには、ステートフルワークロードに対して追加の予防措置を講じる必要があります。
詳細については、以下のブログ記事を参照してください。
Kubernetes プロジェクトで計画された大きな変更を追跡する — 先を考える
次のバージョンだけを見ないでください。リリースされた Kubernetes の新しいバージョンを確認し、大きな変更を特定します。例えば、一部のアプリケーションは docker を直接使用しておりAPI、Docker (Dockershim とも呼ばれますCRI) の Container Runtime Interface () のサポートが Kubernetes で削除されました1.24
。このような変更には、準備により多くの時間が必要です。
アップグレード先のバージョンの文書化されたすべての変更を確認し、必要なアップグレードステップをメモします。また、Amazon EKSマネージドクラスターに固有の要件や手順についても注意してください。
機能の削除に関する具体的なガイダンス
1.25 での Dockershim の削除 - Detector for Docker Socket の使用 (DDS)
EKS Optimized AMI for 1.25 には Dockershim のサポートが含まれなくなりました。Dockershim に依存関係がある場合、例えば Docker ソケットをマウントする場合、ワーカーノードを 1.25 にアップグレードする前に、これらの依存関係を削除する必要があります。
1.25 にアップグレードする前に、Docker ソケットに依存しているインスタンスを見つけます。Detector for Docker Socket (DDS)、kubectl プラグインを使用することをお勧めします
1.25 PodSecurityPolicy の の削除 - Pod セキュリティ標準または policy-as-codeソリューションへの移行
PodSecurityPolicy
は Kubernetes 1.21 では廃止
AWS は、 EKSドキュメントFAQで詳細な を発行しました。
Pod Security Standards (PSS) と Pod Security Admission (PSA)
Kubernetes ウェブサイトのPodSecurityPolicy非推奨ブログ記事
1.23 でのツリー内ストレージドライバーの廃止 - コンテナストレージインターフェイス (CSI) ドライバーへの移行
Container Storage Interface (CSI) は、Kubernetes が既存のツリー内ストレージドライバーメカニズムを置き換えるのに役立つように設計されています。Amazon EBSコンテナストレージインターフェイス (CSI) の移行機能は、Amazon EKS1.23
以降のクラスターでデフォルトで有効になっています。バージョン 1.22
以前のクラスターでポッドを実行している場合は、サービスの中断を避けるため1.23
、クラスターをバージョン に更新する前に Amazon EBSCSIドライバーをインストールする必要があります。
Amazon EBSCSI移行に関するよくある質問 を確認します。
その他のリソース
ClowdHaus EKS アップグレードガイダンス
ClowdHaus EKS Upgrade Guidance
GoNoGo
GoNoGo