当访问 EKS 集群时,您必须登录到服务器(未授权)

我一直试图遵循 EKS 的入门指南。 当我尝试调用 kubectl get service 时,我收到了这样的消息: error: 必须登录到服务器(未经授权) 我是这么做的:
1. 创建 EKS 集群。
2. 创建配置文件如下:

apiVersion: v1
clusters:
- cluster:
server: https://*********.yl4.us-west-2.eks.amazonaws.com
certificate-authority-data: *********
name: *********
contexts:
- context:
cluster: *********
user: aws
name: aws
current-context: aws
kind: Config
preferences: {}
users:
- name: aws
user:
exec:
apiVersion: client.authentication.k8s.io/v1alpha1
command: heptio-authenticator-aws
args:
- "token"
- "-i"
- "*********"
- "-r"
- "arn:aws:iam::*****:role/******"
  1. 下载并安装最新的 awscli
  2. 运行系统配置并设置我的 IAM 用户的凭据,并将该区域设置为 us-west-2
  3. 为 st 的 IAM 用户添加了一个策略: 为 EKS 角色添加 AssumeRole,并将其设置为可信关系
  4. 安装 kubectl 以使用配置文件

当我运行 heptio-enticator-aws 令牌-r arn: aws: iam: : * * * * * * * * * * * * * * * * * * * * * *-i my-cluster-ame 时,我可以得到一个令牌 但是,当我尝试访问集群时,我不断收到错误: 您必须登录到服务器(未授权)

有办法解决这个问题吗?

249902 次浏览

我注释掉了配置文件的最后两行

# - "-r"
# - "arn:aws:iam::**********:role/**********"

虽然我不知道为什么,但它起作用了

另外,确保您的用户在 aws-auth k8s ConfigMap 中:

Https://docs.aws.amazon.com/eks/latest/userguide/add-user-role.html

您需要在通过 AWS cli 访问它的相同 IAM 配置文件下创建集群。

以另一种方式表示,在 ~/.aws/credentials中,访问用于创建集群的 kubectl必须完全匹配相同的 IAM的配置文件。

我的建议是使用 AWS cli 来创建您的集群,因为从 GUI 创建可能更令人困惑,而不是更有帮助。开始指南是您启动和运行的最佳选择。

我也有同样的问题。您很可能正在使用 root 帐户。根帐户似乎被阻止承担所需的角色。如果使用过期密钥,有时可能会隐藏此错误。

我刚调试了这个问题。我有个问题。你用的是公司无线网络吗?如果是,您可以创建一个 EC2实例,然后测试是否能够执行 kubectl get svc

此外,请尝试此命令是否有效 kubectl get svc --insecure-skip-tls-verify

当创建 Amazon EKS 集群时,创建集群的 IAM 实体(用户或角色)将作为管理员添加到 Kubernetes RBAC 授权表中。最初,只有这个 IAM 用户可以使用 kubectl 调用 KubernetesAPI 服务器。

Eks-docs

因此,要添加对其他 用户的访问,首先 您必须编辑 ConfigMap 以向 AmazonEKS 集群添加 IAM 用户或角色。

您可以通过执行以下命令来编辑 ConfigMap 文件: kubectl edit -n kube-system configmap/aws-auth,之后将授予您编辑器,您可以使用该编辑器映射新用户。

apiVersion: v1
data:
mapRoles: |
- rolearn: arn:aws:iam::555555555555:role/devel-worker-nodes-NodeInstanceRole-74RF4UBDUKL6
username: system:node:\{\{EC2PrivateDNSName}}
groups:
- system:bootstrappers
- system:nodes
mapUsers: |
- userarn: arn:aws:iam::111122223333:user/ops-user
username: ops-user
groups:
- system:masters
mapAccounts: |
- "111122223333"

请密切关注 mapUsers,在这里您将 操作系统使用者mapAccounts标签一起添加,mapAccounts标签将 AWS用户帐户与 Kubernetes 集群上的用户名映射在一起。

但是,RBAC 中不仅仅通过此操作提供权限; 您还必须在集群中创建角色绑定来提供这些实体权限。

正如亚马逊文档(我是医生)所说,您需要为 ConfigMap 中指定的用户在 kubernetes 集群上创建一个角色绑定。可以通过执行以下命令(Kub-docs)来实现:

kubectl create clusterrolebinding ops-user-cluster-admin-binding --clusterrole=cluster-admin --user=ops-user

