为什么我无法为 Amazon EKS 集群生成 kubeconfig 文件?

上次更新日期:2021 年 11 月 22 日

我尝试为 Amazon Elastic Kubernetes Service (Amazon EKS) 集群生成 kubeconfig 文件时,收到了 AccessDeniedException 错误。

简短描述

您必须具有对集群使用 eks:DescribeCluster API 操作的权限,才能为 Amazon EKS 集群生成 kubeconfig 文件。要获得权限,请将 AWS Identity and Access Management (IAM) 策略附加到 IAM 用户。

解决方法

要将 IAM 策略附加到 IAM 用户,请完成以下步骤:

1.    打开 IAM 控制台

2.    在导航窗格中,选择 Users or Roles(用户或角色)。

3.    选择要在其中嵌入策略的用户或角色的名称。

4.    在 Permissions(权限)选项卡中,选择 Add inline policy(添加内联策略)。

5.    选择 JSON 选项卡。

6.    使用文本编辑器将代码替换为以下 IAM 策略:

{
   "Version": "2012-10-17",
   "Statement": [
       { 
            "Effect": "Allow",
            "Action": [
                "eks:DescribeCluster"
            ],
            "Resource": "*"
       }
    ]
}

7.    选择 Review policy(查看策略)。

8.    在 Name(名称)中,为策略输入名称。例如:eks_update-kubeconfig

注意:您可以为策略选择任何名称。

9.    选择 Create policy(创建策略)。

explicit deny 消息表示如果多重身份验证 (MFA) 为 false,则存在拒绝大多数操作的 IAM 策略:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "BlockMostAccessUnlessSignedInWithMFA",
      "Effect": "Deny",
      "NotAction": [
        "iam:CreateVirtualMFADevice",
        "iam:EnableMFADevice",
        "iam:ListMFADevices",
        "iam:ListUsers",
        "iam:ListVirtualMFADevices",
        "iam:ResyncMFADevice",
        "sts:GetSessionToken"
      ],
      "Resource": "*",
      "Condition": {
        "BoolIfExists": {
          "aws:MultiFactorAuthPresent": "false"
        }
      }
    }
  ]
}

注意:由于您使用的是 MFA 设备,因此必须使用 MFA 令牌通过 AWS Command Line Interface (AWS CLI) 对 AWS 资源的访问进行身份验证。请遵照如何使用 MFA 令牌对通过 AWS CLI 进行的 AWS 资源访问执行身份验证?一文中的步骤操作。 然后,运行 sts get-session-token AWS CLI 命令。

例如:

$ aws sts get-session-token --serial-number arn-of-the-mfa-device --token-code code-from-token

注意:arn-of-the-mfa-device 替换为您的 MFA 设备的 ARN,并将 code-from-token 替换为您的令牌的代码。

您可以通过将值导出到环境变量来使用临时凭证。

例如:

$ export AWS_ACCESS_KEY_ID=example-access-key-as-in-previous-output

$ export AWS_SECRET_ACCESS_KEY=example-secret-access-key-as-in-previous-output

$ export AWS_SESSION_TOKEN=example-session-token-as-in-previous-output

运行 update-kubeconfig 命令并确认它更新了 ~/.kube/config 下的配置文件:

aws eks --region region-code update-kubeconfig --name cluster_name

注意:region-code 替换为您的 AWS 区域的代码,并将集群名称替换为您的集群名称。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?