kubectl是否可以担任AWS的角色



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

我在两个不同的AWS帐户(PROD&NONPROD)上有两个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实例可以承担任何一个AWS帐户的ci_deployer角色。

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

实际:但我得到"服务器已要求客户端提供凭据">

还缺少什么?

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

期待@Kubernetes对此的进一步支持

kubectl是否可以在AWS 的假定角色中工作

是的,它可以工作。排除故障的一个好方法是从运行kubectl的同一命令行运行:

$ aws sts get-caller-identity

您可以看到角色(或用户)的Arn,然后确保IAM中该角色与您在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,则可以在kubeconfig中传递--role-arn标志以生成上述内容。

在你的情况下,你可以看看一些东西:

  • 您的CI中没有设置凭据环境变量?:

    AWS_ACCESS_KEY_ID
    AWS_SECRET_ACCESS_KEY
    
  • 您的~/.aws/凭据文件在CI中没有正确填充

    [default]
    aws_access_key_id = xxxx
    aws_secret_access_key = xxxx
    
  • 通常情况下,环境变量优先,因此可能在这些环境变量中也有不同的凭据。

  • 它也可以是AWS_PROFILEenv变量或~/.kube/config中的AWS_PROFILE配置

    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下正确设置?

从步骤1:创建您的亚马逊集群

创建Amazon EKS集群时,创建集群的IAM实体(用户或角色)将作为管理员(具有系统:主权限)添加到Kubernetes RBAC授权表中。最初,只有该IAM用户才能使用kubectl调用Kubernetesneneneba API服务器。

正如您所发现的,您只能使用最初创建EKS集群的相同用户/角色访问集群。

有一种方法可以在创建后通过编辑已创建的aws-auth-ConfigMap向集群添加其他角色。

添加用户角色

通过编辑aws-auth-ConfigMap,您可以根据用户的角色添加不同级别的访问权限。

首先你必须有"系统:节点:{{EC2PrivateDNSName}}"用户

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

这是Kubernetes工作所必需的,使节点能够加入集群。"ARN of instance role"是指包含所需策略AmazonEKSWorkerNodePolicy、AmazonEKS_CNI_Policyy、AmazonEC2ContainerRegistryReadOnly等的角色。

下面添加您的角色

- rolearn: arn:aws:iam::[hidden]:role/ci_deployer
username: ci-deployer
groups:
- system:masters

"username"实际上可以设置为任何值。只有在EKS集群中添加了自定义角色和绑定时,这一点才显得重要。

此外,使用命令"aws-sts-get-caller identity"来验证环境/shell和aws凭据是否正确配置。如果配置正确,"获取调用方标识"应返回aws-auth中指定的相同角色ARN。

相关内容

  • 没有找到相关文章

最新更新