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

Ray*_* Ng 8 amazon-iam kubernetes 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 角色:

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

我运行“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
Run Code Online (Sandbox Code Playgroud)

并且之前已经更新了 Kubernetes aws-auth ConfigMap,具有如下附加角色:

data:
  mapRoles: |
    - rolearn: arn:aws:iam::[hidden]:role/ci_deployer
      username: system:node:{{EC2PrivateDNSName}}
      groups:
        - system:masters
Run Code Online (Sandbox Code Playgroud)

我的 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 支持

Ric*_*ico 5

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

是的,它可以工作。解决它的一个好方法是从运行 kubectl 的同一命令行运行:

$ aws sts get-caller-identity
Run Code Online (Sandbox Code Playgroud)

您可以查看Arn角色(或用户)的 ,然后确保在IAM中该角色与您在kubeconfig 中指定的角色之间存在信任关系

command: aws-iam-authenticator
args:
   - "token"
   - "-i"
   - "<cluster-name>"
   - "-r"
   - "<role-you-want-to-assume-arn>"
Run Code Online (Sandbox Code Playgroud)

或使用较新的选项:

command: aws
args:
- eks
- get-token
- --cluster-name
- <cluster-name>
- --role
- <role-you-want-to-assume-arn>
Run Code Online (Sandbox Code Playgroud)

请注意,如果您正在使用,aws eks update-kubeconfig您可以传入该--role-arn标志以在您的 kubeconfig 中生成上述内容。

在您的情况下,您可以查看一些内容:

  • 凭证环境变量未在您的 CI 中设置?:

    AWS_ACCESS_KEY_ID
    AWS_SECRET_ACCESS_KEY
    
    Run Code Online (Sandbox Code Playgroud)
  • 您的 ~/.aws/credentials 文件未在 CI 中正确填充。像这样:

    [default]
    aws_access_key_id = xxxx
    aws_secret_access_key = xxxx
    
    Run Code Online (Sandbox Code Playgroud)
  • 通常,环境变量优先,因此您也可以在这些环境变量中拥有完全不同的凭据。

  • 它也可以是AWS_PROFILEenv 变量或中的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>"
    
    Run Code Online (Sandbox Code Playgroud)
  • 配置文件是否在 下正确设置~/.aws/config