尝试从容器内访问 EKS 集群

时间:2021-02-19 19:57:01

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

总结:创建 EKS 集群。尝试从 docker 容器运行命令。获取错误。

设置。

按照 AWS 教程设置 EKS 集群

  1. 通过 CFT 创建 VPC 和支持基础设施
  2. 创建 IAM 角色和策略:myAmazonEKSClusterRole/AmazonEKSClusterPolicy
  3. 通过以 SSO 身份登录的控制台创建 EKS 集群
  4. 等待集群准备就绪
  5. 从通过 SSO 身份验证的笔记本电脑/CLI 执行

aws eks update-kubeconfig --name my-cluster

  1. 执行kubectl get svc,得到好的结果

  2. 在 IAM 中创建身份提供者并与 EKS 集群 OpenID 连接提供者 URL 关联

  3. 创建 CNI 角色和策略:myAmazonEKSCNIRole

  4. 通过 aws eks update-addon 命令将角色关联到集群

  5. 创建节点角色 myAmazonEKSNodeRole 并附加策略:AmazonEKSWorkerNodePolicy 和 AmazonEC2ContainerRegistryReadOnly

  6. 在 AWS 中创建密钥对

  7. 将节点组添加到配置了上述角色和密钥对的集群

  8. 等到节点组处于活动状态

此时,如果我使用 kubectl 或 helm 进行测试,我可以操作集群。不过,我仍在以 SSO 用户身份进行身份验证,并在我的笔记本电脑上运行。

继续前进。我想从 docker 容器内操作集群。所以我继续执行以下步骤。

EKS 集群在 AWS 账户 B 中。

  1. 在 AWS 账户 B (RoleInAccountB) 中创建角色。角色在帐户 B 中具有管理员访问权限政策。
  2. 在账户 A 和账户 B 之间建立信任,以便账户 A 中的用户可以担任账户 B 中的角色

在本地计算机上,容器外(SSO 身份验证)

  1. 下载 aws-auth-cm.yaml 并对其进行自定义以添加新角色:
apiVersion: v1
kind: ConfigMap
metadata:
  name: aws-auth
  namespace: kube-system
data:
  mapRoles: |
    - groups:
      - system:masters
      rolearn: arn:aws:iam::<Account B>:role/RoleInAccountB
      username: DOESNTMATTER
  1. 执行kubectl apply -f aws-auth-cm.yaml
  2. 观察节点以确保它们准备就绪kubectl get nodes –watch
  3. 验证配置 kubectl describe configmap -n kube-system aws-auth 看起来不错。
  4. SSH 到账户 A 中的 EC2
  5. 在 EC2 上运行 docker 容器(映像已安装必备依赖项,例如 aws cli、kubectl 等)

从容器内

  1. 承担帐户 B 的角色
  2. 通过 aws cli 将角色添加到 kube 配置

aws eks update-kubeconfig --name my-cluster --role-arn arn:aws:iam::accountB:role/RoleInAccountB

  1. 执行测试以检查集群 kubectl get svc 的权限

收到错误“错误:您必须登录到服务器(未经授权)”

更新:我从 ec2(容器外)尝试了这个。我得到了相同的结果。

想知道以下指导是否是我接下来必须尝试的。 https://github.com/kubernetes-sigs/aws-iam-authenticator/blob/master/README.md

2021 年 3 月 19 日更新 仍然没有真正解决问题。我发现如果我在创建集群之前承担一个角色(控制台或 cli),那么我可以稍后在容器/ec2 中承担该角色并很好地操作集群。这是意料之中的,但它已成为我的工作。仍在寻找更改集群权限以允许其他角色(未创建集群)执行命令的正确方法。

1 个答案:

答案 0 :(得分:0)

在运行 aws eks update-kubeconfig 之前最好先了解您当前的身份上下文,在第 9 步之前和之后帐户 A 中 aws sts get-caller-identity 的输出是什么?

另一件值得尝试的事情是打开生成的 KUBECONFIG 文件,查找辅助命令(如 aws-iam-authenticatoraws eks get-token)并直接绕过 kubectl 身份验证处理逻辑执行它< /p>

这就是助手的样子

aws eks get-token --cluster-name my-cluster --role arn:aws:iam::accountB:role/RoleInAccountB

aws-iam-authenticator token -i my-cluster -r arn:aws:iam::accountB:role/RoleInAccountB

输出是什么?

第三件事,您可以使用 AWS 命名配置文件在使用 role_arn/source_arn 组合的账户之间透明地承担 AWS IAM 角色。

https://docs.aws.amazon.com/cli/latest/topic/config-vars.html#using-aws-iam-roles