
El siguiente despliegue constara de 5 nodos, donde cada uno de ellos dispondrá de los siguientes roles:
Nodo Manager (IP: 10.70.10.200)
*La función del manager será repartir la carga y permitirnos que los worker puedan disponer de ese «HA» para la API. (Para esta función se hará uso del Nginx y el modulo stream)
Nodo Control-Panel_01 (IP: 10.70.10.201)
(Administrar el cluster y sus recursos)
Nodo Control-Panel_02 (IP: 10.70.10.202)
(Administrar el cluster y sus recursos)
Worker_01 (IP: 10.70.10.203)
(Donde correremos los containers)
Worker_02 (IP: 10.70.10.204)
(Donde correremos los containers)
Informacion previa al despliegue del entorno:
** Para este despliegue se ha montado sobre un OS RedHat 8
Cada nodo debe tener un único Hostname, direccion MAC y Product_uuid
- Configuracion inicial del nodo Manager
(*En esta primera config del nginx definimos únicamente el controlplane_01 en el grupo k8s-apiservers, mas adelante se añadirá el resto)
Lo primero de to 🙂 echamos un vistazo al estado de SELinux, donde lo mas normal es que lo tengamos habilitado, dado que configuramos un nuevo puerto en el sistema, deberemos autorizarlo!!
[root@manager ~]# setsebool -P httpd_can_network_connect on
[root@manager ~]# setsebool -P httpd_graceful_shutdown on
[root@manager ~]# setsebool -P httpd_can_network_relay on
[root@manager ~]# setsebool -P nis_enabled on
[root@manager ~]# semanage port -a -t http_port_t -p tcp 6443
**Esto habilita los booleanos del SELinux para el proceso httpd (no nginx!), pero aun no siendo específicos de Nginx, sin ellos no funciona (entre ellos permitir la comunicación de entrada, reenvío del trafico a otro host, por ultimo asociamos el puerto 6443 al grupo http_port
Posteriormente añadimos las reglas del firewall.
firewall-cmd --add-service={kube-apiserver,http,https}
firewall-cmd --runtime-to-permanent
[root@manager ~]# dnf -y install nginx nginx-mod-stream
[root@manager ~]# vi /etc/nginx/nginx.conf
# Al final del fichero añadimos la siguiente config para habilitar el proxy
stream {
upstream k8s-apiservers {
server 10.70.10.201:6443;
}
server {
listen 6443;
proxy_pass k8s-api;
}
}
[root@manager ~]# systemctl enable --now nginx
**El paso siguiente es opcional, aqui unicamente instalaremos la herramienta kubectl en el caso de que la gestion la vayamos a hacer desde el manager, indico como instalarlo, pero vaya, que es opcional :)
[root@manager ~]# cat <<'EOF' > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-$basearch
enabled=0
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
EOF
[root@manager ~]# dnf --enablerepo=kubernetes -y install kubectl
- Configuración del Kubeadm
**Esta configuracion la realizaremos sobre todos los nodos EXCEPTUANDO al Nodo Manager, por lo tanto en el resto de nodos lanzaremos lo siguiente:
[root@controlplane ~]# cat > /etc/sysctl.d/99-k8s-cri.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-ip6tables=1
EOF
[root@controlplane ~]# sysctl --system
[root@controlplane ~]# modprobe overlay
[root@controlplane ~]# modprobe br_netfilter
[root@controlplane ~]# echo -e overlay\\nbr_netfilter > /etc/modules-load.d/k8s.conf
[root@controlplane ~]# swapoff -a
[root@controlplane ~]# vi /etc/fstab
y comentar la linea de la swap
#/dev/mapper/cs-swap none swap defaults 0 0
[root@controlplane ~]# dnf -y install centos-release-okd-4.14
[root@controlplane ~]# sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/CentOS-OKD-4.14.repo
[root@controlplane ~]# dnf --enablerepo=centos-okd-4.14 -y install cri-o
[root@controlplane ~]# systemctl enable --now crio
[root@controlplane ~]# cat <<'EOF' > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-$basearch
enabled=0
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
EOF
[root@controlplane ~]# dnf --enablerepo=kubernetes -y install kubeadm kubelet cri-tools iproute-tc container-selinux
[root@controlplane ~]# systemctl enable kubelet
- Configuracion del controlplane
Habilitamos las reglas del firewall
firewall-cmd --add-service={kube-apiserver,kube-control-plane,kube-control-plane-secure,kubelet,kubelet-readonly,http,https}
firewall-cmd --runtime-to-permanent
kubeadm init --control-plane-endpoint=10.0.0.25 --apiserver-advertise-address=10.0.0.30 --pod-network-cidr=172.16.0.0/16 --cri-socket=unix:///var/run/crio/crio.sock
**Aqui explicandolo un poco:
--control-plane-endpoint=10.0.0.25 (Estamos apuntando al manager ya que nuestra intencion es balancear el servicio
--apiserver-advertise-address=10.0.0.30 (Indicamos la ip de nuestro control-plane, esto se hace ahora de manera inicial ya que despues para el segundo control-plane SOLO se agregara el manager.
--pod-network-cidr=172.16.0.0/16 (La red de nuestras vainas :) )
------------------------------
Una vez los ejecutemos y todo funcione ... etc etc
[init] Using Kubernetes version: v1.28.1
[preflight] Running pre-flight checks
[WARNING Firewalld]: firewalld is active, please ensure ports [6443 10250] are open or your cluster may not function correctly
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
[certs] Using certificateDir folder "/etc/kubernetes/pki" ... .. .. ...
Nos generara unos tokens con los cuales añadiremos posteriormente a nuestros workers!
Antes de movernos a los worker terminaremos de configuraremos calico para dar red a nuestro sistema, pero antes nos configuramos el kubeconfig para poder conectarnos al manager y poder realizar las gestiones :)
[root@controlplane ~]# mkdir -p $HOME/.kube
[root@controlplane ~]# cp /home/centos/admin.conf $HOME/.kube/config
[root@controlplane ~]# chown $(id -u):$(id -g) $HOME/.kube/config
wget https://raw.githubusercontent.com/projectcalico/calico/master/manifests/calico.yaml
kubectl apply -f calico.yaml
kubectl get pods -A
(*Si todo va bien ya veremos nuestro pods de calico operando)
- Configuracion de workers
Echamos abajo el firewall
systemctl disable --now firewalld
Y con el token de antes kubeadm join 10.70.10.200 .. . . le agregamos..
- Agregar otro control plane y worker
Para agregar otro controlplane cargaremos en nuestro config del nginx la ip del nuevo control plane.
[root@manager ~]# vi /etc/nginx/nginx.conf
# Al final del fichero añadimos la siguiente config para habilitar el proxy
stream {
upstream k8s-apiservers {
server 10.70.10.201:6443;
server 10.70.10.202:6443;
}
server {
listen 6443;
proxy_pass k8s-api;
}
}
Y le metemos un reload systemctl reload nginx
Ahora llega el momento certificado!!
En nuestro controlplane principal nos vamos a:
cd /etc/kubernetes/pki
tar czvf kube-certs.tar.gz sa.pub sa.key ca.crt ca.key front-proxy-ca.crt front-proxy-ca.key etcd/ca.crt etcd/ca.key
Y este comprimido nos lo llevamos al segundo controlplane, antes de movernos al otro controlplane nos generamos un token nuevo.
kubeadm token create --print-join-command
Ahora si nos vamos al segundo controlplane
Nos creamos un directorio:
[root@controlplane2 ~]# mkdir /etc/kubernetes/pki
Descomprimimos todo ahi
[root@controlplane2 ~]# tar zxvf /home/centos/kube-certs.tar.gz -C /etc/kubernetes/pki
[root@controlplane2 ~]# firewall-cmd --add-service={kube-apiserver,kube-control-plane,kube-control-plane-secure,kubelet,kubelet-readonly,http,https}
[root@controlplane2 ~]# firewall-cmd --runtime-to-permanent
Y por ultimo le vinculamos
[root@controlplane2 ~]# kubeadm join 10.70.10.200 ... ...
*Para validar que todo esta ok kubectl get nodes
Para agregar el segundo worker, lo mismo de antes nos generamos un token ...
Deshabiliamos firewall y como hicimos con el otro nodo
kubeadm token create --print-join-command