【问题标题】:How to manage EKS from EC2 instance profile?如何从 EC2 实例配置文件管理 EKS?
【发布时间】:2021-03-23 08:11:00
【问题描述】:

我们的系统有 EKS kubernetes 集群。我们通过 ssh 进入的 EC2 实例“堡垒主机”管理它们,配置我们的凭证,并使用 kubectl 来管理集群。

我们确实希望继续在 EC2 主机上手动配置我们的凭据。

因此,我正在尝试将 EC2 实例配置文件与具有适当权限的 EC2 主机相关联以管理集群。但是,它不起作用。

EC2 实例有一个 IAM 实例配置文件,该配置文件与包含此策略的角色相关联(完全 EKS 权限)

{
    "Sid": "2",
    "Effect": "Allow",
    "Action": [
        "eks:*"
    ],
    "Resource": "*"
}

因此,当我运行以下命令时,我希望能够列出 EKS 上的活动服务:

[ec2-user@ip-10-0-0-72 ~]$ aws eks update-kubeconfig --name my_eks_cluster_name
[ec2-user@ip-10-0-0-72 ~]$ kubectl get svc
error: the server doesn't have a resource type "svc"

该错误意味着我没有权限。我通过在主机上配置一些 AWS 凭证证明了这一点:

[ec2-user@ip-10-0-0-72 ~]$ export AWS_ACCESS_KEY_ID=...
[ec2-user@ip-10-0-0-72 ~]$ export AWS_SECRET_ACCESS_KEY=...
[ec2-user@ip-10-0-0-72 ~]$ export AWS_SESSION_TOKEN=...

现在,我尝试列出 svc:

[ec2-user@ip-10-0-0-72 ~]$ kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   172.20.0.1   <none>        443/TCP   85d

有效

为什么 IAM 实例角色不足以让我通过 kubectl 管理我的 EKS 集群?

【问题讨论】:

  • 该 IAM 策略实际上并不是集群用于授权 API 调用的策略。它使用将 IAM 角色映射到 k8s 集群角色的配置映射。 docs.aws.amazon.com/eks/latest/userguide/add-user-role.html
  • @jordanm 感谢该链接帮助我弄清楚添加角色映射(EC2 实例配置文件角色 系统:masters k8s 权限),现在 ec2 可以与 EKS 对话

标签: amazon-web-services kubernetes amazon-ec2 amazon-iam amazon-eks


【解决方案1】:

感谢 @jordanm 指出 EKS 使用 configmap 来处理授权。

我能够编辑 configmap,添加一个条目以将 EC2 实例配置文件的 IAM 角色 arn:aws:iam::111111111111:role/eks_management_host_jw_jw 映射到 kubernetes system:masters 组(管理员)

# 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::111111111111:role/eks_node_jw_jw
      username: system:node:{{EC2PrivateDNSName}}
    - groups:  # <-- I added this
      - system:masters
      rolearn: arn:aws:iam::111111111111:role/eks_management_host_jw_jw
      username: system:admin
kind: ConfigMap
metadata:
  # ...

【讨论】:

    【解决方案2】:

    默认情况下,只有集群创建者有权访问集群内的资源,其他用户或角色无权访问。 为了向任何其他用户/角色授予集群权限,EKS 在 kube-system 命名空间中有一个名为 aws-ath 的配置映射。您必须在其中定义 mapRoles 才能授予其他角色的权限。与授予其他用户权限类似,应定义mapUsers

    例子

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: aws-auth
      namespace: kube-system
    data:
      mapRoles: |
        - rolearn: <ARN of instance role (not instance profile)>
          username: system:node:{{EC2PrivateDNSName}}
          groups:
            - system:bootstrappers
            - system:nodes
            - system:masters
    

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

    【讨论】:

      猜你喜欢
      • 2018-04-18
      • 2016-10-01
      • 1970-01-01
      • 2020-09-14
      • 2016-05-31
      • 2018-10-20
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      相关资源
      最近更新 更多