Para evitar errores en las validaciones de las API que utiliza kubernetes es necesario instalar la misma versión de kubectl que la versión de kubernetes que corre en nuestro Cluster.
Para este ejemplo vamos a utilizar un cluster basado en minikube. Como todos sabemos minikube es un cluster formado por una sola máquina y que podemos utilizar cuando queremos formarnos y comprender como kubernetes funciona.
Este artículo no pretende dar los pasos necesario para conectarnos a un cluster de producción si no identificar los recursos que intervienen entre un cliente kubectl y un Cluster de kubernetes. Como en casi todos estos sistemas todo esta basado en una autenticación basada en certificados.
Instalación en un sistema linux
$ curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.7.0/bin/linux/amd64/kubectl $ chmod +x ./kubectl $ sudo mv ./kubectl /usr/local/bin/kubectl
Configurar el acceso al Cluster
La configuración de acceso a un Cluster se encuentra normalmente en
~/.kube/config
En el caso que nos ocupa estamos utilizando minikube en un sistema Windows y lo que queremos es poder conectarnos desde una maquina virtual Ubuntu al cluster de minikube. Copiamos la configuración de nuestro sistema en nuestro Ubuntu.
Lo normal no es hacerlo así, si no que nos proporcionen un certificado cliente para nosotros y así autenticarnos con el cluster, o bien generar nosotros una petición de firma de certificado y que la CA nos la firme.
La configuración en nuestro sistema Windows es la siguiente:
$ cat ~/.kube/config apiVersion: v1 clusters: - cluster: certificate-authority: C:\Software\minikube\.minikube\ca.crt server: https://192.168.99.100:8443 name: minikube contexts: - context: cluster: minikube user: minikube name: minikube current-context: minikube kind: Config preferences: {} users: - name: minikube user: client-certificate: C:\Software\minikube\.minikube\apiserver.crt client-key: C:\Software\minikube\.minikube\apiserver.key $ kubectl config view apiVersion: v1 clusters: - cluster: certificate-authority: C:\Software\minikube\.minikube\ca.crt server: https://192.168.99.100:8443 name: minikube contexts: - context: cluster: minikube user: minikube name: minikube current-context: minikube kind: Config preferences: {} users: - name: minikube user: client-certificate: C:\Software\minikube\.minikube\apiserver.crt client-key: C:\Software\minikube\.minikube\apiserver.key
Copiamos dicha configuración en Ubuntu en
~/.kube/config
y modificamos la ruta de los certificados. Como vemos tenemos
- el certificado de la CA
y
- clave privada de cliente y el certificado de cliente
que nuestro administrador de kubernetes nos ha generado para nosotros.
Nuestra configuración en Ubuntu quedaría:
$ find /var/minikube/ /var/minikube/ /var/minikube/.minikube /var/minikube/.minikube/ca.crt /var/minikube/.minikube/apiserver.key /var/minikube/.minikube/apiserver.crt $ cat ~/.kube/config apiVersion: v1 clusters: - cluster: certificate-authority: /var/minikube/.minikube/ca.crt server: https://192.168.99.100:8443 name: minikube contexts: - context: cluster: minikube user: minikube name: minikube current-context: minikube kind: Config preferences: {} users: - name: minikube user: client-certificate: /var/minikube/.minikube/apiserver.crt client-key: /var/minikube/.minikube/apiserver.key
Validamos la configuración
$ kubectl version Client Version: version.Info{Major:"1", Minor:"7", GitVersion:"v1.7.0", GitCommit:"d3ada0119e776222f11ec7945e6d860061339aad", GitTreeState:"clean", BuildDate:"2017-06-29T23:15:59Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"7", GitVersion:"v1.7.0", GitCommit:"d3ada0119e776222f11ec7945e6d860061339aad", GitTreeState:"clean", BuildDate:"2017-07-26T00:12:31Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"linux/amd64"} $ kubectl get all NAME READY STATUS RESTARTS AGE po/frontend-3872149310-0qz3m 1/1 Running 4 1d po/hello-1243552595-bv62v 1/1 Running 2 1d po/hello-1243552595-h9fdd 1/1 Running 2 1d po/hello-1243552595-jmwp2 1/1 Running 2 1d po/hello-1243552595-k3q4d 1/1 Running 2 1d po/hello-1243552595-w4sw1 1/1 Running 2 1d po/hello-1243552595-xb96t 1/1 Running 2 1d po/hello-1243552595-xvw2q 1/1 Running 2 1d po/hello-minikube-180744149-b7g45 1/1 Running 5 48d po/nginx-deployment-2078889897-mcdz4 1/1 Running 3 2d po/nginx-deployment-2078889897-qc4dk 1/1 Running 3 2d po/nginx-deployment-2078889897-xnzzh 1/1 Running 3 2d NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE svc/frontend 10.0.0.30 80:31303/TCP 1d svc/hello 10.0.0.6 80/TCP 1d svc/hello-minikube 10.0.0.201 8080:31033/TCP 48d svc/kubernetes 10.0.0.1 443/TCP 49d NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE deploy/frontend 1 1 1 1 1d deploy/hello 7 7 7 7 1d deploy/hello-minikube 1 1 1 1 48d deploy/nginx-deployment 3 3 3 3 2d NAME DESIRED CURRENT READY AGE rs/frontend-3872149310 1 1 1 1d rs/hello-1243552595 7 7 7 1d rs/hello-minikube-180744149 1 1 1 48d rs/nginx-deployment-2078889897 3 3 3 2d rs/nginx-deployment-2558903419 0 0 0 2d rs/nginx-deployment-3896099094 0 0 0 2d
Configurar el acceso a más de un cluster
Desde nuestr cliente kubectl podemos conectarnos a más de un cluster. Solo tenemos que modificar el fichero de configuración añadiendo la nueva entrada. Si nos fijamos tenemos varias secciones para indicar la configuración de mas de un cluster y el mecanismo de autenticación para cada uno de ellos.
Estas secciones son <strong>clusters</strong>, <strong>context</strong> y <strong>users</strong>.
Para cambiarnos y apuntar a otro cluster diferente de donde nos encontremos es bastante sencillo. Solo tenemos que apuntar al contexto que queremos.
En este caso solo tenemos 1 contexto, es decir 1 configuración a cluster. El comando sería:
$ kubectl config use-context minikube Switched to context "minikube"