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 支持
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?
| 归档时间: |
|
| 查看次数: |
5393 次 |
| 最近记录: |