如何使用 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 官方
AWS 官方已更新 10 个月前