Skip to content

如何使用 Amazon EKS 访问条目 API 来恢复对 EKS 集群的访问权限?

2 分钟阅读
0

由于单点登录用户变更或 aws-auth ConfigMap 删除或损坏,我无法访问我的 Amazon Elastic Kubernetes Service (Amazon EKS)。

简短描述

如果您无法访问 EKS 集群,则在运行 kubectl 命令时会看到类似以下内容的错误:

“error: You must be logged in to the server (Unauthorized).(错误:您必须登录到服务器(未授权)。)”

要重新获得对集群的访问权限,请使用访问条目来管理 AWS Identity and Access Management (IAM) 主体的权限。您可以从 Amazon EKS 集群外部执行此操作。

**注意:**如果 EKS 集群创建者存在,则假定 EKS 集群创建者的 IAM 主体登录并访问该集群。默认情况下,EKS 集群创建者是集群的管理员。以下过程创建了一个管理员角色,该角色与集群创建者的原始 IAM 角色共存。

解决方法

先决条件:

  • 安装 kubectl
  • 安装并配置最新版本的 AWS 命令行界面 (AWS CLI)。
  • 您拥有具有以下权限的 IAM 角色: CreateAccessEntry、ListAccessEntries、DescribeAccessEntry、DeleteAccessEntry 和 UpdateAccessEntry。

**注意:**如果在运行 AWS CLI 命令时收到错误,请参阅排查 AWS CLI 错误。此外,请确保您使用的是最新版本的 AWS CLI

使用 aws eks 访问条目 API 来管理 Amazon EKS 集群访问权限

**注意:**在以下命令中,替换以下内容:
<ACCOUNT_ID> 替换为 EKS 集群所在源账户的账户 ID。
<REGION> 替换为您的 AWS 区域的名称。
<CLUSTER_NAME> 替换为您的 EKS 集群的名称。
<IAM_PRINCIPAL_ARN> 替换为想要拥有管理员权限的角色的 ARN。

要使用 aws eks 访问条目 API 来管理 Amazon EKS 集群访问权限,请完成以下步骤:

  1. 在安装 kubectl 的主机中,代入具有以下权限的 IAM 角色

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "eks:ListAccessEntries",
                    "eks:CreateAccessEntry",
                    "eks:DescribeCluster",
                    "eks:UpdateClusterConfig"
                ],
                "Resource": [
                     "arn:aws:eks:<REGION>:<ACCOUNT_ID>:cluster/<CLUSTER_NAME>"
               ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "eks:DeleteAccessEntry",
                    "eks:ListAssociatedAccessPolicies",
                    "eks:DisassociateAccessPolicy",
                    "eks:AssociateAccessPolicy",
                    "eks:UpdateAccessEntry",
                    "eks:DescribeAccessEntry"
                ],
                "Resource": [
                     "arn:aws:eks:<REGION>:<ACCOUNT_ID>:access-entry/<CLUSTER_NAME>/*"
               ]
            }
        ]
    }
  2. 要确认您的身份,请运行以下命令:

    aws sts get-caller-identity

    在命令的输出中,记下 ARN。它看起来类似于以下示例:arn:aws:iam::<ACCOUNT_ID>:user/new-cluster-admin

  3. 运行以下命令以验证 Amazon EKS 集群的当前身份验证模式:

    aws eks describe-cluster --name <CLUSTER_NAME>  --query 'cluster.accessConfig.authenticationMode' --region <REGION>

    如果 Amazon EKS 集群的当前身份验证模式为 API_AND_CONFIG_MAP,则该集群已经具有所需的访问模式。跳到步骤 5。

  4. 运行以下命令以更新 Amazon EKS 集群的身份验证模式:

    aws eks update-cluster-config --name <CLUSTER_NAME> --access-config authenticationMode=API_AND_CONFIG_MAP --region <REGION>

    **注意:**您可以从 CONFIG_MAP 身份验证模式切换到 API 模式,但无法从 API 模式切换回 CONFIG_MAP 模式。

  5. 运行以下命令为您的集群和 IAM 角色创建访问条目:

    aws eks create-access-entry --cluster-name <CLUSTER_NAME> --principal-arn <IAM_PRINCIPAL_ARN> --region <REGION>

    输出类似于以下内容:

    {
        "accessEntry": {
            "clusterName": "<CLUSTER_NAME>",
            "principalArn": "arn:aws:iam::<ACCOUNT_ID>:user/new-cluster-admin",
            "kubernetesGroups": [],
            "accessEntryArn": "arn:aws:eks:<REGION>:<ACCOUNT_ID>:access-entry/<CLUSTER_NAME>/user/<ACCOUNT_ID>/new-cluster-admin/26c6d1f8-4211-3fe0-f9d2-734b912dcd9a",
            "createdAt": "2024-02-13T19:27:45.370000+00:00",
            "modifiedAt": "2024-02-13T19:27:45.370000+00:00",
            "tags": {},
            "username": "arn:aws:iam::<ACCOUNT_ID>:user/new-cluster-admin",
            "type": "STANDARD"
        }
    }
  6. 运行以下命令将 AmazonEKSClusterAdminPolicy 关联到 Amazon EKS 集群和 IAM 角色:

    aws eks associate-access-policy --cluster-name <CLUSTER_NAME> \
      --principal-arn <IAM_PRINCIPAL_ARN> \
      --policy-arn arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy \
      --access-scope type=cluster \
      --region <REGION>

    输出类似于以下内容:

    {
        "accessEntry": {
            "clusterName": "<CLUSTER_NAME>",
            "principalArn": "arn:aws:iam::<ACCOUNT_ID>:user/new-cluster-admin",
            "kubernetesGroups": [],
            "accessEntryArn": "arn:aws:eks:<REGION>:<ACCOUNT_ID>:access-entry/<cluster_name>/user/<ACCOUNT_ID>/new-cluster-admin/7ec6efb3-31c8-edcf-3039-ca2b38e0d708",
            "createdAt": "2024-02-25T08:34:06.002000+00:00",
            "modifiedAt": "2024-02-25T08:34:06.002000+00:00",
            "tags": {},
            "username": "arn:aws:iam::<ACCOUNT_ID>:user/new-cluster-admin",
            "type": "STANDARD"
        }
    }
  7. 要更新或生成 kubeconfig 文件,请运行以下命令以连接到 EKS 集群:

    aws eks update-kubeconfig --name <CLUSTER_NAME> --region <REGION>
  8. 运行以下命令以验证用户是否能够以管理员身份访问 EKS 集群:

    kubectl auth can-i '*' '*'  --all-namespaces

**注意:**如果您能够以管理员身份访问 EKS 集群,则输出显示 yes(是)。

相关信息

深入了解简化的 Amazon EKS 访问管理控制

如何解决在连接到 Amazon EKS API 服务器时出现的错误“You must be logged in to the server (Unauthorized)”(您必须登录到服务器(未授权))?

eksctl 网站上的 EKS 访问条目

AWS 官方已更新 1 年前