kubernetes - kubectl 能否以 AWS 的假定角色工作

标签 kubernetes amazon-iam kubectl amazon-eks

我正在使用 Amazon EKS 进行 Kubernetes 部署(最初由 AWS 管理员用户创建),目前难以使用来自 AWS STS 代入角色的 AWS 凭证来执行 kubectl与堆栈交互的命令

我在 2 个不同的 AWS 账户(PROD 和 NONPROD)上有 2 个 EKS 堆栈,并且我正在尝试使用 AWS STS 承担角色提供的凭证将 CI/CD 工具部署到两个 kubernetes 堆栈,但我不断收到错误如 error: You must be logged in to the server (the server has asked for the client to provide credentials) .

我已按照以下链接向配置添加额外的 AWS IAM 角色:

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

  • 但我不确定我做错了什么。

    我运行“aws eks update-kubeconfig”来更新本地 .kube/config 文件,内容填充如下:
    apiVersion: v1
    clusters:
    - cluster:
        certificate-authority-data: [hidden]
        server: https://[hidden].eu-west-1.eks.amazonaws.com
      name: arn:aws:eks:eu-west-1:[hidden]:cluster/demo-eks
    contexts:
    - context:
        cluster: arn:aws:eks:eu-west-1:[hidden]:cluster/demo-eks
        user: arn:aws:eks:eu-west-1:[hidden]:cluster/demo-eks
      name: arn:aws:eks:eu-west-1:[hidden]:cluster/demo-eks
    current-context: arn:aws:eks:eu-west-1:[hidden]:cluster/demo-eks
    kind: Config
    preferences: {}
    users:
    - name: arn:aws:eks:eu-west-1:[hidden]:cluster/demo-eks
      user:
        exec:
          apiVersion: client.authentication.k8s.io/v1alpha1
          args:
          - token
          - -i
          - triage-eks
          command: aws-iam-authenticator
    

    并且之前已经更新了 Kubernetes aws-auth ConfigMap,具有如下附加角色:
    data:
      mapRoles: |
        - rolearn: arn:aws:iam::[hidden]:role/ci_deployer
          username: system:node:{{EC2PrivateDNSName}}
          groups:
            - system:masters
    

    我的 CI/CD EC2 实例可以假设 ci_deployer任一 AWS 账户的角色。

    预期:我可以调用“kubectl version”来查看客户端和服务器版本

    实际:但我得到“服务器要求客户端提供凭据”

    还缺少什么?

    经过进一步测试,我可以确认 kubectl 只能在创建 EKS 堆栈的同一 AWS 账户的环境(例如,我的具有 AWS 实例角色的 CI EC2 实例)中工作。这意味着我来自账户 A 的 CI 实例将无法与来自账户 B 的 EKS 通信,即使 CI 实例可以承担来自账户 B 的角色,并且账户 B 角色包含在 kube 配置的 aws-auth 中帐户 B EKS。我希望这是由于缺少配置,因为如果 CI 工具无法使用角色假设从多个 AWS 账户部署到多个 EKS,我发现这相当不受欢迎。

    期待进一步的@Kubernetes 支持

    最佳答案

    Can kubectl work from an assumed role from AWS



    是的,它可以工作。解决它的一个好方法是从运行 kubectl 的同一命令行运行:
    $ aws sts get-caller-identity
    

    您可以看到 Arn 对于角色(或用户),然后确保有一个 trust relationshipIAM这与您在 kubeconfig 中指定的角色之间:
    command: aws-iam-authenticator
    args:
       - "token"
       - "-i"
       - "<cluster-name>"
       - "-r"
       - "<role-you-want-to-assume-arn>"
    

    或使用较新的选项:
    command: aws
    args:
    - eks
    - get-token
    - --cluster-name
    - <cluster-name>
    - --role
    - <role-you-want-to-assume-arn>
    

    请注意,如果您使用的是 aws eks update-kubeconfig您可以通过 --role-arn标记以在您的 kubeconfig 中生成上述内容。

    在您的情况下,您可以查看一些内容:
  • 凭证环境变量未在您的 CI 中设置?:
    AWS_ACCESS_KEY_ID
    AWS_SECRET_ACCESS_KEY
    
  • 您的 ~/.aws/credentials 文件未在 CI 中正确填充。像这样:
    [default]
    aws_access_key_id = xxxx
    aws_secret_access_key = xxxx
    
  • 通常,环境变量优先,因此您也可以在这些环境变量中拥有完全不同的凭据。
  • 它也可能是 AWS_PROFILE env 变量或 AWS_PROFILE配置在 ~/.kube/config
    users:
    - name: aws
      user:
        exec:
          apiVersion: client.authentication.k8s.io/v1alpha1
          command: aws-iam-authenticator
          args:
            - "token"
            - "-i"
            - "<cluster-name>"
            - "-r"
            - "<role-arn>"
          env:
            - name: AWS_PROFILE <== is this value set
              value: "<aws-profile>"
    
  • 配置文件是否在 ~/.aws/config 下正确设置?
  • 关于kubernetes - kubectl 能否以 AWS 的假定角色工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54258516/

    相关文章:

    Kubernetes:将传入流量路由到特定 Pod

    amazon-web-services - 签名已过期 : is now earlier than error : InvalidSignatureException

    amazon-web-services - 如何在 AWS 中由 IAM 用户生成成本浏览器?

    json - 通过cloudformation创建IAM角色时policyName出错

    Kubernetes |任何可用于 Pod 重启的钩子(Hook)?

    kubernetes - 从在 Kubernetes 上运行的应用程序订阅云发布/订阅主题

    kubernetes - ConfigMap 文件中的 Helm 变量

    kubernetes - 如何将 Stackdriver 图表转换为 csv 文件?

    kubernetes - Kubernetes节点详细信息

    kubernetes - 在部署更新时重新附加卷声明