AWS EKS 集群升级最佳实践

前述

注意
这仅仅是根据企业实际情况的一个升级操作步骤记录,不同企业环境不同,变更升级的动作可能有所不同,以下操作基于 AWS EKS 最佳实践。

相对于国内云的傻瓜式操作,国外的云产品操作逻辑比较复杂,AWS、Azure、GCP 都一样。所以在升级 AWS EKS 版本之前,一定要认真阅读 AWS EKS 最佳实践。详细查阅此文:将现有集群更新到新的 Kubernetes 版本 – Amazon EKS

EKS 集群升级步骤大致如下:

  1. 检查兼容性(集群升级见解):

    • 验证您的工作负载和附加组件是否与目标 Kubernetes 版本兼容。
    • 查看 EKS Kubernetes 版本发行说明。
  2. 更新 kubectl
  3. 更新 AWS CLI
  4. 更新 eksctl
  5. 更新 Helm
  6. 备份数据

    • 备份集群数据和配置,以确保您可以在需要时恢复它们。
  7. 升级管理节点(控制平面)
  8. 升级组件
  9. 升级工作节点(节点组)

前期可能升级的组件比较多,比如: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.301.291.28。AWS EKS 也基于此提供标准支持,当前标准支持的 Kubernetes 版本:

  • 1.31
  • 1.30
  • 1.29
  • 1.28

Kubernetes 社区生命周期管理,详细参考:Releases | Kubernetes
最近 Kubernetes 社区已经将支持改成了 N-2,即:1.321.311.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 中弃用,并且已在 Kubernetes 1.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

参考后续文章,届时补充链接

注意
上述步骤可能在跨多个版本升级的时候大部份时候只是一次性操作(特殊情况除外),主要在于 Kubernetes API 接口更新,需要根据实际情况进行调整。下述步骤是多次版本升级都必须的。

升级 EKS 控制平面

在升级 EKS v1.24 到 v1.25 之前,确保对应工作组节点版本为 v1.24v1.25。不支持跨多版本的工作组节点情况下升级控制平面,比如: v1.23v1.24v1.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-ProxyVPC-CNI 等,根据实际情况进行组件升级。具体步骤参考相关组件升级文档。

升级 Kube- Proxy

参考后续文章,届时补充链接

升级 VPC-CNI

参考后续文章,届时补充链接

至此,一个版本的 EKS 升级完成。因为 AWS EKS 版本更新不能够跨版本更新,所以只能够一个版本一个版本往上升。后续版本升级操作基本重复上述操作即可,需要特别注意在升级过程中,一定要遵从 AWS 最佳实践,避免发生不必要的错误。

Avatar photo

关于 木子

Email: [email protected] 微信:rockylinuxcn QQ: 2306867585
Founder of the Rocky Linux Chinese community, MVP、VMware vExpert、TVP, advocate for cloud native technologies, with over ten years of experience in site reliability engineering (SRE) and the DevOps field. Passionate about Cloud Computing、Microservices、CI&CD、DevOps、Kubernetes, currently dedicated to promoting and implementing Rocky Linux in Chinese-speaking regions.
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