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

Ita*_*y k 32 amazon-web-services kubernetes

我一直在尝试遵循EKS的入门指南.当我试图调用kubectl获取服务时,我得到了消息:错误:您必须登录到服务器(未经授权)这是我做的:
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/******"
Run Code Online (Sandbox Code Playgroud)
  1. 下载并安装最新的aws cli
  2. Ran aws配置并设置我的IAM用户和区域的凭据为us-west-2
  3. 为IAM用户添加了针对EKS角色的sts:AssumeRole的策略,并将其设置为信任关系
  4. 设置kubectl以使用配置文件

当我运行heptio-authenticator-aws token -r arn时,我可以得到一个令牌:aws:iam ::**********:role/*********-i my-cluster -ame然而,当我尝试访问群集时,我一直收到错误:您必须登录到服务器(未经授权)

知道如何解决这个问题吗?

Jat*_*tin 35

我确信问题已解决,但我会在这里提供更多信息,因此如果其他人仍然面临与以下任何设置相关的问题,那么他们可以使用以下步骤。

当我们通过 CloudFormation/CLI/EKSCTL 以任何方法创建 EKS 集群时,创建集群的 IAM 角色/用户将自动绑定到默认的 kubernetes RBAC API 组system:masters( https://kubernetes.io/docs/reference/access-authn -authz/rbac/#user-looking-roles),这样集群的创建者将获得集群的管理员访问权限。尽管我们始终可以使用 aws-auth 文件授予对其他 IAM 用户/角色的访问权限,但为此我们必须使用创建集群的 IAM 用户/角色。

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

当我们使用 IAM 角色或 IAM 用户创建集群时,当我们使用角色 compare to user 创建集群时,设置 EKS 集群的访问权限将变得不那么棘手。

在设置对 EKS 集群的访问时,我将列出我们可以针对每种不同方法遵循的步骤。

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


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

$ aws sts get-caller-identity
{
"Account": "xxxxxxxxxxxx",
"UserId": "xxxxxxxxxxxxxxxxxxxxx",
"Arn": "arn:aws:iam::xxxxxxxxxxx:user/eks-user"
}
Run Code Online (Sandbox Code Playgroud)

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

aws eks --region region-code update-kubeconfig --name cluster_name
Run Code Online (Sandbox Code Playgroud)

通过上述命令附加配置文件后的样子。除非必要,否则请不要直接编辑此文件。

 $ 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
Run Code Online (Sandbox Code Playgroud)

完成上述设置后,您应该能够运行 kubectl 命令。

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

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


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

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

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

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

将承担角色权限添加到 eks-user

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::xxxxxxxxxxx:role/eks-role"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

编辑对角色的信任关系,以便允许代eks-user入该角色。

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

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

$ aws sts get-caller-identity
{
"Account": "xxxxxxxxxxxx",
"UserId": "xxxxxxxxxxxxxxxxxxxxx",
"Arn": "arn:aws:iam::xxxxxxxxxxx:user/eks-user"
}
Run Code Online (Sandbox Code Playgroud)

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

aws eks --region region-code update-kubeconfig --name cluster_name --role-arn arn:aws:iam::xxxxxxxxxxx:user/eks-role
Run Code Online (Sandbox Code Playgroud)

通过上述命令附加配置文件后的样子。除非必要,否则请不要直接编辑此文件。

 $ 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
Run Code Online (Sandbox Code Playgroud)

完成上述设置后,您应该能够运行 kubectl 命令。

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

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
Run Code Online (Sandbox Code Playgroud)

完成此配置文件配置后,请通过运行命令确认配置文件配置正常 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"
}
Run Code Online (Sandbox Code Playgroud)

之后,使用以下命令和配置文件更新 kubeconfig 文件,请确保我们没有在此处使用角色。

aws eks update-kubeconfig --name devel --profile eks
Run Code Online (Sandbox Code Playgroud)

通过上述命令附加配置文件后的样子。除非必要,否则请不要直接编辑此文件。

$ 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
Run Code Online (Sandbox Code Playgroud)

完成上述设置后,您应该能够运行 kubectl 命令。

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

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

如果角色直接附加到实例配置文件,那么我们可以按照我们在场景 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"
}
Run Code Online (Sandbox Code Playgroud)

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

aws eks --region region-code update-kubeconfig --name cluster_name
Run Code Online (Sandbox Code Playgroud)

通过上述命令附加配置文件后的样子。除非必要,否则请不要直接编辑此文件。

 $ 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
Run Code Online (Sandbox Code Playgroud)

完成上述设置后,您应该能够运行 kubectl 命令。

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

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

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

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"
    }
}
Run Code Online (Sandbox Code Playgroud)

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

export AWS_ACCESS_KEY_ID=xxxxxxxxxx
export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxx
export AWS_SESSION_TOKEN=xxxxxxxxxx
Run Code Online (Sandbox Code Playgroud)

之后,通过运行命令验证我们是否承担了 IAM 角色aws sts get-caller-identity

$ 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
Run Code Online (Sandbox Code Playgroud)

通过上述命令附加配置文件后的样子。除非必要,否则请不要直接编辑此文件。

 $ 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
Run Code Online (Sandbox Code Playgroud)

完成上述设置后,您应该能够运行 kubectl 命令。

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

笔记:

我尝试在这里介绍主要用例,但可能还有其他用例,我们需要设置对集群的访问。

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

更新:如果您使用的是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 命令时它会首先进行AssumeRoleapi 调用,如果我们看到假定的角色 ARN 那么它不会包含路径所以如果我们包括路径,那么它 EKS 将拒绝这些请求。

  • 相同内容https://aws.amazon.com/premiumsupport/knowledge-center/eks-api-server-unauthorized-error/ (3认同)

Ste*_*van 34

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

EKS-文档

因此,要添加对其他aws用户的访问权限,首先必须编辑ConfigMap以将IAM用户或角色添加到Amazon EKS群集.

您可以通过执行以下命令来编辑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"
Run Code Online (Sandbox Code Playgroud)

请注意mapUsers您将ops-usermapAccountslabel 一起添加的位置,该标签使用Kubernetes集群上的用户名映射AWS用户帐户.

但是,仅通过此操作就没有在RBAC中提供权限; 您仍必须在群集中创建角色绑定以提供这些实体权限.

正如亚马逊文档(iam-docs)所述,您需要为ConfigMap中指定的用户在kubernetes集群上创建角色绑定.你可以通过执行fallowing命令(kub-docs)来做到这一点:

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

它将cluster-admin授予整个集群中ClusterRole名为ops-user的用户.

  • “你是 SOL(运气不好)”应该是公认的答案。 (6认同)
  • `kubectl edit -n kube-system configmap / aws-auth`也返回错误:您必须登录到服务器(未授权)。基本上,如果您无权承担创建群集的IAM实体(用户或角色),那么您就是SOL。就我而言,我没有权限为我的用户创建访问密钥,但是我可以创建EKS集群。因此,我通过控制台创建了一个EKS群集,但是据我所知,我无法访问它,因为我需要访问密钥才能在CLI上假设我的用户。 (4认同)
  • 与@FGreg相同。尝试此操作时,我收到“错误:您必须登录到服务器(未经授权)” (3认同)
  • @umi0410 我最终通过控制台删除了集群,然后从命令行重新创建它。 (3认同)
  • 是否有地方可以查看哪个 IAM 用户或角色创建了 EKS 集群? (2认同)

Ste*_*acy 11

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

eksctl create iamidentitymapping --cluster <cluster-name> --arn arn:aws:iam::<id>:user/<user-name> --group system:masters --username ops-user
Run Code Online (Sandbox Code Playgroud)

  • 在关于添加额外 IAM 角色的官方 AWS 指南无济于事之后,这救了我。多谢!我查看了此命令后的最终 aws-auth `configmap`,唯一的区别是现在有一个重复的 `mapUsers` 记录,其中包含 `&lt;user-name&gt;`,但没有 `userarn`。但不确定这是否重要 (2认同)

Ita*_*y k 10

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

# - "-r"
# - "arn:aws:iam::**********:role/**********"
Run Code Online (Sandbox Code Playgroud)

虽然我不知道为什么


小智 7

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

换句话说,在 inside 中~/.aws/credentials,访问 kubectl 的配置文件必须与用于创建集群的IAM 完全相同

我的建议是使用 AWS cli 创建您的集群,因为从 GUI 创建可能比帮助更令人困惑。该入门指南是启动和运行,你最好的选择。

  • 如果我希望其他用户能够部署到集群怎么办? (2认同)

jui*_*dM3 6

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

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