我无法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>"
根据这些 AWS 文档,我需要将我的 IAM 用户添加到
mapUsers
ConfigMap 部分。configmap/aws-auth
您可以使用最初创建集群的同一 AWS 用户来编辑配置映射。
不幸的是,AWS 还没有像 GKE 的“gcloud container clusters get-credentials”这样的命令,它会为你创建 kubectl 配置。因此,您需要手动创建 kubectl 配置文件。
如为 Amazon EKS 文档创建 kubeconfig 中所述,您应该从集群中获得两件事:
检索集群的端点。
<endpoint-url>
在您的 kubeconfig 文件中使用它。检索集群的 certificateAuthority.data。
<base64-encoded-ca-cert>
在您的 kubeconfig 文件中使用它。如果默认 kubectl 文件夹不存在,请创建它。
打开您喜欢的文本编辑器并将以下 kubeconfig 代码块粘贴到其中。
将 替换
<endpoint-url>
为为您的集群创建的端点 URL。将 替换<base64-encoded-ca-cert>
为为您的集群创建的 certificateAuthority.data。将 替换为<cluster-name>
您的集群名称。将文件保存到默认的 kubectl 文件夹,文件名中包含您的集群名称。例如,如果您的集群名称是 devel,请将文件保存为
~/.kube/config-devel
.将该文件路径添加到您的
KUBECONFIG
环境变量中,以便kubectl
知道在哪里查找您的集群配置。(可选)将配置添加到您的 shell 初始化文件中,以便在您打开 shell 时对其进行配置。
对于 macOS 上的 Bash shell:
对于 Linux 上的 Bash shell:
测试您的配置。
输出:
Note
如果您收到错误消息
"heptio-authenticator-aws": executable file not found in $PATH
,则说明您kubectl
未针对 Amazon EKS 进行配置。有关更多信息,请参阅为 Amazon EKS 配置 kubectl。随着时间的推移,事情变得有点简单了。要开始使用 Linux(或实际上是 WSL),您需要:
aws configure
或例如使用 AWS SSO 即时生成限时凭证)此时,假设您的 AWS 账户中已经有一个正在运行的 Kubernetes 集群,您可以使用以下命令在 $HOME/.kube/config 中生成/更新 kube 配置:
aws eks update-kubeconfig --name test
test
根据 AWS 控制台(或aws eks list-clusters
) ,您的集群名称在哪里。例如,您现在可以运行
kubectl get svc
而不会出现错误。根据您的命令传入您的 AWS 配置变量(或将它们设置为全局变量)。
例子:
我通过修复我创建的 kubeconfig 文件中的 base64 编码证书解决了这个问题。该文档有点令人困惑,因为它说将 --cluster-name 开关与 aws cli 一起用于 EKS 服务,而对我来说 --name 开关有效。这会将 base64 值打印到 cli,然后我将它复制到保存的 kubeconfig 文件中并且它可以工作。