跳至内容

如何解决在 Amazon EKS 中升级集群版本时出现的 API 错误?

2 分钟阅读
0

我收到了“错误”或“警告”状态,提示我的集群使用了已弃用的 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 管理控制台

完成以下步骤:

  1. 打开 Amazon EKS 控制台
  2. 选择您的集群名称。
  3. Cluster info(集群信息)中,选择 Upgrade insights(升级见解)。
  4. 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-nameyour-region-name 替换为您的集群对应的值。

将输出保存为您首选的文件格式。

要筛选见解以仅显示错误,请运行以下命令:

[+] aws eks list-insights --cluster-name your-cluster-name --region your-region-name --filter categories=UPGRADE_READINESS,statuses=ERROR

**注意:**请将 your-cluster-nameyour-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."

要解决此错误,请完成以下步骤:

  1. 运行以下命令以列出集群使用的 PDB:

    kubectl get pdb -A
  2. 运行以下命令查看输出,以查看使用最新 API 版本或已弃用版本的 PDB:

    kubectl get pdb your-pdb-name -n your-namespace -o yaml

    **注意:**请将 your-pdb-name 替换为您的 PDB,将 your-namespace 替换为您的命名空间。

  3. 如果您的任何 PDB 使用已弃用的 API 版本,请在 YAML 配置文件中将其更新为使用最新的 API 版本。有关详细信息,请参阅 Kubernetes 网站上的为应用程序设置干扰预算

  4. 如果您无法确定调用已弃用 API 的实体(原因是该实体是特定的用户代理,例如 kube-apiservernewrelickube-controller-manager),请查看 EKS 集群的 kube-api-server-audit 日志文件来确定该实体。
    **注意:**您的 EKS 集群必须启用 Cloudwatch 审计日志才能运行以下查询。

  5. 打开 Amazon CloudWatch 控制台

  6. 选择 Logs Insights,然后从菜单中选择您的日志组。例如,-/aws/eks/eksworkshop/cluster

  7. 筛选时间和日期以显示 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"
       }
    }
  8. 要将已弃用 API 更新为最新的 API,请执行以下操作之一:
    如果用户名显示为 cluster-autoscaler,请将您的 Cluster Autoscaler 更新到最新版本。
    如果用户名显示为 newrelic-kube-state-metric,请将集群更新到较新的 kube-state-metrics 版本(如果单独安装)。或者,如果 kube-state-metrics 是捆绑安装的,请升级 New Relic 插件。
    注意:AWS 会扫描过去 30 天内已弃用的 API。更新 cluster-autoscalernewrelic-kube-state-metric 后,AWS 可能需要长达 30 天来扫描已弃用的 API,并在 Update insights(更新见解)选项卡上更新状态。

AWS 官方已更新 4 个月前