它将集群管理 ClusterRole授予整个集群中名为 操作系统使用者的用户。

这种情况也发生在我的 Minikube 本地环境中,独立于 EKS。我的问题与这个问题有关: https://github.com/kubernetes/kubernetes/issues/76774

我采用的解决方案是删除 kubectl: rm -rf ~/.kube/{cache,http-cache}的缓存目录。我想这是写这篇文章时唯一的解决办法。

在我的案例中,这是 AWS 配置文件问题,一定要使用 aws sts get-caller-identity来验证 IAM 用户。

如果您使用 Eksctl来管理您的 aws ek 部署,您可以用一个命令将用户添加到配置映射:

eksctl create iamidentitymapping --cluster <cluster-name> --arn arn:aws:iam::<id>:user/<user-name> --group system:masters --username ops-user

我也遇到了同样的问题,我的用于 CLI 的 AWS 凭证经常更改,这些步骤解决了这个问题:

export AWS_ACCESS_KEY_ID="***************"
export AWS_SECRET_ACCESS_KEY="*************"
export AWS_SESSION_TOKEN="************************"

我确信问题已经解决了,但是我会把更多的信息放在这里,所以如果任何其他人仍然面临的问题相关的任何下面的设置,然后他们可以使用下面的步骤。

当我们通过 CloudForm/CLI/EKSCTL 通过任何方法创建 EKS 集群时,创建集群的 IAM 角色/用户将自动绑定到默认的 kubernetes RBAC API 组 system:masters(https://kubernetes.io/docs/reference/access-authn-authz/rbac/#user-facing-roles) ,通过这种方式,集群的创建者将获得对集群的管理访问。虽然我们总是可以使用 aws-auth 文件来访问其他 IAM 用户/角色,但是为此我们必须使用创建集群的 IAM 用户/角色。

为了验证 EKS 集群的角色/用户,我们可以在 Cloudtrack 上搜索 CreateCluster" Api 调用,它将在字段 arn(https://docs.aws.amazon.com/awscloudtrail/latest/userguide/view-cloudtrail-events.html)的 sessionIssuer部分中告诉我们集群的创建者。

当我们使用 IAM 角色或 IAM 用户创建集群时,在使用角色比较创建集群时,为 EKS 集群设置访问将变得不那么复杂。

我将把步骤,我们可以遵循每个不同的方法,同时建立对 EKS 集群的访问。

场景1: 使用 IAM 用户(例如“ eks- 用户”)创建集群


确认在通过运行命令 aws sts get-caller-identity创建集群的 AWS cli 上正确设置了 IAM 用户凭据

$ aws sts get-caller-identity
{
"Account": "xxxxxxxxxxxx",
"UserId": "xxxxxxxxxxxxxxxxxxxxx",
"Arn": "arn:aws:iam::xxxxxxxxxxx:user/eks-user"
}

更新之后,使用以下命令更新 kubeconfig 文件

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

通过上面的命令将配置文件附加到更新后的样子。除非必要,请不要直接编辑此文件。

 $ cat ~/.kube/config
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: CERT
server: https://xxxxxxx.sk1.us-east-1.eks.amazonaws.com
name: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
contexts:
- context:
cluster: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
user: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
name: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
current-context: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
kind: Config
preferences: {}
users:
- name: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
user:
exec:
apiVersion: client.authentication.k8s.io/v1alpha1
args:
- --region
- us-east-1
- eks
- get-token
- --cluster-name
- eks-cluster
command: aws

完成上面的安装之后,您应该能够运行 kubectl 命令。

 $ kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   xxx.xx.x.x   <none>        443/TCP   12d

场景2: 使用 IAM 角色(例如“ eks- 角色”)创建集群


在通过 IAM 角色创建集群时,主要有四种不同的通过 cli 设置访问的方法。

1. 直接在 kubeconfig 文件中设置角色。

在这种情况下,在运行 kubectl 命令之前,我们不必通过 cli 手动进行任何假定角色 api 调用,因为这将由 kube 配置文件中的 aws/aws-iam-authenticator集自动完成。

假设现在我们正在尝试为用户 eks-user设置访问权限,首先要确保用户确实拥有承担角色 eks-role的权限

将假定角色权限添加到 eks-user

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::xxxxxxxxxxx:role/eks-role"
}
]
}

编辑角色上的信任关系,以便允许 eks-user承担该角色。

{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::xxxxxxxxxxx:user/eks-user"
},
"Action": "sts:AssumeRole"
}
]
}

