kubectl 无法通过 AWS EKS 进行身份验证

kubectl 无法通过 AWS EKS 进行身份验证

我无法kubectl通过同事创建的 EKS Kubernetes 实例进行身份验证。我已关注 文档:AWS CLI 可以运行aws eks命令(我是 AWS 完全管理员),并且 heptio 身份验证器在我的路径中并且可以生成令牌。

当我运行时kubectl出现此错误:

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.4", 
GitCommit:"5ca598b4ba5abb89bb773071ce452e33fb66339d", GitTreeState:"clean", 
BuildDate:"2018-06-06T15:22:13Z", GoVersion:"go1.9.6", Compiler:"gc", 
Platform:"darwin/amd64"}
error: You must be logged in to the server (the server has asked for the client
to provide credentials)

这是我的 ~/.kube/config 文件。这是我的同事可以成功使用的 kubeconfig。

apiVersion: v1
clusters:
- cluster:
    server: https://myinstance.sk1.us-east-1.eks.amazonaws.com
    certificate-authority-data: base64_cert                                                                                                                                                                                                   name: kubernetes                                                                                                                                                                                                                          contexts:                                                                                                                                                                                                                                   - context:                                                                                                                                                                                                                                      cluster: kubernetes                                                                                                                                                                                                                         user: aws                                                                                                                                                                                                                                 name: aws
current-context: aws
kind: Config
preferences: {}
users:
- name: aws
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1alpha1
      command: heptio-authenticator-aws
      args:
        - "token"
        - "-i"
        - "dev-qa"
        # - "-r"
        # - "<role-arn>"

答案1

我需要将我的 IAM 用户添加到mapUsersConfigMap 的部分configmap/aws-auth这些 AWS 文档

您可以使用最初创建集群的相同 AWS 用户编辑 configmap。

$ kubectl edit -n kube-system configmap/aws-auth

apiVersion: v1
data:
mapRoles: |
    - rolearn: arn:aws:iam::555555555555:role/devel-worker-nodes-NodeInstanceRole-74RF4UBDUKL6
    username: system:node:{{EC2PrivateDNSName}}
    groups:
        - system:bootstrappers
        - system:nodes
mapUsers: |
    - userarn: arn:aws:iam::555555555555:user/admin
    username: admin
    groups:
        - system:masters
    - userarn: arn:aws:iam::111122223333:user/ops-user
    username: ops-user
    groups:
        - system:masters
mapAccounts: |
    - "111122223333"

答案2

不幸的是,AWS 还没有像 GKE 的“gcloud container clusters get-credentials”这样的命令来为您创建 kubectl config。因此,您需要手动创建 kubectl config 文件。

正如所提到的为 Amazon EKS 创建 kubeconfig文档中,你应该从集群中获得两件事:

  1. 检索集群的端点。将其用于<endpoint-url>kubeconfig 文件中。

    aws eks describe-cluster --cluster-name <cluster-name>  --query cluster.endpoint
    
  2. 检索集群的 certificateAuthority.data。将其用于<base64-encoded-ca-cert>kubeconfig 文件中。

    aws eks describe-cluster --cluster-name <cluster-name>  --query cluster.certificateAuthority.data
    

如果默认的 kubectl 文件夹不存在,请创建它。

mkdir -p ~/.kube

打开您最喜欢的文本编辑器并将以下 kubeconfig 代码块粘贴到其中。

apiVersion: v1
clusters:
- cluster:
    server: <endpoint-url>
    certificate-authority-data: <base64-encoded-ca-cert>
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: aws
  name: aws
current-context: aws
kind: Config
preferences: {}
users:
- name: aws
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1alpha1
      command: heptio-authenticator-aws
      args:
        - "token"
        - "-i"
        - "<cluster-name>"
        # - "-r"
        # - "<role-arn>"
      # env:
        # - name: AWS_PROFILE
        #   value: "<aws-profile>"

将 替换<endpoint-url>为您的集群创建的端点 URL。将 替换<base64-encoded-ca-cert>为您的集群创建的 certificateAuthority.data。将 替换<cluster-name>为您的集群名称。

将文件保存到默认的 kubectl 文件夹,文件名中包含您的集群名称。例如,如果您的集群名称是 devel,则将文件保存到~/.kube/config-devel

将该文件路径添加到您的KUBECONFIG环境变量中,以便kubectl知道在哪里查找您的集群配置。

export KUBECONFIG=$KUBECONFIG:~/.kube/config-devel

(可选)将配置添加到您的 shell 初始化文件中,以便在打开 shell 时对其进行配置。

对于 macOS 上的 Bash shell:

echo 'export KUBECONFIG=$KUBECONFIG:~/.kube/config-devel' >> ~/.bash_profile

对于 Linux 上的 Bash shell:

echo 'export KUBECONFIG=$KUBECONFIG:~/.kube/config-devel' >> ~/.bashrc

测试您的配置。

kubectl get svc

输出:

NAME             TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
svc/kubernetes   ClusterIP   10.100.0.1   <none>        443/TCP   1m

笔记
如果您收到错误"heptio-authenticator-aws": executable file not found in $PATH,则表示您的kubectlAmazon EKS 未配置。有关更多信息,请参阅为 Amazon EKS 配置 kubectl

答案3

随着时间的推移,事情变得简单了一些。要开始使用 Linux(或 WSL),您需要:

  1. 安装 AWS CLI并配置有效的 AWS CLI 凭证(aws configure或者例如使用 AWS SSO 动态生成有时间限制的凭证)
  2. 安装 eksctl 和 kubectl
  3. 安装 aws-iam-authenticator

此时,假设您的 AWS 账户中已经有一个正在运行的 Kubernetes 集群,您可以使用以下命令在 $HOME/.kube/config 中生成/更新 kube 配置:

aws eks update-kubeconfig --name test

test根据 AWS 控制台 (或 ),您的集群名称在哪里aws eks list-clusters

现在您可以运行实例kubectl get svc而不会出现错误。

答案4

我通过修复我创建的 kubeconfig 文件中的 base64 编码证书解决了这个问题。文档有点令人困惑,因为它说要将 --cluster-name 开关与 aws cli 一起使用以用于 EKS 服务,而对我来说 --name 开关有效。这会将 base64 值打印到 cli,然后我将其复制粘贴到保存的 kubeconfig 文件中,它就起作用了。

$ AWS_ACCESS_KEY_ID=[YOUR_ID_HERE] AWS_SECRET_ACCESS_KEY=[YOUR_SECRET_HERE] aws eks describe-cluster --name staging --query cluster.certificateAuthority.data

相关内容