Instalación de kubernetes en Linux con Kubeadm

favicon

Buenas a tod@s, en esta entrada vamos a ver como se realiza la instalación de kubernetes en  la distribución de GNU/Linux Ubuntu Xenial 16.04.

Para empezar vamos a saber que es concretamente kubernetes.

¿Qué es Kubernetes?

Kubernetes es un sistema open source creado por Google para la gestión de aplicaciones en contenedores,  un sistema de orquestación para contenedores como Docker gestionado por encima por kubernetes permite acciones como programar el despliegue, escalado y la monitorización de nuestros contenedores entre diversas funcionalidades mas.

Escenario práctico

En nuestro caso práctico de instalación y configuración de kudeadm tendremos el siguiente escenario que se compone por tres nodos, de los cuales uno de ellos es el master y los otros dos son nodos que sirven al master.
La siguiente imagen muestra como es el escenario.

 

kubeadm

 

Antes de nada tendremos que tener claro que si kubernetes gestiona contenedores de docker por ejemplo, tendremos que tener instalado docker en nuestro sistema. Para ello vamos a realizar una breve explicación de la instalación de docker.

Instalación de Docker

Primero tendremos que actualizar los paquetes.

sudo apt-get update

Acto seguido vamos a agregar la clave GPG para el repositorio oficial de Docker para poder realizar su instalación.

sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

Agregaremos el repositorio Docker a las fuentes de APT.

sudo apt-add-repository 'deb https://apt.dockerproject.org/repo ubuntu-xenial main'

Actualizaremos los paquetes.

sudo apt-get update

Nos aseguraremos que está a punto de instalar desde el repositorio de Docjer en lugar del repositorio predeterminado de Ubuntu 16.04.

apt-cache policy docker-engine

Al introducir el comando anterior nos debería salir algo parecido a lo siguiente.

root@kubernetes-1:/home/ubuntu# apt-cache policy docker-engine
docker-engine:
 Installed: (none)
 Candidate: 17.05.0~ce-0~ubuntu-xenial
 Version table:
     17.05.0~ce-0~ubuntu-xenial 500
          500 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages
     17.04.0~ce-0~ubuntu-xenial 500
          500 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages
     17.03.1~ce-0~ubuntu-xenial 500
          500 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages
     17.03.0~ce-0~ubuntu-xenial 500
          500 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages
     1.13.1-0~ubuntu-xenial 500
          500 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Package

Tendremos que observar que docker-engine no está instalado, pero el candidato para la instalación es el repositorio de Docker para ubuntu 16.04. No tenga en cuenta el numero de version de docker-engine ya que puede variar.

Una vez comprobado todo procederemos a realizar la instalación de docker con el siguiente comando.

sudo apt-get install -y docker-engine

En el momento en el que esté instalado procederemos a realizar un systemctl status docker para comprobar que el daemon esta iniciado.

● docker.service - Docker Application Container Engine
        Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
        Active: active (running) since Wed 2018-02-07 18:52:49 UTC; 1h 32min ago
          Docs: https://docs.docker.com
      Main PID: 5930 (dockerd)

Una vez comprobado que esta el daemon en ejecución, ya tendremos instalado docker en nuestro equipo, este procedimiento de instalación la tendremos que realizar en las tres máquinas para que pueda usarse kubernetes en los tres nodos.
Como ya tenemos instalado docker en todas las máquinas pues ya podemos proceder con la instalación de kubeadm.

Instalación y Configuración de Kubeadm

Para comenzar tendremos que instalar las aplicaciones básicas para Ubuntu y además de ello realizaremos un update.

apt-get update && apt-get install -y apt-transport-https

Acto seguido nos descargamos la clave GPG de kubernetes para instalarlo.

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -

Añadiremos el repositorio.

cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF

Actualizamos paquetes para incluir los de kubernetes.

apt-get update

Seguidamente vamos a realizar la instalación de los paquetes necesarios para kubeadm.

apt-get install -y kubelet kubeadm kubectl

En el momento en el que hallamos instalado los paquetes anteriores procederemos a ejecutar kubeadm. Esta ejecución solamente se realiza en el equipo que va a ser master(kubernetes-1).

kubeadm init

Una vez ejecutado nos debería aparecer algo parecido a lo siguiente.

[init] Using Kubernetes version: v1.9.2
[init] Using Authorization modes: [Node RBAC]
[preflight] Running pre-flight checks.
 [WARNING SystemVerification]: docker version is greater than the most recently validated version. Docker version: 17.05.0-ce. Max validated version: 17.03
 [WARNING Hostname]: hostname "kubernetes-1" could not be reached
 [WARNING Hostname]: hostname "kubernetes-1" lookup kubernetes-1 on 192.168.102.2:53: no such host
 [WARNING FileExisting-crictl]: crictl not found in system path
