我正在使用 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
并且之前已经更新了 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 relationship在 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
您可以通过 --role-arn
标记以在您的 kubeconfig 中生成上述内容。在您的情况下,您可以查看一些内容:
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
[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/