前述
相对于国内云的傻瓜式操作,国外的云产品操作逻辑比较复杂,AWS、Azure、GCP 都一样。所以在升级 AWS EKS 版本之前,一定要认真阅读 AWS EKS 最佳实践。详细查阅此文:将现有集群更新到新的 Kubernetes 版本 – Amazon EKS
EKS 集群升级步骤大致如下:
-
检查兼容性(集群升级见解):
- 验证您的工作负载和附加组件是否与目标 Kubernetes 版本兼容。
- 查看 EKS Kubernetes 版本发行说明。
- 更新 kubectl
- 更新 AWS CLI
- 更新 eksctl
- 更新 Helm
-
备份数据
- 备份集群数据和配置,以确保您可以在需要时恢复它们。
- 升级管理节点(控制平面)
- 升级组件
- 升级工作节点(节点组)
前期可能升级的组件比较多,比如:aws-load-balancer-controller、VPC-CNI、Ingress Nginx Controller、aws-efs-csi-driver、aws-ebs-csi-driver、CoreDNS 等。
后续每一个版本的升级,可能跟随着 Kube-Proxy 升级,以及跨版本的 Ingress Nginx Controller 升级。
相关命令行工具安装与配置,具体参考:进行设置以使用 Amazon EKS – Amazon EKS
Kubernetes 生命周期
Kubernetes 社区对于版本的支持,一般是支持当前版本加之前的三个次要版本,也称为 N-3
。例如:如果当前版本是 1.31
,支持的次要版本还包括 1.30
、1.29
和 1.28
。AWS EKS 也基于此提供标准支持,当前标准支持的 Kubernetes 版本:
1.31
1.30
1.29
1.28
Kubernetes 社区生命周期管理,详细参考:Releases | Kubernetes
最近 Kubernetes 社区已经将支持改成了 N-2
,即:1.32
、1.31
、1.30
。
另外 AWS EKS 还提供一个扩展支持,当前扩展支持的 Kubernetes 版本:
1.27
1.26
1.25
1.24
但是需要单独收费,一般是在标准支持结束 3 个月以后,第 4 个月开始收费。换句话说也就是 AWS 会给 3 个月的免费支持周期,确保你有足够的时间来进行升级。
此外,扩展支持的费用是比较高的,具体费用计算方式参考:Amazon EKS 价格-Kubernetes集群管理服务-AWS云服务
关于 EKS Kubernetes 版本生命周期管理,详细参考:了解 EKS 上的 Kubernetes 版本生命周期 – Amazon EKS
Kubernetes 发布时间如下:
Kubernetes 版本 | 上游版本 | Amazon EKS 版本 | 标准支持结束日期 | 延期支持结束日期 |
---|---|---|---|---|
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 日 |
1.27 |
2023 年 4 月 11 日 | 2023 年 5 月 24 日 | 2024 年 7 月 24 日 | 2025 年 7 月 24 日 |
1.26 |
2022 年 12 月 9 日 | 2023 年 4 月 11 日 | 2024 年 6 月 11 日 | 2025 年 6 月 11 日 |
1.25 |
2022 年 8 月 23 日 | 2023 年 2 月 22 日 | 2024 年 5 月 1 日 | 2025 年 5 月 1 日 |
1.24 |
2022 年 5 月 3 日 | 2022 年 11 月 15 日 | 2024 年 1 月 31 日 | 2025 年 1 月 31 日 |
目前我们还在 v1.24
版本,如果希望不收取扩展支持费,至少需要升级到 v1.29
版本。
集群升级见解
在升级集群之前,确保“升级见解” 都是绿色打勾的,对于存在红色打叉的就是我们需要提前解决的,打黄色感叹号的就是我们需要去关注的(不一定需要处理)。
详细参考链接:利用集群见解为 Kubernetes 版本升级做好准备 – Amazon EKS
比较坑的一点是,当我们解决 “红色打叉” 的问题后,并不能够自己立即 check “升级见解”,需要 EKS 定期更新。
更新时间参考:
- 上次刷新时间(UTC-5:00) 此集群上次刷新见解状态的时间。
- 上次转换时间(UTC-5:00) 上次更改此见解状态的时间。
官方说明:
集群见解将定期更新。您无法手动刷新集群见解。如果您修复集群问题,则将需要一些时间才能更新集群见解。要确定修复是否成功,请将更改部署的时间与集群洞察的“上次刷新时间”进行比较。
当然也可以通过 CLI 查看对应见解。
[root@master-001 ~]# aws eks list-insights --region us-east-1 --cluster-name=eks-cluster-001
{
"insights": [
{
"id": "9692f5b1-c297-4bc9-9fa8-82e355e4b7a9",
"name": "Deprecated APIs removed in Kubernetes v1.25",
"category": "UPGRADE_READINESS",
"kubernetesVersion": "1.25",
"lastRefreshTime": "2025-01-02T06:39:07+00:00",
"lastTransitionTime": "2024-11-03T00:29:08+00:00",
"description": "Checks for usage of deprecated APIs that are scheduled for removal in Kubernetes v1.25. Upgrading your cluster before migrating to the updated APIs supported by v1.25 could cause application impact.",
"insightStatus": {
"status": "ERROR",
"reason": "Deprecated API usage detected within last 30 days and your cluster is on Kubernetes v1.24."
}
},
{
"id": "abff3d4a-8f1f-4161-a69d-b89365241522",
"name": "kube-proxy version skew",
"category": "UPGRADE_READINESS",
"kubernetesVersion": "1.25",
"lastRefreshTime": "2025-01-02T06:39:04+00:00",
"lastTransitionTime": "2024-12-30T18:24:04+00:00",
"description": "Checks version of kube-proxy in cluster to see if upgrade would cause non compliance with supported Kubernetes kube-proxy version skew policy.",
"insightStatus": {
"status": "PASSING",
"reason": "kube-proxy versions match the cluster control plane version."
}
},
{
"id": "1d4750ca-1eb2-450e-9bcf-922e85b05396",
"name": "Deprecated APIs removed in Kubernetes v1.32",
"category": "UPGRADE_READINESS",
"kubernetesVersion": "1.32",
"lastRefreshTime": "2025-01-02T06:39:07+00:00",
"lastTransitionTime": "2024-02-16T08:59:04+00:00",
"description": "Checks for usage of deprecated APIs that are scheduled for removal in Kubernetes v1.32. Upgrading your cluster before migrating to the updated APIs supported by v1.32 could cause application impact.",
"insightStatus": {
"status": "PASSING",
"reason": "No deprecated API usage detected within the last 30 days."
}
},
{
"id": "050b73f3-57cc-467e-838e-955dd7bfa6b9",
"name": "Cluster health issues",
"category": "UPGRADE_READINESS",
"kubernetesVersion": "1.25",
"lastRefreshTime": "2025-01-02T06:39:04+00:00",
"lastTransitionTime": "2024-12-21T13:24:05+00:00",
"description": "Checks for any cluster health issues that prevent successful upgrade to the next Kubernetes version on EKS.",
"insightStatus": {
"status": "PASSING",
"reason": "No cluster health issues detected."
}
},
{
"id": "a2ac7576-e3c6-4a1d-bdc0-853b64230198",
"name": "Deprecated APIs removed in Kubernetes v1.27",
"category": "UPGRADE_READINESS",
"kubernetesVersion": "1.27",
"lastRefreshTime": "2025-01-02T06:39:07+00:00",
"lastTransitionTime": "2024-12-02T07:24:04+00:00",
"description": "Checks for usage of deprecated APIs that are scheduled for removal in Kubernetes v1.27. Upgrading your cluster before migrating to the updated APIs supported by v1.27 could cause application impact.",
"insightStatus": {
"status": "PASSING",
"reason": "No deprecated API usage detected within the last 30 days."
}
},
{
"id": "23e6b944-4c1f-45c5-91fc-9de72601408c",
"name": "Deprecated APIs removed in Kubernetes v1.29",
"category": "UPGRADE_READINESS",
"kubernetesVersion": "1.29",
"lastRefreshTime": "2025-01-02T06:39:07+00:00",
"lastTransitionTime": "2023-11-23T19:49:05+00:00",
"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.",
"insightStatus": {
"status": "PASSING",
"reason": "No deprecated API usage detected within the last 30 days."
}
},
{
"id": "10f5ea1c-05d9-494e-895c-e6f596850aa2",
"name": "Deprecated APIs removed in Kubernetes v1.26",
"category": "UPGRADE_READINESS",
"kubernetesVersion": "1.26",
"lastRefreshTime": "2025-01-02T06:39:07+00:00",
"lastTransitionTime": "2024-09-12T03:14:04+00:00",
"description": "Checks for usage of deprecated APIs that are scheduled for removal in Kubernetes v1.26. Upgrading your cluster before migrating to the updated APIs supported by v1.26 could cause application impact.",
"insightStatus": {
"status": "WARNING",
"reason": "Deprecated API usage detected within last 30 days and your cluster is on Kubernetes v1.24 or lower, or existing resources using deprecated APIs present in cluster."
}
},
{
"id": "668adc9a-abed-434c-a252-9b127ab115d9",
"name": "Kubelet version skew",
"category": "UPGRADE_READINESS",
"kubernetesVersion": "1.25",
"lastRefreshTime": "2025-01-02T06:39:04+00:00",
"lastTransitionTime": "2024-12-31T14:29:04+00:00",
"description": "Checks for kubelet versions of worker nodes in the cluster to see if upgrade would cause non compliance with supported Kubernetes kubelet version skew policy.",
"insightStatus": {
"status": "PASSING",
"reason": "Node kubelet versions match the cluster control plane version."
}
},
{
"id": "5c04c287-a839-4430-9495-e947434e8fee",
"name": "EKS add-on version compatibility",
"category": "UPGRADE_READINESS",
"kubernetesVersion": "1.25",
"lastRefreshTime": "2025-01-02T06:39:05+00:00",
"lastTransitionTime": "2024-12-21T13:24:05+00:00",
"description": "Checks version of installed EKS add-ons to ensure they are compatible with the next version of Kubernetes. ",
"insightStatus": {
"status": "ERROR",
"reason": "An installed EKS add-on version is not compatible with next Kubernetes version."
}
}
]
}
API 更新
基于 EKS 提供的升级见解,对各问题进行修复、更新处理,包括:API 接口(自建 DevOps 平台有调用对应接口或部署应用有使用对应接口的)、组件更新等。
对于涉及到对应 API 更新在使用的 cornjobs、deploy 等,在升级之前我们需要更新对应接口或服务。
迁移 PSP 至 PSS
因为 Kubernetes 1.25 中移除了对 PodSecurityPolicy 支持,所以在升级至 1.25 之前,请确保已经迁移至 PSS。具体参考链接:从旧版容器组(pod)安全策略(PSP)迁移 – Amazon EKS
PodSecurityPolicy
已在 Kubernetes 1.21 中弃用,并且已在 Kubernetes1.25
中移除。如果您在集群中使用 PodSecurityPolicy,则必须先迁移到内置的 Kubernetes 容器组(pod)安全标准 (PSS) 或策略即代码解决方案,然后再将集群升级到版本1.25
,以避免工作负载中断。选择任何常见问题以了解更多信息。
[root@master-001 ~]# kubectl get psp
eks.privileged
如上所示,如果您返回的结果只有 eks.privileged
,可以忽略这点,因为这是 Amazon EKS 自带的,Amazon EKS 会自动将此 PSP 迁移至 PSS,您无需执行任何操作。
升级 aws-efs-csi-driver
参考后续文章,届时补充链接
升级 aws-ebs-csi-driver
参考后续文章,届时补充链接
升级 Load Balancer Controller
参考后续文章,届时补充链接
升级 Ingress Nginx Controller
参考后续文章,届时补充链接
升级 CoreDNS
参考后续文章,届时补充链接
升级 EKS 控制平面
在升级 EKS v1.24 到 v1.25 之前,确保对应工作组节点版本为 v1.24
或 v1.25
。不支持跨多版本的工作组节点情况下升级控制平面,比如: v1.23
、v1.24
、v1.25
存在三个版本的工作组节点情况下。
[root@master-001 ~]# eksctl upgrade cluster --name eks-cluster-001 --version 1.25 --approve
2025-01-06 01:55:42 [ℹ] will upgrade cluster "eks-cluster-001" control plane from current version "1.24" to "1.25"
2025-01-06 02:06:53 [✔] cluster "eks-cluster-001" control plane has been upgraded to version "1.25"
2025-01-06 02:06:53 [ℹ] you will need to follow the upgrade procedure for all of nodegroups and add-ons
更新 kubectl
完成 EKS 控制平面升级后,开始升级 kubectl
命令行工具,参考链接:设置 kubectl 和 eksctl – Amazon EKS
[root@master-001 ~]# kubectl version --client
WARNING: This version information is deprecated and will be replaced with the output from kubectl version --short. Use --output=yaml|json to get the full version.
Client Version: version.Info{Major:"1", Minor:"24", GitVersion:"v1.24.0", GitCommit:"4ce5a8954017644c5420bae81d72b09b735c21f0", GitTreeState:"clean", BuildDate:"2022-05-03T13:46:05Z", GoVersion:"go1.18.1", Compiler:"gc", Platform:"linux/amd64"}
Kustomize Version: v4.5.4
[root@master-001 ~]# curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.25.16/2024-11-15/bin/linux/amd64/kubectl
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 43.0M 100 43.0M 0 0 27.1M 0 0:00:01 0:00:01 --:--:-- 27.1M
[root@master-001 ~]# mv kubectl /usr/local/bin/kubectl
mv: overwrite '/usr/local/bin/kubectl'? y
[root@master-001 ~]# chmod +x /usr/local/bin/kubectl
[root@master-001 ~]# kubectl version --client
WARNING: This version information is deprecated and will be replaced with the output from kubectl version --short. Use --output=yaml|json to get the full version.
Client Version: version.Info{Major:"1", Minor:"25+", GitVersion:"v1.25.16-eks-94953ac", GitCommit:"7dbbd2a9da7f76bf9757ce7d46d85e9367af4021", GitTreeState:"clean", BuildDate:"2024-11-13T10:10:20Z", GoVersion:"go1.21.8", Compiler:"gc", Platform:"linux/amd64"}
Kustomize Version: v4.5.7
工作组节点更新
升级工作节点组,如果您之前是基于 EC2 启动模板来创建的工作节点组,需要先配置 EC2 启动模板镜像,比如:之前的启动模板镜像 EKS 为 v1.24
,升级的版本为 v1.25
,就需要切换对应系统镜像为 v1.25
版本。
EC2 — 启动模板 — 基于现有模板创建 amazon-eks-node-1.25-v20240307
版本基础镜像的启动模板,具体步骤略。
在现在 EKS 集群添加基于 amazon-eks-node-1.25-v20240307
启动模板的节点组。
确保所有 v1.25
工作节点状态都 Ready
后,设置旧工作节点为不可调度状态,并驱逐旧工作节点上所有 POD 至新节点。
[root@master-001 ~]# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
ip-192-168-56-128.ec2.internal Ready <none> 71m v1.25.16-eks-5e0fdde 192.168.56.128 <none> Amazon Linux 2 5.10.210-201.852.amzn2.x86_64 containerd://1.7.11
ip-192-168-57-133.ec2.internal Ready <none> 63s v1.24.15-eks-ae9a62a 192.168.57.133 <none> Amazon Linux 2 5.10.219-208.866.amzn2.x86_64 containerd://1.7.11
ip-192-168-64-30.ec2.internal Ready <none> 70m v1.25.16-eks-5e0fdde 192.168.64.30 <none> Amazon Linux 2 5.10.210-201.852.amzn2.x86_64 containerd://1.7.11
ip-192-168-68-188.ec2.internal Ready <none> 45s v1.24.15-eks-ae9a62a 192.168.68.188 <none> Amazon Linux 2 5.10.219-208.866.amzn2.x86_64 containerd://1.7.11
ip-192-168-79-212.ec2.internal Ready <none> 62s v1.24.15-eks-ae9a62a 192.168.79.212 <none> Amazon Linux 2 5.10.219-208.866.amzn2.x86_64 containerd://1.7.11
ip-192-168-89-11.ec2.internal Ready <none> 70m v1.25.16-eks-5e0fdde 192.168.89.11 <none> Amazon Linux 2 5.10.210-201.852.amzn2.x86_64 containerd://1.7.11
# 设置为不可调度(其它旧节点相同操作,替换节点名称,所有旧节点一次性设置)
[root@master-001 ~]# kubectl cordon ip-192-168-57-133.ec2.internal
# 对于重要的应用,可以采用 rollout 滚动重启
[root@master-001 ~]# kubectl rollout restart deployment/ingress-nginx-controller -n ingress-nginx
# 驱逐旧节点所有 Pod 至新节点(一台一台驱逐,避免启动风暴)
[root@master-001 ~]# kubectl drain ip-192-168-57-133.ec2.internal --ignore-daemonsets --delete-emptydir-data
# 确认所有 Pod 正常后,再驱逐其它节点
[root@master-001 ~]# kubectl get pods -A | grep -vE "Running|Completed"
所有 Pod 驱逐至新节点组后,即可删除旧节点组。
[root@master-001 ~]# eksctl get nodegroup --cluster=eks-cluster-001
CLUSTER NODEGROUP STATUS CREATED MIN SIZE MAX SIZE DESIRED CAPACITY INSTANCE TYPE IMAGE ID ASG NAME TYPE
eks-cluster-001 nodegroup-001 ACTIVE 2025-01-06T01:53:07Z 0 4 0 r6i.4xlarge ami-007df9ede2402671f eks-nodegroup-001-d2ca1ca8-6a5f-401f-f7bc-78bd008af372 managed
eks-cluster-001 nodegroup-002 ACTIVE 2025-01-06T02:49:47Z 3 4 3 r6i.4xlarge ami-0002782c36386757d eks-nodegroup-002-e4ca1cc2-5b0b-419a-0c10-6788c416f212 managed
将 EKS 集群升级至 v1.25
后,对应的组件可能也需要升级,包括:Kube-Proxy
、VPC-CNI
等,根据实际情况进行组件升级。具体步骤参考相关组件升级文档。
升级 Kube- Proxy
参考后续文章,届时补充链接
升级 VPC-CNI
参考后续文章,届时补充链接
至此,一个版本的 EKS 升级完成。因为 AWS EKS 版本更新不能够跨版本更新,所以只能够一个版本一个版本往上升。后续版本升级操作基本重复上述操作即可,需要特别注意在升级过程中,一定要遵从 AWS 最佳实践,避免发生不必要的错误。