[certificates] Generated ca certificate and key.
[certificates] Generated apiserver certificate and key.
[certificates] apiserver serving cert is signed for DNS names [kubernetes-1 kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 10.0.0.15]
[certificates] Generated apiserver-kubelet-client certificate and key.
[certificates] Generated sa key and public key.
[certificates] Generated front-proxy-ca certificate and key.
[certificates] Generated front-proxy-client certificate and key.
[certificates] Valid certificates and keys now exist in "/etc/kubernetes/pki"
[kubeconfig] Wrote KubeConfig file to disk: "admin.conf"
[kubeconfig] Wrote KubeConfig file to disk: "kubelet.conf"
[kubeconfig] Wrote KubeConfig file to disk: "controller-manager.conf"
[kubeconfig] Wrote KubeConfig file to disk: "scheduler.conf"
[controlplane] Wrote Static Pod manifest for component kube-apiserver to "/etc/kubernetes/manifests/kube-apiserver.yaml"
[controlplane] Wrote Static Pod manifest for component kube-controller-manager to "/etc/kubernetes/manifests/kube-controller-manager.yaml"
[controlplane] Wrote Static Pod manifest for component kube-scheduler to "/etc/kubernetes/manifests/kube-scheduler.yaml"
[etcd] Wrote Static Pod manifest for a local etcd instance to "/etc/kubernetes/manifests/etcd.yaml"
[init] Waiting for the kubelet to boot up the control plane as Static Pods from directory "/etc/kubernetes/manifests".
[init] This might take a minute or longer if the control plane images have to be pulled.
[apiclient] All control plane components are healthy after 49.003529 seconds
[uploadconfig] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[markmaster] Will mark node kubernetes-1 as master by adding a label and a taint
[markmaster] Master kubernetes-1 tainted and labelled with key/value: node-role.kubernetes.io/master=""
[bootstraptoken] Using token: 8212ea.b01e65b8129b03eb
[bootstraptoken] Configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstraptoken] Configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstraptoken] Configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstraptoken] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[addons] Applied essential addon: kube-dns
[addons] Applied essential addon: kube-proxy

Your Kubernetes master has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

 mkdir -p $HOME/.kube
 sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
 sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
 https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of machines by running the following on each node
as root:

kubeadm join --token 8212ea.b01e65b8129b03eb 10.0.0.15:6443 --discovery-token-ca-cert-hash sha256:54e3489945be576a4edbd3d6f268f5f8bcf8e8ece016709b12060df7828ba751

El join que nos aparece al final deberemos guardarlo para mas adelante enlazar los otros dos nodos con el master ya que este comando lo que realiza es enlazar dicho nodo con el master.

kubeadm join --token 8212ea.b01e65b8129b03eb 10.0.0.15:6443 --discovery-token-ca-cert-hash sha256:54e3489945be576a4edbd3d6f268f5f8bcf8e8ece016709b12060df7828ba751

Configuración de Kubeadm (Entorno de usuario)

Acto seguido vamos a configurar el entorno de usuario para ello vamos a realizar lo siguiente (lo que vamos a realizar a continuación nos aparece al final del comando anterior ya que se realiza en el master).

Primero crearemos el directorio.

 mkdir -p $HOME/.kube

Acto seguido vamos a configurar los archivos de configuración.

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

Por último vamos a cambiar los permisos a dicho directorio y con eso ya tendremos configurado el entorno de usuario.

 sudo chown $(id -u):$(id -g) $HOME/.kube/config

 

En el momento en el que necesitemos resetear la configuración de kubeadm tendremos que introducir el siguiente comando.

kubeadm reset

Instalación del Pod Network

Deberemos instalar un pod network para comunicar el master(kubernetes-1) con los demas nodos que en nuestro caso es para permitir la comunicación con los otros dos nodos. Existen diferentes proyectos que proporcionan pod network para kubernetes, algunos de ellos también apoyan la política de red, siendo en nuestro caso en el que vamos a instalar «Calico» y se realiza con el siguiente comando (se introduce solo en el master).

kubectl apply -f https://docs.projectcalico.org/v2.6/getting-started/kubernetes/installation/hosted/kubeadm/1.6/calico.yaml

Unión de nodos

Para que puedan comunicarse los diferentes nodos con el master y viceversa tendremos que unir los distintos nodos ya que si no, estarían los tres nodos aislado y de esa forma no realizaría su cometido. Para ello vamos a introducir el siguiente comando en los otros dos nodos que se tienen que unir con el master(dicho comando es el que nos generó el master»kubernetes-1″ cuando se ejecuto el kudeadm init ).

kubernetes-2

