Después de conseguir arrancar Kubernetes tras la instalación, al intentar ejecutar comandos vía kubectl
obtengo el mensaje de error The connection to the server localhost:8080 was refused - did you specify the right host or port?
A continuación explico cómo solucionar el error y evitar que vuelva a mostrarse.
En la guía oficial para instalar Kubernetes en Linux con kubeadm
Installing Kubernetes on Linux with kubeadm, en la salida del comando kubeadm init
en el punto (2/4) - Initializing your master, se muestra:
Your Kubernetes master has initialized successfully!
To start using your cluster, you need to run (as a regular >user):
sudo cp /etc/kubernetes/admin.conf $HOME/
sudo chown $(id -u):$(id -g) $HOME/admin.conf
export KUBECONFIG=$HOME/admin.conf
El problema es que la exportación de la variable de entorno realizada mediante export KUBECONFIG=$HOME/admin.conf
se pierde en cuanto se cierra la sesión.
Por tanto, cuando reconectamos más tarde, la variable KUBECONFIG
está vacía y el comando kubectl
intenta conectar con localhost:8080
. Como el API server no está escuchando en esta IP y puerto, lo que obtenemos el mensaje de error:
The connection to the server localhost:8080 was refused - did you specify the right host or port?
Si miramos el contenido del fichero $HOME/admin.conf
mediante cat $HOME/admin.conf
encontramos una línea que identifica el servidor: server: https://192.168.1.11:6443
Parece que lo único que tenemos que hacer es especificar el servidor como parámetro para kubectl
, pero…
$ kubectl get nodes --server=https://192.168.1.11:6443
Please enter Username: pirate
Please enter Password: ********
Unable to connect to the server: x509: certificate signed by unknown authority
Si usamos el usuario
root
, el resultado es el mismo.
Observando el contenido del fichero admin.conf
vemos que para el parámetro user
se especifican certificados (mediante client-certificate-data
y client-key-data
):
...
users:
- name: kubernetes-admin
user:
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4akNDQ...
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLQVdLN3JjWDIKY2DIKY2t1c...
$
Así que no podemos autenticarnos en el API Server con los usuarios del sistema y tenemos que usar los certificados en el fichero admin.conf
.
Esto nos lleva de nuevo a la variable KUBECONFIG
. Si lanzamos el comando export KUBECONFIG...
, los comandos funcionarán durante la sesión en curso, pero tendremos que lanzar el comando export
en cada nueva sesión:
export KUBECONFIG=$HOME/admin.conf
La solución para que la variable se establezca automáticamente en cada inicio de sesión es añadiéndo el valor en el fichero $HOME/.bashrc
.
$ nano $HOME/.bashrc
export KUBECONFIG=$HOME/admin.conf
Para verificar que funciona como debe, cierra sesión y vuelve a iniciarla.
Comprueba que puedes lanzar comandos sin problemas:
$ kubectl get nodes
NAME STATUS AGE VERSION
k1 Ready 3d v1.6.1
$
¡Problema solucionado!
Otra solución alternativa, si no quieres modificar el fichero $HOME/admin.conf
es pasar la ubicación del fichero como parámetro a kubectl
:
$ kubectl get nodes
The connection to the server localhost:8080 was refused - did you specify the right host or port?
$ kubectl --kubeconfig ./admin.conf get nodes
NAME STATUS AGE VERSION
k1 Ready 3d v1.6.1
$
Puedes usar también este método para conectar, por ejemplo, desde otro equipo al nodo master del clúster (debes copiar primero el fichero admin.conf
a tu equipo, desde su ubicación original /etc/kubernetes/admin.conf
o desde la carpeta $HOME
del usuario, si lo has copiado):
$ scp pirate@k1.local:/home/pirate/admin.conf .
kubectl --kubeconfig ./admin.conf get nodes