如何从 EC2 实例配置文件中管理 EKS?

8

我们的系统使用EKS Kubernetes集群。我们从EC2实例“堡垒主机”中管理它们,在那里我们通过ssh登录,配置我们的凭证,并使用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集群?


2
那个 IAM 策略实际上并不是集群用于授权 API 调用的方式。它使用一个 configmap 将 IAM 角色映射到 k8s 集群角色。https://docs.aws.amazon.com/eks/latest/userguide/add-user-role.html - jordanm
1
@jordanm 谢谢你的链接,它帮助我弄清楚了如何添加角色映射(EC2实例配置文件角色<-->系统:masters k8s权限),现在EC2可以与EKS通信了。 - James Wierzba
2个回答

7
感谢@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:
  # ...

5
默认情况下,只有集群创建者可以访问集群内的资源,其他用户或角色不能访问。 为了使其他用户/角色拥有集群权限,EKS 在 kube-system 命名空间中提供了一个名为aws-ath的configmap。您需要在其中定义 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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接