root@kubernetes-2:/home/ubuntu# kubeadm join --token 8212ea.b01e65b8129b03eb 10.0.0.15:6443 --discovery-token-ca-cert-hash sha256:54e3489945be576a4edbd3d6f268f5f8bcf8e8ece016709b12060df7828ba751
[preflight] Running pre-flight checks.
 [WARNING SystemVerification]: docker version is greater than the most recently validated version. Docker version: 17.05.0-ce. Max validated version: 17.03
 [WARNING Hostname]: hostname "kubernetes-2" could not be reached
 [WARNING Hostname]: hostname "kubernetes-2" lookup kubernetes-2 on 192.168.102.2:53: no such host
 [WARNING FileExisting-crictl]: crictl not found in system path
[discovery] Trying to connect to API Server "10.0.0.15:6443"
[discovery] Created cluster-info discovery client, requesting info from "https://10.0.0.15:6443"
[discovery] Requesting info from "https://10.0.0.15:6443" again to validate TLS against the pinned public key
[discovery] Cluster info signature and contents are valid and TLS certificate validates against pinned roots, will use API Server "10.0.0.15:6443"
[discovery] Successfully established connection with API Server "10.0.0.15:6443"

This node has joined the cluster:
* Certificate signing request was sent to master and a response
 was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the master to see this node join the cluster.


kubernetes-3

root@kubernetes-3:/home/ubuntu# kubeadm join --token 8212ea.b01e65b8129b03eb 10.0.0.15:6443 --discovery-token-ca-cert-hash sha256:54e3489945be576a4edbd3d6f268f5f8bcf8e8ece016709b12060df7828ba751
[preflight] Running pre-flight checks.
 [WARNING SystemVerification]: docker version is greater than the most recently validated version. Docker version: 17.05.0-ce. Max validated version: 17.03
 [WARNING Hostname]: hostname "kubernetes-3" could not be reached
 [WARNING Hostname]: hostname "kubernetes-3" lookup kubernetes-3 on 192.168.102.2:53: no such host
 [WARNING FileExisting-crictl]: crictl not found in system path
[discovery] Trying to connect to API Server "10.0.0.15:6443"
[discovery] Created cluster-info discovery client, requesting info from "https://10.0.0.15:6443"
[discovery] Requesting info from "https://10.0.0.15:6443" again to validate TLS against the pinned public key
[discovery] Cluster info signature and contents are valid and TLS certificate validates against pinned roots, will use API Server "10.0.0.15:6443"
[discovery] Successfully established connection with API Server "10.0.0.15:6443"

This node has joined the cluster:
* Certificate signing request was sent to master and a response
 was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the master to see this node join the cluster.
root@kubernetes-3:/home/ubuntu# kubectl apply -f https://docs.projectcalico.org/v2.6/getting-started/kubernetes/installation/hosted/kubeadm/1.6/calico.yaml
The connection to the server localhost:8080 was refused - did you specify the right host or port?

Una vez introducido el join en ambos nodos, ya tendremos los dos nodos (kubernetes-2 y kubernetes-3) unidos con el master(kubernetes-1).

Comprobación de la unión de los nodos con el master

Para finalizar vamos a dirigirnos al master(kubernetes-1) e introduciremos el siguiente comando que nos permitirá visualizar si la unión de los nodos ha sido exitosa.

root@kubernetes-1:/home/ubuntu# kubectl get nodes
NAME          STATUS  ROLES  AGE VERSION
kubernetes-1   Ready  master  1h  v1.9.2
kubernetes-2   Ready  <none>  1h  v1.9.2
kubernetes-3   Ready  <none>  1h  v1.9.2

Y con esto hemos aprendido de como crear un escenario de 3 nodos con kubernetes, concretamente con kubeadm.
Espero que os haya servido de ayuda.
Os espero en la próxima publicación.

 

Enlace:

https://kubernetes.io/docs/setup/independent/install-kubeadm/
https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/#14-installing-kubeadm-on-your-hosts

 

 


4 respuestas a “Instalación de kubernetes en Linux con Kubeadm

  1. Hola Juanjo. Quería agradecerte tu manual de instalación de Kubernetes. Me ha sido de muchísima ayuda, y gracias a él he podido hacerlo funcionar. Tus explicaciones sobre qué hace cada comando es de ayuda para comprender cómo funciona. Un saludo.

  2. Hola me funciona todo perecto lo estoy haciendo en maquina virtual y me sale todo conectado incluso los nodos con el maste todos ready.

    Pero ahora hago un reboot al servidor master intento poner el mismo comando para ver los nodos disponible y no me deja me sale algo de conection port localhost como si se perdiera la configuración ya echa de antes.

    Espero respuestas.

    1. Buenas.

      Eso es posible a que el servicio de kubectl se haya detenido al reiniciar el equipo, lo único que tienes que hacer es iniciar kubectl de nuevo y no habría mas problemas.

      Un saludo.

Deja un comentario