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

时间:2018-06-11 06:03:07

标签: amazon-web-services kubernetes

我一直在尝试遵循EKS的入门指南。 当我试图调用kubectl获取服务时,我收到了消息:错误:您必须登录到服务器(未经授权) 这就是我做的:
1.创建EKS集群 2.按如下方式创建配置文件:

columns.Command(command => {
    command.Custom("Edit").Click("ItempopUpManager.btnAddClicked")
      .HtmlAttributes(new {
        @class = "btn btn-default"
      });
  }).Width(130)
  .Title(Resources.GetString(Constants.Edit));
  1. 下载并安装最新的aws cli
  2. Ran aws配置并设置我的IAM用户和区域的凭据为us-west-2
  3. 为IAM用户添加了针对EKS角色的sts:AssumeRole的策略,并将其设置为信任关系
  4. 设置kubectl以使用配置文件
  5. 当我运行heptio-authenticator-aws令牌时,我可以得到一个令牌-r arn:aws:iam :: **********:role / ********* -i我的集群,AME 但是,当我尝试访问群集时,我一直收到错误:您必须登录到服务器(未授权)

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

17 个答案:

答案 0 :(得分:26)

  

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

eks-docs

因此,首先要添加对其他 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"

请注意要在其中添加 ops-user mapUsersmapAccounts标签,该标签将 AWS 用户帐户与用户名Kubernetes集群。

  

但是,仅此操作不会在RBAC中提供任何权限;您仍必须在集群中创建角色绑定以提供这些实体权限。

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

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

将集群管理员ClusterRole授予整个集群中名为 ops-user 的用户。

答案 1 :(得分:11)

我确定问题已经解决,但是我将在此处提供更多信息,因此,如果还有其他人仍然面临与以下任何设置相关的问题,那么他们可能不会像我一样浪费时间并使用这些步骤。

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

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

当我们使用IAM角色或IAM用户创建集群时,当我们使用角色与用户比较创建集群时,为EKS集群设置访问将变得有些棘手。

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

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


确认已通过运行命令arn在创建群集的AWS CLI上正确设置了IAM用户凭据

aws sts get-caller-identity

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

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

将配置文件附加到通过上述命令更新后的外观。除非有必要,否则请不要直接编辑此文件。

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

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

 $ 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

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


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

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

在这种情况下,我们不必在运行kubectl命令之前通过cli手动进行任何角色api调用,因为这将由kube配置文件中设置的 $ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP xxx.xx.x.x <none> 443/TCP 12d 自动完成。

让我们现在说,我们正在尝试为用户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 cli上正确设置了IAM用户凭证。请记住,重要的是应该向我们显示IAM用户ARN,而不是IAM假定的角色ARN。

aws sts get-caller-identity

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

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

将配置文件附加到通过上述命令进行更新后的外观。除非有必要,否则请不要直接编辑此文件。

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

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

 $ 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

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

确认配置文件设置正确,以便它可以使用 $ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP xxx.xx.x.x <none> 443/TCP 12d 的凭据

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

之后,使用配置文件中的以下命令更新kubeconfig文件,请确保我们不在此处使用该角色。

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

将配置文件附加到通过上述命令更新后的外观。除非有必要,否则请不要直接编辑此文件。

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

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

$ 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

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

如果角色直接附加到实例配置文件,那么在方案1中为IAM用户设置访问权限时,我们可以遵循与步骤类似的步骤

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

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

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

[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"
}

将配置文件附加到通过上述命令更新后的外观。除非有必要,否则请不要直接编辑此文件。

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

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

 $ 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

4。通过 $ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP xxx.xx.x.x <none> 443/TCP 12d 命令手动承担IAM角色。

通过运行cli命令手动设置角色aws sts assume-role

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 验证我们是否承担了IAM角色。

$ aws sts get-caller-identity { “帐户”:“ xxxxxxxxxx”, “ UserId”:“ xxxxxxxxxx:test”, “ Arn”:“ arn:aws:sts :: xxxxxxxxxx:假定角色/ eks角色/测试” }

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

aws sts get-caller-identity

将配置文件附加到通过上述命令更新后的外观。除非有必要,否则请不要直接编辑此文件。

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

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

 $ 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

注意:

我已经在这里尝试介绍主要用例,但是在我们需要设置对群集的访问权限的情况下,可能还会有其他用例。

此外,以上测试主要针对首次设置EKS集群,并且上述方法均未涉及aws-auth configmap。 但是,一旦您通过aws-auth(https://docs.aws.amazon.com/eks/latest/userguide/add-user-role.html)文件授予了其他IAM用户/角色对EKS集群的访问权限,您也可以为上述用户使用相同的命令集。

答案 2 :(得分:6)

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

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

答案 3 :(得分:4)

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

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

答案 4 :(得分:2)

我有同样的问题。您可能正在使用root帐户。看来根帐户被阻止担任所需角色。如果您使用过期的密钥,则有时可以掩盖此错误。

答案 5 :(得分:2)

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

PatrolID int (PK)
location_id int NULL FK 
assign_no int NULL FK
officer_id int NULL FK

虽然我不知道为什么

但它有效

答案 6 :(得分:1)

就我而言,这是AWS配置文件问题,请确保使用aws sts get-caller-identity来验证IAM用户。

答案 7 :(得分:1)

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

另一方面,在~/.aws/credentials内,访问kubectl 的配置文件必须与用于创建群集的完全相同的IAM 匹配。

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

答案 8 :(得分:1)

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

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

eksctl 创建集群 --name ekscluster --version 1.19 --with-oidc
--vpc-public-subnets=subnet-08c6b0b0166abc1d1,subnet-02822a142bb5a802a
--vpc-private-subnets=subnet-09bbf4871902ee64c,subnet-0926c224909b5a811

这将使用 cloudformation 自动创建和分配策略。

答案 9 :(得分:1)

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

答案 10 :(得分:0)

我刚刚调试了这个问题。我有个问题。您是否在公司wifi网络上运行此程序?如果是,是否可以创建EC2实例,然后测试是否能够执行kubectl get svc

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

答案 11 :(得分:0)

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

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

答案 12 :(得分:0)

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

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

答案 13 :(得分:0)

当我使用eks控制台的根目录创建eks集群时遇到此错误。我使用IAM用户重新创建了eks集群,并使用访问键更新了AWS配置。有效。现在,您可以添加其他IAM用户来发出kubectl命令。

答案 14 :(得分:0)

我试图创建一个带有私有端点的 EKS 集群。多次阅读此线程以及对我有用的内容:

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

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

答案 15 :(得分:0)

我遇到了同样的问题。我尝试使用访问密钥和秘密密钥直接配置 AWS CLI 并且成功了。

无法担任角色应该是错误。尝试设置 cli 并进行测试。

答案 16 :(得分:0)

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