确认在通过运行命令 aws sts get-caller-identity创建集群的 AWS cli 上正确设置了 IAM 用户凭据。重要的是要记住,它应该显示我们的 IAM 用户 ARN,而不是 IAM 假定的角色 ARN。

$ aws sts get-caller-identity
{
"Account": "xxxxxxxxxxxx",
"UserId": "xxxxxxxxxxxxxxxxxxxxx",
"Arn": "arn:aws:iam::xxxxxxxxxxx:user/eks-user"
}

更新之后,使用以下命令更新 kubeconfig 文件

aws eks --region region-code update-kubeconfig --name cluster_name --role-arn arn:aws:iam::xxxxxxxxxxx:user/eks-role

通过上面的命令将配置文件附加到更新后的样子。除非必要,请不要直接编辑此文件。

 $ cat ~/.kube/config
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: CERT
server: https://xxxxxxx.sk1.us-east-1.eks.amazonaws.com
name: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
contexts:
- context:
cluster: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
user: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
name: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
current-context: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
kind: Config
preferences: {}
users:
- name: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
user:
exec:
apiVersion: client.authentication.k8s.io/v1alpha1
args:
- --region
- us-east-1
- eks
- get-token
- --cluster-name
- eks-cluster
- --role
- arn:aws:iam::xxxxxxx:role/eks-role
command: aws

完成上面的安装之后,您应该能够运行 kubectl 命令。

 $ kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   xxx.xx.x.x   <none>        443/TCP   12d

2.如果您已经在 CLI 上设置了 AWS 配置文件(https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html) ,并且希望将它与 kube 配置一起使用。

确认配置文件设置正确,以便它可以使用 eks-user的凭据

 $ cat ~/.aws/config
[default]
output = json
region = us-east-1
[eks]
output = json
region = us-east-1
[profile adminrole]
role_arn = arn:aws:iam::############:role/eks-role
source_profile = eks


$ cat ~/.aws/credentials
[default]
aws_access_key_id = xxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[eks]
aws_access_key_id =  xxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

一旦这个配置文件配置完成,请通过运行命令 aws sts get-caller-identity --profile eks确认配置文件配置是正常的

$ aws sts get-caller-identity --profile eks
{
"Account": "xxxxxxxxxxxx",
"UserId": "xxxxxxxxxxxxxxxxxxxxx",
"Arn": "arn:aws:iam::xxxxxxxxxxx:user/eks-user"
}

在这之后更新 kubeconfig 文件使用下面的命令和配置文件,请确保我们没有在这里使用这个角色。

aws eks update-kubeconfig --name devel --profile eks

通过上面的命令将配置文件附加到更新后的样子。除非必要,请不要直接编辑此文件。

$ cat ~/.kube/config
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: CERT
server: https://xxxxx.sk1.us-east-1.eks.amazonaws.com
name: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
contexts:
- context:
cluster: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
user: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
name: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
current-context: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
kind: Config
preferences: {}
users:
- name: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
user:
exec:
apiVersion: client.authentication.k8s.io/v1alpha1
args:
- --region
- us-east-1
- eks
- get-token
- --cluster-name
- eks-cluster
command: aws
env:
- name: AWS_PROFILE
value: eks

完成上面的安装之后,您应该能够运行 kubectl 命令。

 $ kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   xxx.xx.x.x   <none>        443/TCP   12d

3. 通过任何其他方式承担角色,例如,我们可以直接将 IAM 角色附加到实例。

如果 role 直接附加到实例概要文件,那么我们可以按照在 Scenario-1中为 IAM 用户设置访问时所遵循的类似步骤进行操作

验证我们已经将正确的角色附加到 EC2实例,并且由于此实例配置文件的优先级最低,因此此步骤还将验证实例上没有任何其他凭据设置。

[ec2-user@ip-xx-xxx-xx-252 ~]$ aws sts get-caller-identity
{
"Account": "xxxxxxxxxxxx",
"UserId": "xxxxxxxxxxxxxxxxxxxxx:i-xxxxxxxxxxx",
"Arn": "arn:aws:sts::xxxxxxxxxxxx:assumed-role/eks-role/i-xxxxxxxxxxx"
}

更新之后,使用以下命令更新 kubeconfig 文件

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

