假设我使用以下方法获取EKS令牌:
aws eks get-token --region us-west-2 --cluster-name eks1
结果如下:
{"status": {"token": "k8s-aws-v1.aHR0.....Ni"}, "kind": "ExecCredential", "apiVersion": "client.authentication.k8s.io/v1alpha1", "spec": {}}
如何将令牌传递给其他cli命令?像这样:
kubectl get svc --token="$token-from-above"
没有令牌,我不断收到此错误:
错误:您必须登录到服务器(未经授权)
但是存在我的AWS凭证,这就是为什么我可以获得令牌的原因。我假设它与aws-iam-authenticator token -i eks1
我尝试运行此命令:
export AWS_SESSION_TOKEN="$token-from-above"
kubectl get svc
也不起作用,同样的错误。
答案 0 :(得分:2)
确保没有配置任何以下环境变量:
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
大多数(如果不是全部)aws工具将优先采用那些配置。例如,在尝试使用AWS_PROFILE
时,我对此感到迷惑。
答案 1 :(得分:2)
@MrCholo,您是否已确保将KUBECONFIG
配置为使用exec凭证流?使用EKS和/或身份验证器,您无需生成令牌,然后将其注入每个请求中,kubectl
可以exec
为您准备二进制文件。我们已将所有这些内容烘焙到update-kubeconfig
cli命令中,您可以看到https://docs.aws.amazon.com/eks/latest/userguide/getting-started-console.html#eks-configure-kubectl
但是它看起来像这样:
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: XXX
server: XXX
name: XXX
contexts:
- context:
cluster: XXX
user: XXX
name: XXX
current-context: XXX
kind: Config
preferences: {}
users:
- name: XXX
user:
exec:
apiVersion: client.authentication.k8s.io/v1alpha1
args:
- eks
- get-token
- --region us-west-2
- --cluster-name eks1
command: aws
env: null
您需要确保至少具有1.10+版本的kubectl
客户端版本,可以使用kubectl version --client --short
进行检查。
其他要注意的是,此令牌不是AWS IAM令牌,它是API服务器用来验证用户身份的生成并签名的URL。底层请求实际上是aws sts get-caller-identity
,但是我们没有完成请求,我们只对URL签名,然后对base64进行编码,然后将其封装在JSON中以提交给api服务器。将令牌传递到api服务器后,令牌将被发送到控制平面中的身份验证器Web服务器,该服务器将对其进行解码,然后“完成” STS调用以返回您的身份,然后用来验证您是否在用户白名单中
希望有帮助。