I cannot get kubectl
to authenticate with the EKS Kubernetes instance my coworker created. I've followed the documentation: the AWS CLI can run aws eks
commands (I'm an AWS Full Administrator), and the heptio authenticatior is in my path and can generate tokens.
When I run kubectl
I get this error:
$ 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)
Here's my ~/.kube/config file. It's the exact kubeconfig my coworker can successfully use.
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>"
I needed to add my IAM user to the
mapUsers
section of the ConfigMapconfigmap/aws-auth
, per these AWS docs.You can edit the configmap using the same AWS user that initially created the cluster.
Unfortunately, AWS doesn't yet have a command like GKE's "gcloud container clusters get-credentials", which creates kubectl config for you. So, you need to create kubectl config file manually.
As mentioned in creating a kubeconfig for Amazon EKS document, you should get two things from the cluster:
Retrieve the endpoint for your cluster. Use this for the
<endpoint-url>
in your kubeconfig file.Retrieve the certificateAuthority.data for your cluster. Use this for the
<base64-encoded-ca-cert>
in your kubeconfig file.Create the default kubectl folder if it does not already exist.
Open your favorite text editor and paste the following kubeconfig code block into it.
Replace the
<endpoint-url>
with the endpoint URL that was created for your cluster. Replace the<base64-encoded-ca-cert>
with the certificateAuthority.data that was created for your cluster. Replace the<cluster-name>
with your cluster name.Save the file to the default kubectl folder, with your cluster name in the file name. For example, if your cluster name is devel, save the file to
~/.kube/config-devel
.Add that file path to your
KUBECONFIG
environment variable so thatkubectl
knows where to look for your cluster configuration.(Optional) Add the configuration to your shell initialization file so that it is configured when you open a shell.
For Bash shells on macOS:
For Bash shells on Linux:
Test your configuration.
Output:
Note
If you receive the error
"heptio-authenticator-aws": executable file not found in $PATH
, then yourkubectl
is not configured for Amazon EKS. For more information, see Configure kubectl for Amazon EKS.Things have gotten a bit simpler over time. To get started on Linux (or indeed WSL) you will need to:
aws configure
or e.g. use AWS SSO to generate time-limited credentials on the fly)At this point, assuming you already have a running Kubernetes Cluster in your AWS account you can generate/update the kube configuration in $HOME/.kube/config with this one command:
aws eks update-kubeconfig --name test
Where
test
is your cluster name according to the AWS Console (oraws eks list-clusters
).You can now run for instance
kubectl get svc
without getting an error.Pass in your AWS configuration variables in line with your command (or set them as global variables).
Example:
I resolved this issue by fixing the base64 encoded certificate in the kubeconfig file I created. The documentation is a little confusing because it says to use the --cluster-name switch with the aws cli for the EKS service and for me the --name switch worked. This printed the base64 value to the cli and I copy pasta it into the kubeconfig file saved and it worked.