我正在使用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_PROFILE
env变量或~/.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。