通过上面的命令将配置文件附加到更新后的样子。除非必要,请不要直接编辑此文件。

 $ cat ~/.kube/config
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: CERT
server: https://xxxxxxx.sk1.us-east-1.eks.amazonaws.com
name: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
contexts:
- context:
cluster: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
user: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
name: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
current-context: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
kind: Config
preferences: {}
users:
- name: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
user:
exec:
apiVersion: client.authentication.k8s.io/v1alpha1
args:
- --region
- us-east-1
- eks
- get-token
- --cluster-name
- eks-cluster
command: aws

完成上面的安装之后,您应该能够运行 kubectl 命令。

 $ kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   xxx.xx.x.x   <none>        443/TCP   12d

4. 通过 aws sts assume-role命令手动担任 IAM 角色。

通过运行 cli 命令手动承担角色 eks-role

aws sts assume-role --role-arn arn:aws:iam::xxxxxxxxxxx:role/eks-role --role-session-name test


{
"AssumedRoleUser": {
"AssumedRoleId": "xxxxxxxxxxxxxxxxxxxx:test",
"Arn": "arn:aws:sts::xxxxxxxxxxx:assumed-role/eks-role/test"
},
"Credentials": {
"SecretAccessKey": "xxxxxxxxxx",
"SessionToken": xxxxxxxxxxx",
"Expiration": "xxxxxxxxx",
"AccessKeyId": "xxxxxxxxxx"
}
}

然后使用上面输出的值设置所需的环境变量,这样我们就可以使用从会话生成的正确凭据。

export AWS_ACCESS_KEY_ID=xxxxxxxxxx
export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxx
export AWS_SESSION_TOKEN=xxxxxxxxxx

然后验证我们是否通过运行命令 aws sts get-caller-identity假定了 IAM 角色。

aws sts get-caller-identity


{
"Account": "xxxxxxxxxx",
"UserId": "xxxxxxxxxx:test",
"Arn": "arn:aws:sts::xxxxxxxxxx:assumed-role/eks-role/test"
}

更新之后,使用以下命令更新 kubeconfig 文件

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

通过上面的命令将配置文件附加到更新后的样子。除非必要,请不要直接编辑此文件。

 $ cat ~/.kube/config
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: CERT
server: https://xxxxxxx.sk1.us-east-1.eks.amazonaws.com
name: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
contexts:
- context:
cluster: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
user: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
name: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
current-context: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
kind: Config
preferences: {}
users:
- name: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
user:
exec:
apiVersion: client.authentication.k8s.io/v1alpha1
args:
- --region
- us-east-1
- eks
- get-token
- --cluster-name
- eks-cluster
command: aws

完成上面的安装之后,您应该能够运行 kubectl 命令。

 $ kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   xxx.xx.x.x   <none>        443/TCP   12d

注意:

我已经尝试在这里涵盖主要的用例,但也可能有其他的用例,我们需要设置对集群的访问。

