如何解决在 Amazon EKS 中升级集群版本时出现的 API 错误?
我收到了“错误”或“警告”状态,提示我的集群使用了已弃用的 API,我需要在下次升级之前解决此问题。
简短描述
在集群版本升级期间,Amazon EKS 控制台中的“Upgrade insights”(升级见解)选项卡会显示各种 Kubernetes 组件的状态。在不同组件的升级过程中,您会看到以下状态:
- Error(错误)状态表示集群在升级后会拒绝引用特定 API 版本的调用。
- Warning(警告)状态表示存在问题,但无需立即采取操作。当 Kubernetes 资源计划在比当前集群版本至少低 2 个版本的版本中被移除时,可能会出现此状态。
- Passing(通过)状态表示该组件通过了所有升级检查和验证。无需采取任何操作。
- Unknown(未知)状态表示升级系统无法确定组件的状态,这可能是由于缺少信息或过程中出现不确定状态所导致的。您可能需要采取操作。
在升级集群之前,请检查状态为 Error(错误)或 Warning(警告)的组件,以了解并解决所有问题。
解决方法
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
检查 API 的状态
使用 AWS 管理控制台或 AWS CLI 检查集群中已弃用 API 的状态。
AWS 管理控制台
完成以下步骤:
- 打开 Amazon EKS 控制台。
- 选择您的集群名称。
- 在 Cluster info(集群信息)中,选择 Upgrade insights(升级见解)。
- 在 Insight status(见解状态)下查看任何已弃用 API 的警告或错误消息。
AWS CLI
要在 YAML 文件中列出所有升级见解详细信息,请运行以下命令:
[+] aws eks list-insights --cluster-name your-cluster-name --region your-region-name --output yaml >> insight.yaml
**注意:**请将 your-cluster-name 和 your-region-name 替换为您的集群对应的值。
将输出保存为您首选的文件格式。
要筛选见解以仅显示错误,请运行以下命令:
[+] aws eks list-insights --cluster-name your-cluster-name --region your-region-name --filter categories=UPGRADE_READINESS,statuses=ERROR
**注意:**请将 your-cluster-name 和 your-region-name 替换为您的集群对应的值。
输出将以文本格式保存。
解决已弃用 API 状态错误
如果 Upgrade insights(升级见解)选项卡状态显示您的集群存在已弃用的 API,则您可能会收到错误。例如,如果发生容器组中断预算 (PDB) API 错误,您可能会收到如下所示的消息:
"EKS using deprecated api version "/apis/policy/v1beta1/poddisruptionbudgets" and needs to replace it with "/apis/policy/v1/poddisruptionbudgets" before upgrading EKS cluster."
要解决此错误,请完成以下步骤:
-
运行以下命令以列出集群使用的 PDB:
kubectl get pdb -A -
运行以下命令查看输出,以查看使用最新 API 版本或已弃用版本的 PDB:
kubectl get pdb your-pdb-name -n your-namespace -o yaml**注意:**请将 your-pdb-name 替换为您的 PDB,将 your-namespace 替换为您的命名空间。
-
如果您的任何 PDB 使用已弃用的 API 版本,请在 YAML 配置文件中将其更新为使用最新的 API 版本。有关详细信息,请参阅 Kubernetes 网站上的为应用程序设置干扰预算。
-
如果您无法确定调用已弃用 API 的实体(原因是该实体是特定的用户代理,例如 kube-apiserver、newrelic 或 kube-controller-manager),请查看 EKS 集群的 kube-api-server-audit 日志文件来确定该实体。
**注意:**您的 EKS 集群必须启用 Cloudwatch 审计日志才能运行以下查询。 -
选择 Logs Insights,然后从菜单中选择您的日志组。例如,-/aws/eks/eksworkshop/cluster。
-
筛选时间和日期以显示 Last request time(上次请求时间)。
查询:fields @logStream, @timestamp, responseStatus.code, @message | filter @logStream like /^kube-apiserver-audit/ | filter requestURI like /\/apis\/autoscaling\/v2beta2\/horizontalpodautoscalers/ ### ---> Replace this with your Deprecated API's | sort @timestamp desc | limit 1000输出:
{ "kind":"Event", "apiVersion":"audit.k8s.io/v1", "level":"Request", "auditID":"bd2b2b0c-8556-4468-8b35-91e2e78759a6", "stage":"ResponseComplete", "requestURI":"/apis/autoscaling/v2beta2/horizontalpodautoscalers?allowWatchBookmarks=true\u0026resourceVersion=118801277\u0026timeout=5m51s\u0026timeoutSeconds=351\u0026watch=true", "verb":"watch", "user":{ "username":"system:serviceaccount:newrelic:newrelic-kube-state-metrics", "uid":"9b97a09a-cf70-4fe2-8fd8-6c87110ce672", "groups":[ "system:serviceaccounts", "system:serviceaccounts:newrelic", "system:authenticated" ], "extra":{ "authentication.kubernetes.io/pod-name":[ "newrelic-kube-state-metrics-5bb6ccc94d-8nj9v" ], "authentication.kubernetes.io/pod-uid":[ "5b156744-00b6-4dfb-a998-a32140409b8e" ] } }, "sourceIPs":[ "10.62.98.22" ], "userAgent":"v2.6.0", "objectRef":{ "resource":"horizontalpodautoscalers", "apiGroup":"autoscaling", "apiVersion":"v2beta2" }, "responseStatus":{ "metadata":{ }, "code":200 }, "requestReceivedTimestamp":"2024-12-13T20:13:04.438616Z", "stageTimestamp":"2024-12-13T20:18:55.441744Z", "annotations":{ "authorization.k8s.io/decision":"allow", "authorization.k8s.io/reason":"RBAC: allowed by ClusterRoleBinding \"newrelic-kube-state-metrics\" of ClusterRole \"newrelic-kube-state-metrics\" to ServiceAccount \"newrelic-kube-state-metrics/newrelic\"", "k8s.io/deprecated":"true", "k8s.io/removed-release":"1.26" } } -
要将已弃用 API 更新为最新的 API,请执行以下操作之一:
如果用户名显示为 cluster-autoscaler,请将您的 Cluster Autoscaler 更新到最新版本。
如果用户名显示为 newrelic-kube-state-metric,请将集群更新到较新的 kube-state-metrics 版本(如果单独安装)。或者,如果 kube-state-metrics 是捆绑安装的,请升级 New Relic 插件。
注意:AWS 会扫描过去 30 天内已弃用的 API。更新 cluster-autoscaler 或 newrelic-kube-state-metric 后,AWS 可能需要长达 30 天来扫描已弃用的 API,并在 Update insights(更新见解)选项卡上更新状态。
- 语言
- 中文 (简体)
