设置EKS群集后出现错误“调用AssumeRole操作时发生错误(AccessDenied):访问被拒绝”

时间:2019-07-03 05:37:55

标签: amazon-web-services eks

我已使用AWS控制台创建了EKS集群,同时在创建集群时使用了预先创建的VPC和子网,同时创建了一个角色eks-role,该角色具有AmazonEKSClusterPolicyAmazonEKSServicePolicy附加到它。

我使用以下方法添加了kubeconfig文件:

aws eks update-kubeconfig --name eks-cluster --role-arn "arn:aws:iam::############:role/eks-role"

当我使用kubectl get svc命令时,出现以下错误:

  

调用AssumeRole操作时发生错误(AccessDenied):访问被拒绝

我不知道这可能是什么问题。


在我的用户中,我添加了以下策略:

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

在这个角色中,我添加了信任关系:

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

我的~/.aws/credentials文件如下:

**[default]**
aws_access_key_id = ##############

aws_secret_access_key = #############################

region=us-west-1

**[test]**
aws_access_key_id = ###########

aws_secret_access_key = #############################

region=ap-southeast-1

**[eks]**
role_arn = arn:aws:iam::##########:role/eks-role

source_profile = test

1 个答案:

答案 0 :(得分:6)

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

当我们通过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群集的访问权限,您也可以为这些用户使用同一组命令。