上面的测试主要针对 EKS 集群的第一次设置,上面的方法都还没有涉及到 aws-auth 配置图。 但是一旦您通过 aws-auth (https://docs.aws.amazon.com/eks/latest/userguide/add-user-role.html)文件授予其他 IAM 用户/角色对 EKS 集群的访问权限,您就可以为这些用户使用与上述答案中提到的相同的命令集。

更新: 如果你正在使用 < strong > SSO ,那么设置将会非常相似,但是有一件事我们必须考虑的是,要么在 SSO 的情况下,要么在直接使用角色的时候,如果我们试图在 ConfigMap 中更新基于路径的角色,那么我们必须去掉角色中的路径,例如,取而代之的是 arn:aws:iam::xxxxxxxxxxx:role/path-1/subpath-1/eks-role使用 arn:aws:iam::xxxxxxxxxxx:role/eks-role,所以基本上我们正在去掉 /path-1/subpath-1,因为当我们运行 kubectl 命令时,它将首先使用 AssumeRole api 调用,如果我们看到假定的角色 ARN,那么它将不会连接路径,所以如果我们包含路径。

当我使用来自 eeks 控制台的 root 创建 eeks 集群时,出现了这个错误。我使用一个 IAM 用户重新创建了 ek 集群,并使用访问键来更新 awsconfigure。成功了。现在可以添加其他 IAM 用户来发出 kubectl 命令。

我试图创建一个带有私有端点的 EKS 集群。读几遍这个帖子,我觉得有效的方法是:

  • 创建了一个用户: admin (可以访问控制台)
  • 使用该用户登录到控制台
  • 使用管理用户创建集群
  • 使用 awseeks (awseks —— region update-kubeconfig —— name)创建我的 kube/config 文件
  • 完成(kubectl 得 ns)

最后两个命令是从同一 VPC 的 ec2实例部分执行的。

问题是为创建的角色添加了策略。我们必须有 AWSEKSCNI 策略。

最好使用以下命令创建 ek:

Eksctl create cluster —— name ekscluster —— version 1.19—— with-oidc
—— vpc-public-subets = subnet-08c6b0b0166abc1d1,subnet-02822a142bb5a802a
—— vpc-private-subets = subnet-09bbf4871902ee64c,subnet-0926c224909b5a811

这将使用云形成自动创建和分配策略。

对我来说,问题在于我已经用不同的、无效的 AWS 凭据设置了环境变量(可能是很久以前的事了,而且忘记了)。我意识到这一点后,运行 aws configure list和看到的凭据是不同的,我期望与 aws configure list --profile default。查找和删除那些无效的环境变量解决了这个问题,现在我可以运行 kubectl get svc了。

如果您已经使用 kops创建了 EKS 集群,那么您所需要做的就是使用以下 kops 命令更新 kubecfig 文件

kops export kubecfg --admin

我也面临同样的问题。我尝试用访问密钥和秘密密钥直接配置 AWS CLI,并且成功了。

不能担任角色应该是错误的。尝试安装 cli 并进行测试。

在我的案例中,情况是,我替换了一个作为 DevOps 工作的人,并创建了所有基于 aws 的基础设施。他有自己的 IAM 用户(所以是的,没有 root 访问用例,但是也可以适用) ,我有自己的 IAM 用户,也有所有可用的 AWS 权限。 所以,他离开了公司,这就是问题所在,因为我没有获得任何访问集群的权限,而这些权限默认只能由创建者共享... ... 事实上,我所有获得访问集群的方法都失败了,尽管事实上我拥有所有权限。 好消息是,我替换的家伙仍然有他的 IAM 用户可用(没有删除)。我所做的只是在他的帐户下生成新的 AWS 访问对,并将它们设置为我的 ubuntu 主机上的默认 AWS 凭据(我曾试图从该主机访问集群)。重要的部分是确保在运行 aws sts get-caller-identity命令之后,它意味着在输出中显示的是 HIS 帐户。在这种情况下,我能够在没有 error You must be logged in to the server (Unauthorized)消息的情况下运行所有我想要的 kubectl 命令。 因此,解决方案是——幸运地找到集群创建者凭证并使用它们!(听起来像犯罪,但是...)

如果您已经用尽了上述所有解决方案,仍然得到相同的错误。确保 kubectl 实际上使用了您认为的 AWS 凭据。

我犯了一个非常愚蠢的错误。我为不同的帐户设置了环境变量,kubectl 似乎总是从 AWS _ ACCESS _ KEY _ ID/AWS _ Secret T _ ACCESS _ KEY 中挑选一个。因此,此页上选项的优先级可能有助于 https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html

我也有同样的问题。 参考答案:

  1. 无法在 AWS Elastic Kubernetes 服务中创建命名空间-禁止
  2. 用户无法使用 kubectl 登录到 EKS 集群

正确的方法是:

  1. 创建具有以下权限的 IAM 组。
    1. AmazonEKSClusterPolicy
    2. AmazonEKSWorkerNodePolicy
    3. AmazonEC2ContainerRegistryReadOnly
    4. AmazonEKS _ CNI _ Policy
    5. AmazonElasticContainerRegistryPublicReadOnly
    6. EC2InstanceProfileForImageBuilderECRContainerBuilds
    7. AmazonElasticContainerRegistryPublicFullAccess
    8. AWSAppRunnerServicePolicyForECRAccess
    9. AmazonElasticContainerRegistryPublicPowerUser
    秘密经理

  2. 创建一个 IAM 用户(将提供 AWS _ ACCESS _ KEY _ IDAWS _ Secret _ KEY _ ID)并将该用户添加到上面创建的 IAM Group。

  3. 接下来,作为 IAM 用户登录到 AWS 控制台并创建 EKS 集群。

  4. 接下来,使用 AWS _ ACCESS _ KEY _ IDAWS _ Secret _ KEY _ ID在本地机器上设置 AWS CLI。

  5. 接下来,在本地机器上运行以下命令:
    1. 获取来电者身份
    2. aws ek 描述-Cluster —— name [ Cluster-name ]—— region [ aws-region ]—— query Cluster er.status (检查集群的状态)
    3. aws eeks update-kubeconfig —— name [ cluster-name ]—— region [ aws-region ]

  6. 在此之后,您将能够运行 Kubectl命令。

如果需要向 EKS 集群添加其他用户,请创建其他 IAM 用户,将该用户添加到 AWS 中的 IAM 组。接下来,作为原始 IAM 用户登录到 EKS 集群并运行: Kubectl edit-n kube-system configmap/aws-auth

在现有配置中添加以下代码块:

(确保向 ARN 和用户名添加更改)

mapUsers: |
- userarn: arn:aws:iam::111122223333:user/admin
username: admin
groups:
- system:masters

请参考以下链接以更好地理解这一点: https://docs.aws.amazon.com/eks/latest/userguide/add-user-role.html

希望这个能派上用场。 学习愉快!

我跟踪了这些文件,花了些时间才弄明白。 但最终实现的东西很容易充分理解。

Https://kubernetes.io/docs/reference/access-authn-authz/rbac/ Https://docs.aws.amazon.com/eks/latest/userguide/add-user-role.html

当通过 sso 调用具有假定角色的 eksctl 时,以下步骤使我能够访问集群。

  1. Exe create cluster —— name test —— without-nodegroup —— profile < your _ profile > 。
  2. 更新 kubeconfig:

Eksctl utils write-kubeconfig —— cluster = test —— profile < your _ profile > 。

  1. 启用 Cloudwatch 获取 iam 角色 arn:

Eksctl utils update-cluster-log —— enable-type = all —— cluster = test —— prove—— profile = < your _ profile > 。

  1. 运行“ kubectl get pods-A”. server 响应“ error: You must be login in to the server (Unauthority)”消息。
  2. 切换到控制台并从 Cloudwatch 组审计日志中获取角色 arn。
  3. 通过将派生的 arn 映射到 system: master 组来更新 aws-auth 配置映射。用户名是 users: name 字段,位于当前 kubeconfig 上下文中,如下所示
user_id=` k config view --minify -o json | jq -r '.users[0].name'`
eksctl create iamidentitymapping --cluster test --group system:masters --username ${user_id} --arn arn:aws:iam::<account_id>:role/<assumed_role> --profile <your_profile>

除了已经给出的很好的答案之外,我还想添加一个解决问题的好方法。在我的例子中,我试图在 ECS 任务中运行 kubectl,作为 AWS 管道的一部分,而 kubectl version因为“您必须登录到服务器”消息而失败。

发生的情况是 ECS 任务正在承担一个服务角色,然后运行 aws eks update-kubeconfig --name $EKS_CLUSTER_NAME --region $AWS_DEFAULT_REGION。事实证明,服务角色 CodeBuildServiceRole没有通过 EKS 集群中的集群角色绑定映射到 RBAC 用户,而且 aws-iam-authenticator EKS 服务拒绝访问 AWS 服务帐户(或类似的东西)。

帮助我弄清楚这种情况下发生了什么的方法是进入 CloudWatch → Log Insights,并对 /aws/eks/<cluster-name>/cluster日志组运行以下查询:

fields @timestamp, @message
| sort @timestamp desc
| filter @logStream like /authenticator/
| filter @message like /access denied/
| limit 50

从日志输出可以清楚地看出,认证服务期望在 configmap/aws-auth中看到一个小写的 ARN: arn:aws:iam::123456789:role/codebuildservicerole。一旦我在配置图中修复了 ARN 的情况,kubectl version就开始在 ECS 任务中工作。

$ kubectl edit -n kube-system configmap/aws-auth

对于我添加用户在一个单一的行如下工作

kubectl edit -n kube-system configmap/aws-auth


# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
mapRoles: |
- groups:
- system:bootstrappers
- system:nodes
rolearn: arn:aws:iam::******:role/eksctl-atoa-microservices-nodegro-NodeInstanceRole-346C48Q1W7OB
username: system:node:\{\{EC2PrivateDNSName}}
mapUsers: "- groups:\n  - system:masters\n  userarn: arn:aws:iam::*****:user/<username>
\ \n  username: <username>\n"

我有同样的问题和修复是 删除化名,我已经添加时,设置 minikube。他们的医生说要加上这个化名:

alias kubectl="minikube kubectl --"

正如您所期望的那样,这会破坏一些类似于 Azure 集成的东西。