Instalación de Kubernetes OnPremise

Christian Altamirano Ayala
Kubernetes
Published in
5 min readSep 8, 2019

--

Hace mucho tiempo quería instalar y configurar un cluster de kubernetes onpremise, así que después de un buen tiempo decidí que era la hora y por fin pude instalarlo, así que aquí comparto los pasos que hice.

Requerimientos:

  1. Maquinas o VM con IP estáticas.
  2. Mínimo 2GB de RAM y 2 CPU por cada maquina.
  3. El usuario root o usuario con los mismos privilegios.

Instalación inicial

En esta etapa se harán las instalaciones y configuraciones para todas las maquinas, sean estas workers o master.

sudo vi /etc/hosts

Configuramos las IP de cada nodo.

192.168.1.105 master
192.168.1.106 worker1

Configuramos el hostname

sudo hostnamectl set-hostname master (para el master)sudo hostnamectl set-hostname worker1 (para el worker)

Deshabilitamos el SELIINUX

sudo setenforce 0

luego modificamos el archivo /etc/sysconfig/selinux a disabled

sudo sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

Hasta este paso es bueno reiniciar la maquina para que tome en cuenta el cambio que se hizo en el paso anterior.

Luego necesitamos habilitar el modulo br_netfilter del kernel

sudo modprobe br_netfilter
sudo echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables

luego des habilitamos la configuración del swap, esto por que kubernetes no permite la instalación si esta opción esta habilitada.

sudo swapoff -a

Instalamos Docker:

En este caso es recomendable instalar la version 18.04 de docker, ya que kubernetes siguiere esa version (yo instale la ultima version 19.03 y la instalación me salio normal, eso si con un WARNING de la version de docker).

sudo yum install -y yum-utils device-mapper-persistent-data lvm2sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.reposudo yum install -y docker-cesudo systemctl enable docker.service
sudo systemctl start docker.service

Instalación de Kubernetes:

Después de instalar debemos de instalar kubernetes.

Creamos el repositorio:

sudo vi /etc/yum.repos.d/kubernetes.repo

Agregamos el siguiente contenido en el repositorio que creamos en el paso anterior:

[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg

Instalamos Kubernetes con el siguiente comando:

sudo yum install -y kubelet kubeadm kubectl

Finalmente, habilitamos el servicio de Kubelet

sudo systemctl enable kubelet.service

Configuración en el Nodo Maestro

Esta parte es para la configuración del nodo maestro:

sudo kubeadm init  --pod-network-cidr=192.168.0.0/16 --apiserver-advertise-address=<IP_MASTER>

Después de ejecutar el comando anterior nos debería de mandar un mensaje como el siguiente:

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 192.168.1.105:6443 --token fwldpz.bgejrgr1cqviuoeo --discovery-token-ca-cert-hash sha256:b11fbe1063550e822c54033729d45ca28e1fdb05deed3fbd103f27cf2926b2e7

En la ultima parte del mensaje podemos ver un comando, copia ese comando en un lugar seguro ya que usaremos este comando para conectar los nodos workers con el master.

Luego ejecutamos los siguientes comando para la configuración del kubectl

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

Una vez terminado, podríamos ejecutar el comando para obtener los nodos disponibles

kubectl get nodes

Deberías de ver una salida como la siguiente

NAME          STATUS     ROLES    AGE   VERSION
master NotReady master 14m v1.13.2

En la salida del mensaje anterior nos muestra que el nodo master se encuentra en el estado NotReady, esto es por que nos falta instalar un CNI (Container Networking Interface)

En este caso instalaremos Calico como nuestro gestor de red, para ello primero debemos instalar un etcd para calico:

kubectl apply -f \
https://docs.projectcalico.org/v3.4/getting-started/kubernetes/installation/hosted/etcd.yaml

Luego instalar Calico:

kubectl apply -f \
https://docs.projectcalico.org/v3.4/getting-started/kubernetes/installation/hosted/calico.yaml

Deberías de ver el siguiente mensaje

configmap/calico-config created
secret/calico-etcd-secrets created
daemonset.extensions/calico-node created
serviceaccount/calico-node created
deployment.extensions/calico-kube-controllers created
serviceaccount/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-node created
clusterrolebinding.rbac.authorization.k8s.io/calico-node created

Esperemos un momento hasta que se desplieguen los pods de calico, para lo cual ejecutamos el siguiente comando y esperamos hasta que todos los pods tengan un estado RUNNING

kubectl get pods --all-namespaces

Una vez que todos los pods tengan el estado RUNNING ejecutamos el siguiente comando:

kubectl get nodes

Deberíamos de ver algo así:

NAME          STATUS     ROLES    AGE     VERSION
master Ready master 6m44s v1.13.2

Configuración en los nodos Workers

En el lado de los workers solo debemos de ejecutar el siguiente comando pero eso si cambiando los valores del token y el hash del certificado (Aquí debemos copiar el comando que nos mostró al momento de instalar en el nodo maestro):

kubeadm join 192.168.1.105:6443 --token fwldpz.bgejrgr1cqviuoeo --discovery-token-ca-cert-hash sha256:b11fbe1063550e822c54033729d45ca28e1fdb05deed3fbd103f27cf2926b2e7

Cuando la ejecución sea exitosa se mostrara el siguiente resultado:

[discovery] Trying to connect to API Server "192.168.1.105:6443"
[discovery] Created cluster-info discovery client, requesting info from "https://192.168.1.105:6443"
[discovery] Requesting info from "https://192.168.1.105: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 "192.168.1.105:6443"
[discovery] Successfully established connection with API Server "192.168.1.105:6443"
[join] Reading configuration from the cluster...
[join] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
[kubelet] Downloading configuration for the kubelet from the "kubelet-config-1.13" ConfigMap in the kube-system namespace
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Activating the kubelet service
[tlsbootstrap] Waiting for the kubelet to perform the TLS Bootstrap...
[patchnode] Uploading the CRI Socket information "/var/run/dockershim.sock" to the Node API object "worker-node" as an annotation
This node has joined the cluster:
* Certificate signing request was sent to apiserver 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.

Ahora volvamos al nodo maestro y ejecutemos el siguiente comando:

kubectl get nodes

Salida:

NAME          STATUS   ROLES    AGE     VERSION
master Ready master 21m v1.13.2
worker1 Ready <none> 5m29s v1.13.2

Probando el cluster

Probamos ejecutando un NGINX:

kubectl create deployment nginx --image=nginx

Salida:

deployment.apps/nginx created

Creamos un service para poder ver desde nuestro navegador red:

kubectl create service nodeport nginx --tcp=80:80

Now, list out all the services by running the following command:

kubectl get svc

Deberíamos ver el puerto en el que se expone nuestro nginx:

NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
nginx NodePort 10.102.166.47 <none> 80:30784/TCP 31s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 25m

Finalmente, solo habré la siguiente url http://192.168.1.106:30784 (IP del nodo worker). Deberías de ver la siguiente imagen:

--

--