6

假设我使用以下方法获得 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

那也不起作用,同样的错误。

4

2 回答 2

3

@MrCholo,您是否确保将您配置KUBECONFIG为使用 exec 凭证流?使用 EKS 和/或身份验证器,您无需生成令牌,然后将其注入每个请求kubectlexec从而为您提供二进制文件。我们已将所有这些内容融入到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 调用以返回你是谁,然后它会使用它来验证你是否在用户白名单中.

希望这会有所帮助。

于 2019-05-20T23:11:06.643 回答
3

确保您没有配置任何以下环境变量:

unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY

大多数(如果不是全部)aws 工具将优先考虑这些配置。例如,我在尝试使用时被这个愚弄了AWS_PROFILE

于 2019-05-20T20:54:21.157 回答