Instalación de Kubernetes OnPremise
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:
- Maquinas o VM con IP estáticas.
- Mínimo 2GB de RAM y 2 CPU por cada maquina.
- 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 annotationThis 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: