2025.11.12
インプレースデプロイメントによりWebサービスを停止せずにEKSをアップグレード
結論
- EKSをインプレースデプロイメントで無停止アップグレード出来た
- EKSの延長サポートの料金を削減してAWSリソースのランニングコストを改善出来た
はじめに
こんにちは。次世代システム研究室のT.Tです。
前回の記事では、現在開発運用に携わっているWebサービスのAWS移行後の運用方針についてご紹介しました。その後、その記事内でご紹介した内容で本番環境のEKSをアップグレードし、新しいEKSのバージョンでWebサービスが安定して稼働しています。前回の記事では触れていませんでしたが、アップグレード前はKubernetesの1.29を利用していて、元の計画ではこのバージョンの延長サポート期限の2026年3月23日に近いスケジュールでアップグレードする計画でしたが、計画を前倒ししてアップグレードしました。
本記事では、EKSのアップグレードスケジュールを前倒しした点を踏まえて、本番環境でのEKSをアップグレードした内容についてご紹介します。
1.EKSのバージョンライフサイクル
EKSのリリースカレンダー
Amazon EKS Kubernetes リリースカレンダーは、以下のスケジュールとなっていて、アップグレード前のバージョンの1.29は延長サポート期間に入っています。また、最新のバージョンは、1.33となっています。
| Kubernetes バージョン | アップストリームのリリース | Amazon EKS リリース | 標準サポート終了日 | 延長サポートの終了日 |
|---|---|---|---|---|
1.33 |
2025 年 4 月 23 日 | 2025 年 5 月 29 日 | 2026 年 7 月 29 日 | 2027 年 7 月 29 日 |
1.32 |
2024 年 12 月 11 日 | 2025年1月23日 | 2026 年 3 月 23 日 | 2027年3月23日 |
1.31 |
2024 年 8 月 13 日 | 2024 年 9 月 26 日 | 2025 年 11 月 26 日 | 2026 年 11 月 26 日 |
1.30 |
2024 年 4 月 17 日 | 2024 年 5 月 23 日 | 2025 年 7 月 23 日 | 2026 年 7 月 23 日 |
1.29 |
2023 年 12 月 13 日 | 2024 年 1 月 23 日 | 2025 年 3 月 23 日 | 2026 年 3 月 23 日 |
1.28 |
2023 年 8 月 15 日 | 2023 年 9 月 26 日 | 2024 年 11 月 26 日 | 2025 年 11 月 26 日 |
EKSの料金体系
Amazon EKS extended support for Kubernetes versions pricingによると、EKSクラスターの利用料金は、標準サポート期間中は$0.10/月、延長サポート期間中は$0.60/月となっていて、延長サポート期間になると利用料金が6倍になります。2つのサポート期間で生じる差額を円建ての月額にすると、約55,000円/月(1ドル≒150円で算出)です。
2.EKSのアップグレードスケジュール
EKSのアップグレードスケジュールを前倒しした理由
EKSのアップグレードにより本番環境の一時停止等が発生する懸念があったのと延長サポート期間に先述の差額が発生することを見落としていたため、延長サポート期限に近いスケジュールでアップグレードするスケジュールを検討していました。しかし、延長サポート期間で発生する利用料金の差額が、現在のプロジェクトでは早急に改善したいコスト感だったため、当初のスケジュールより前倒しして優先的にアップグレードすることにしました。
EKSのアップグレード方針
EKSのアップグレードを計画した時点では、Kubernetesは1.33が最新のバージョンで、1.31以降が標準サポート期間中のバージョンとなっていました。1.31へのアップグレードまでにすると数ヶ月で標準サポート期間が完了してしまうので、最新の1.33までアップグレードして約1年程度はアップグレードせずに運用出来るよう計画しました。
1.29から1.33へのアップグレードは、アップグレード後に問題が発生した場合に切り戻し易くするために、各バージョンから1.29=>1.30、1.30=>1.31のように1つずつアップグレードするようにし、新しいバージョンにアップグレードした後に1週間程度安定稼働を確認してから次のバージョンにアップグレードする計画にしました。
このアップグレードをSandbox環境で事前に検証して、問題がないことを確認してから本番環境に適用を進めました。アップグレード期間の短縮のために、Sandbox環境では各バージョンの安定稼働期間を1〜2日に短縮して検証しました。
EKSの各バージョンでのアップグレード手順を次の項目で説明します。
3.EKSのアップグレード
EKSのアップグレード手順
インプレースデプロイメントによりアップグレードしました。以下の手順によりアップグレードすることでサービスを無停止で更新することが出来ます。
- アップグレードインサイトの確認
- コントロールプレーンのアップグレード
- EKSアドオンのアップグレード
- EKSマネージドノードグループのアップグレード
コントロールプレーンのアップグレードはブルーグリーンデプロイメント、EKSマネージドノードグループのアップグレードは各ノードのローリングアップデートによる更新で無停止で更新されます。
以降の項目では、1.29から1.30にアップグレードした際の手順について説明します。
アップグレードインサイトの確認
Amazon Elastic Kubernetes Service > クラスター > ${クラスタ名} > オブザーバビリティダッシュボードからアップグレードインサイトを確認出来ます。以下のようにアップグレードによる影響を確認出来ます。1.30へのアップグレード時点で確認すると、1.32へのアップグレード時に非推奨APIが削除される警告が出ています。1.30では問題ないため、このままアップグレードを進めました。

コントロールプレーンのアップグレード
EKSクラスターはCDKで構築しているため、CDKでアップグレードします。CDKのEKSクラスターとEKSアドオンのスタックは以下のようになっています。
export class EksClusterStack extends cdk.Stack {
constructor(scope: Construct, id: string, props: EksClusterProps) {
...
const eksCluster = new eks.CfnCluster(this, 'eks-cluster', {
...
version: '1.29',
...
});
...
const eksClusterAddonKubeProxy = new eks.CfnAddon(this, `${prefixResource}-kube-proxy-addon`, {
addonName: 'kube-proxy',
addonVersion: 'v1.XX.X-eksbuild.X',
...
});
eksClusterAddonKubeProxy.addDependency(eksCluster);
...
}
}
コントロールプレーンをアップグレードする場合は、EKSクラスターのバージョンだけ更新してCDKを実行します。
export class EksClusterStack extends cdk.Stack {
constructor(scope: Construct, id: string, props: EksClusterProps) {
...
const eksCluster = new eks.CfnCluster(this, 'eks-cluster', {
...
version: '1.30', // <- 1.29
...
});
...
}
}
$ npm run cdk:prod -- --profile prod deploy eks-cluster-stack ... eks-cluster-stack eks-cluster-stack: deploying... [2/2] eks-cluster-stack: creating CloudFormation changeset... eks-cluster-stack | 0/10 | UPDATE_IN_PROGRESS | AWS::CloudFormation::Stack | eks-cluster-stack User Initiated eks-cluster-stack | 0/10 | UPDATE_IN_PROGRESS | AWS::EKS::Cluster | eks-cluster eks-cluster-stack | 1/10 | UPDATE_COMPLETE | AWS::EKS::Cluster | eks-cluster eks-cluster-stack | 2/10 | UPDATE_COMPLETE | AWS::EKS::Addon | vpc-cni-addon eks-cluster-stack | 3/10 | UPDATE_COMPLETE | AWS::EKS::Addon | kube-proxy-addon eks-cluster-stack | 4/10 | UPDATE_COMPLETE | AWS::EKS::Addon | core-dns-addon eks-cluster-stack | 5/10 | UPDATE_COMPLETE | AWS::EKS::AccessEntry | access-entry-AmazonEKSAdminViewPolicy-0 eks-cluster-stack | 6/10 | UPDATE_COMPLETE | AWS::EKS::Addon | eks-pod-identity-agent-addon eks-cluster-stack | 7/10 | UPDATE_COMPLETE | AWS::EKS::AccessEntry | access-entry-AmazonEKSClusterAdminPolicy-0 eks-cluster-stack | 8/10 | UPDATE_COMPLETE | AWS::IAM::OIDCProvider | oidc-provider eks-cluster-stack | 9/10 | UPDATE_COMPLETE | AWS::IAM::Role | eks-cluster-autoscaler-role eks-cluster-stack | 10/10 | UPDATE_COMPLETE | AWS::IAM::Role | eks-service-account-role eks-cluster-stack | 11/10 | UPDATE_COMPLETE | AWS::EC2::LaunchTemplate | launch-custom-template eks-cluster-stack | 12/10 | UPDATE_COMPLETE | AWS::EKS::Addon | amazon-cloudwatch-observability-addon eks-cluster-stack | 13/10 | UPDATE_COMPLETE | AWS::EKS::Nodegroup | node-group eks-cluster-stack | 14/10 | UPDATE_COMPLETE_CLEA | AWS::CloudFormation::Stack | eks-cluster-stack eks-cluster-stack | 15/10 | UPDATE_COMPLETE | AWS::CloudFormation::Stack | eks-cluster-stack ...
EKSアドオンのアップグレード
EKSアドオンをアップグレードする場合は、EKSアドオンのバージョンだけ更新してCDKを実行します。
export class EksClusterStack extends cdk.Stack {
constructor(scope: Construct, id: string, props: EksClusterProps) {
...
const eksClusterAddonKubeProxy = new eks.CfnAddon(this, `${prefixResource}-kube-proxy-addon`, {
addonName: 'kube-proxy',
addonVersion: 'v1.YY.Y-eksbuild.Y', <- v1.XX.X-eksbuild.X
...
});
eksClusterAddonKubeProxy.addDependency(eksCluster);
...
}
}
$ npm run cdk:prod -- --profile prod deploy eks-cluster-stack eks-cluster-stack eks-cluster-stack: deploying... [2/2] eks-cluster-stack: creating CloudFormation changeset... eks-cluster-stack | 0/7 | UPDATE_IN_PROGRESS | AWS::CloudFormation::Stack | eks-cluster-stack User Initiated eks-cluster-stack | 0/7 | UPDATE_IN_PROGRESS | AWS::EKS::Addon | vpc-cni-addon eks-cluster-stack | 0/7 | UPDATE_IN_PROGRESS | AWS::EKS::Addon | core-dns-addon eks-cluster-stack | 0/7 | UPDATE_IN_PROGRESS | AWS::EKS::Addon | eks-pod-identity-agent-addon eks-cluster-stack | 0/7 | UPDATE_IN_PROGRESS | AWS::EKS::Addon | kube-proxy-addon eks-cluster-stack | 0/7 | UPDATE_IN_PROGRESS | AWS::EKS::Addon | amazon-cloudwatch-observability-addon eks-cluster-stack | 1/7 | UPDATE_COMPLETE | AWS::EKS::Addon | core-dns-addon eks-cluster-stack | 2/7 | UPDATE_COMPLETE | AWS::EKS::Addon | kube-proxy-addon eks-cluster-stack | 3/7 | UPDATE_COMPLETE | AWS::EKS::Addon | eks-pod-identity-agent-addon eks-cluster-stack | 4/7 | UPDATE_COMPLETE | AWS::EKS::Addon | vpc-cni-addon eks-cluster-stack | 5/7 | UPDATE_COMPLETE | AWS::EKS::Addon | amazon-cloudwatch-observability-addon eks-cluster-stack | 6/7 | UPDATE_COMPLETE_CLEA | AWS::CloudFormation::Stack | eks-cluster-stack eks-cluster-stack | 7/7 | UPDATE_COMPLETE | AWS::CloudFormation::Stack | eks-cluster-stack
EKSマネージドノードグループのアップグレード
CDKのEKSマネージドノードグループ(EC2)のスタックは以下のようになっています。
export class EksClusterStack extends cdk.Stack {
...
const userData = `MIME-Version: 1.0
...
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
cluster:
...
kubelet:
config:
...
flags:
- "--node-labels=eks.amazonaws.com/nodegroup-image=ami-XXX,..."
...
`;
const launchTemplateDataProperty: ec2.CfnLaunchTemplate.LaunchTemplateDataProperty = {
blockDeviceMappings: [{
...
}],
imageId: 'ami-XXX',
...
};
const launchTemplate = new ec2.CfnLaunchTemplate(this, `${prefixResource}-launch-custom-template`, {
launchTemplateData: launchTemplateDataProperty,
});
...
EKSマネージドノードグループをアップグレードする場合は、EC2のamiバージョンだけ更新してCDKを実行します。
export class EksClusterStack extends cdk.Stack {
...
const userData = `MIME-Version: 1.0
...
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
cluster:
...
kubelet:
config:
...
flags:
- "--node-labels=eks.amazonaws.com/nodegroup-image=ami-YYY,..." // <- ami-XXX
...
`;
const launchTemplateDataProperty: ec2.CfnLaunchTemplate.LaunchTemplateDataProperty = {
blockDeviceMappings: [{
...
}],
imageId: 'ami-YYY', // <- ami-XXX
...
};
const launchTemplate = new ec2.CfnLaunchTemplate(this, `${prefixResource}-launch-custom-template`, {
launchTemplateData: launchTemplateDataProperty,
});
...
$ npm run cdk:prod -- --profile prod deploy eks-cluster-stack eks-cluster-stack eks-cluster-stack: deploying... [2/2] eks-cluster-stack: creating CloudFormation changeset... eks-cluster-stack | 0/4 | UPDATE_IN_PROGRESS | AWS::CloudFormation::Stack | eks-cluster-stack User Initiated eks-cluster-stack | 0/4 | UPDATE_IN_PROGRESS | AWS::EC2::LaunchTemplate | launch-custom-template eks-cluster-stack | 1/4 | UPDATE_COMPLETE | AWS::EC2::LaunchTemplate | launch-custom-template eks-cluster-stack | 1/4 | UPDATE_IN_PROGRESS | AWS::EKS::Nodegroup | node-group eks-cluster-stack | 2/4 | UPDATE_COMPLETE | AWS::EKS::Nodegroup | node-group eks-cluster-stack | 3/4 | UPDATE_COMPLETE_CLEA | AWS::CloudFormation::Stack | eks-cluster-stack eks-cluster-stack | 4/4 | UPDATE_COMPLETE | AWS::CloudFormation::Stack | eks-cluster-stack
アップグレード後にEKS内のリソースとWebサービスを動作確認して、問題なくアップグレードが出来ていることが確認出来ました。
4.非推奨API削除への対応
1.32へのアップグレード時に非推奨API廃止の項目のインサイトステータスがエラーになったため、1.32へのアップグレード時点で非推奨APIを更新しました。この対応により1.32へも問題なくアップグレード出来ました。


5.まとめ
今回は、EKSのアップグレードについてご紹介しました。インプレースデプロイメントによりWebサービスを停止せずにEKSをアップグレードすることが出来て、1.30以外のバージョンへのアップグレード時も大体同じ手順で実行出来ることも分かりました。今後も同じようにEKSのアップグレードが出来る見込みなので、標準サポート期間中に積極的にアップグレードして、EKSクラスターの利用料金を抑えつつKubernetesの新機能の有効活用を図りたいと思います。
次世代システム研究室では、アプリケーション開発や設計を行うアーキテクトを募集しています。アプリケーション開発者の方、次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ 募集職種一覧 からご応募をお願いします。
皆さんのご応募をお待ちしています。
グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。
Follow @GMO_RD


