我无法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 用户添加到mapUsers
ConfigMap 的部分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文档中,你应该从集群中获得两件事:
检索集群的端点。将其用于
<endpoint-url>
kubeconfig 文件中。aws eks describe-cluster --cluster-name <cluster-name> --query cluster.endpoint
检索集群的 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
,则表示您的kubectl
Amazon EKS 未配置。有关更多信息,请参阅为 Amazon EKS 配置 kubectl。
答案3
随着时间的推移,事情变得简单了一些。要开始使用 Linux(或 WSL),您需要:
- 安装 AWS CLI并配置有效的 AWS CLI 凭证(
aws configure
或者例如使用 AWS SSO 动态生成有时间限制的凭证) - 安装 eksctl 和 kubectl
- 安装 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