- Introducción
- Arquitectura
- Provisionando la infraestructura en oci
- Instalando kubeadm, kebeles y kubectl (todos los nodos)
- Instalando una interface de ejecución de contenedores, Container Runtime Interface (CRI) (todos los nodos)
- Configurando el reenvío de IPv4 y configurando iptables con tráfico puente bridged traffic
- Instalando containerd
- Instalando runc
- Instalando CNI plugins
- Creando el archivo /etc/containerd/config.toml
- Configure el controlador de cgroup para systemd
- Inicialice el nodo controlador control-plane (sólo en el nodo controlador)
- Preparando el clúster para añadir nodos de procesamiento worker-nodes
- Añadiendo nodos de procesamiento worker nodes a el clúster de Kubernetes
- Conclusión
Introducción
La meta de esta guía es mostrar cómo usar Kubeadm para crear un clúster de Kubernetes en tres máquinas virtuales provisionadas en Oracle Cloud Infrastructure (OCI). Seguidamente se describirá la topología usada en esta guía, la configuración necesaria en OCI y todos los pasos ejecutados para desplegar el clúster de Kubernetes en dichas máquinas virtuales.
Importante, esta guía asume que usted tiene una cuenta gratuita en OCI; usted puede crear una cuenta en esta página OCI. Además, las máquinas virtuales usadas en esta guía están basadas en la arquitectura de computadoras Ampere ARM en combinación con Canonical Ubuntu 22.04. Por lo tanto, todos los programas instalados en esta guía están basados en esta configuración.
Arquitectura
La arquitectura usada en esta guía es my simple y es descrita por la siguiente imagen.

Tomando como base la imagen superior, nuestra instalación constará de 3 máquinas virtuales. Una será el nodo controlador “control plane” y las otras dos serán los nodos donde se ejecutarán las tareas “worker nodes”.
Provisionando la infraestructura en oci
Creando un compartimento “compartment”
- Haga clic en el menú hamburguesa y seguidamente haga clic en “Identity and Security”

- Ahora haga clic en “Create Compartment”

- Llene el formulario y haga clic en “Create Compartment”

Creando una red virtual en la nube virtual cloud network (VCN)
- Haga clic en el menú hamburguesa y a continuacón haga clic en “Networking > Virtual Cloud Networks”.

- Seleccione el compartimento creado en la sección superior.

- Ahora haga clic en “Start VCN Wizard”.

- Seleccione la opción que proporciona conectividad a la internet “with Internet connectivity”.

- Ahora proporcione un nombre, un compartimento y luego haga clic en “Next”

- Revise la configuración y haga clic en “Create”

- Si todo ha salido bien, usted debe ver una pantalla como la que se muestra a continuación.

Creando las máquinas virtuales
Aquí se muestran todos los pasos para crear el nodo controlador “control-plane”, a continuación se presenta una tabla con los datos necesarios para crear las otras máquinas “worker-nodes”
- Haga clic en el menú hamburguesa y luego haga clic en “Compute > Instances”.

- Haga clic en “Instances” y elija el compartimento correcto, es decir, el compartimento creado en esta guía en las secciones superiores..

- Haga clic en “Create Instance”

- A continuación se presentan las opciones usadas en esta guía para el nodo controlador control-plane.
Nombre y compartimento.
Imagen y caracteristicas de la máquina virtual.
Red
Por favor no olvide guardar su llave privada private key.
Haga clic en “Create”.
El proceso usado para crear los nodos encargados de correr los procesos “worker-nodes” es el mismo. Por ende, la siguiente tabla resume este proceso.
| Instance name | Compartment | Image | Shape OCPUs | Shape memory | Networking VCN | Networking subnet | Networking public IPv4 address | SSH keys |
| Control-plane | cubeClusterCompartment | Canonical Ubuntu 22.04 | 2 | 12 GB | kubeclustervcn | public subnet- clustervcn | Yes | “Generate a key pair for me” Save the private key |
| Worker-01 | cubeClusterCompartment | Canonical Ubuntu 22.04 | 1 | 6 GB | kubeclustervcn | public subnet- clustervcn | Yes | “Generate a key pair for me” Save the private key |
| Worker-02 | cubeClusterCompartment | Canonical Ubuntu 22.04 | 1 | 6 GB | kubeclustervcn | public subnet- clustervcn | Yes | “Generate a key pair for me” Save the private key |
Instalando kubeadm, kebeles y kubectl (todos los nodos)
Ejecutar los siguientes comandos en el nodo controlador control-planey en los nodos conocidos como worker-nodes.
- Actualizar la base de datos de paquetes disponibles para Ubuntu e instalar los paquetes necesarios para usar el repositorio de Kubernetes, Kubernetes apt repository.
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
- Descargar la llave pública de Google Cloud, Google Cloud public signing key.
curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg
- Añadir el repositorio de Kubernetes.
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
- Ejecute los comandos mostrados a continuación.
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
Fuente: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
Instalando una interface de ejecución de contenedores, Container Runtime Interface (CRI) (todos los nodos)
En este caso instalará containerd
Configurando el reenvío de IPv4 y configurando iptables con tráfico puente bridged traffic
Fuente: https://kubernetes.io/docs/setup/production-environment/container-runtimes/
- Ejecutar la configuración tal como se indica en las siguientes líneas.
cat<<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# sysctl params required by setup, params persist across reboots
sudo cat<<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# Apply sysctl params without reboot
sudo sysctl –system
- Verificar que br_netfilter y los módulos superpuestos hayan sido cargados.
lsmod | grep br_netfilter
lsmod | grep overlay
- Verificar que las variables de sistema net.bridge.bridge-nf-call-iptables, net.bridge.bridge-nf-call-ip6tables y net.ipv4.ip_forward hayan sido activadas.
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward
Instalando containerd
Fuente: https://github.com/containerd/containerd/blob/main/docs/getting-started.md
- Obtenga los binarios oficiales de acuerdo a la distribución de Linux y a la arquitectua de computadoras usada.
wget https://github.com/containerd/containerd/releases/download/v1.7.2/containerd-1.7.2-linux-arm64.tar.gz
- Desempaquete el binario.
sudo tar Cxzvf /usr/local containerd-1.7.2-linux-arm64.tar.gz
- Configure el servicio containerd.service.
wget https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
sudo cp containerd.service /lib/systemd/system/containerd.service
sudo systemctl daemon-reload
sudo systemctl enable --now containerd
- Revise el estado del servicio containerd.service.
systemctl status containerd.service
Instalando runc
Fuente: https://github.com/containerd/containerd/blob/main/docs/getting-started.md
Obtenga los binarios oficiales de acuerdo a la distribución de Linux y a la arquitectua de computadoras usada; luego proceda con la instalación tal y como es indicado en las siguientes líneas.
wget https://github.com/opencontainers/runc/releases/download/v1.1.8/runc.arm64
sudo install -m 755 runc.arm64 /usr/local/sbin/runc

Instalando CNI plugins
Fuente: https://github.com/containerd/containerd/blob/main/docs/getting-started.md
Obtenga los binarios oficiales de acuerdo a la distribución de Linux y a la arquitectua de computadoras usada; proceda con la instalación tal y como es indicado en las siguientes líneas.
wget https://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-plugins-linux-arm-v1.3.0.tgz
sudo mkdir -p /opt/cni/bin
sudo tar Cxzvf /opt/cni/bin cni-plugins-linux-arm-v1.3.0.tgz

Usted debería obtener un resultado como este.

Creando el archivo /etc/containerd/config.toml
Fuente: https://github.com/containerd/containerd/blob/main/docs/getting-started.md
Ejecute los comandos para crear el archivo “config.toml” con los valores predeterminados.
sudo mkdir /etc/containerd/
sudo su -
containerd config default > /etc/containerd/config.toml

Configure el controlador de cgroup para systemd
Fuente: https://kubernetes.io/docs/setup/production-environment/container-runtimes/#containerd
Para usar el controlador de cgroup para systemd in /etc/containerd/config.toml con runc, siga las instrucciones.
sudo vi /etc/containerd/config.toml
Ahora configure SystemdCgroup con el valor “true” tal y como se muestra a continuación.
[plugins.”io.containerd.grpc.v1.cri”.containerd.runtimes.runc]
…
[plugins.”io.containerd.grpc.v1.cri”.containerd.runtimes.runc.options]
…
SystemdCgroup = true <——–

sudo systemctl restart containerdsudo systemctl restart kubelet

Inicialice el nodo controlador control-plane (sólo en el nodo controlador)
Este es el momento que hemos estado esperando.
- Ingrese al nodo controlador control-plane.
- Ejecute este comando.
sudo kubeadm init --v=5 - Si todo sale bien, debería ver un resultado como el que se muestra a continuación.

En la figura superior se aprecia que usted neceista deplegar una red para los Pods, pod network, esto se mostrará en las secciones que vienen a continuación.
Preparando el clúster para añadir nodos de procesamiento worker-nodes
Siga usted los pasos descritos a continuación.
Configurando la red virtual en la nube (VCN en OCI) para permitir el tráfico a través del puerto 6443
Esto es importante dado que los nodos worker-nodes contactarán al nodo controlador control-plane a través del puerto 6443.
- Vaya la consola de OCI.
- Haga clic en “Networking > Virtual cloud networks”.

- Haga clic en la VCN que configuramos para el cluster de Kubernetes.

- Haga clic en “Security Lists”.

- Escoja el security list por defecto (Default security list).

- Haga clic en “Add Ingress Rules”.

- Llene el formulario tal cual se muestra y haga clic en “Add Ingress Rules”

Configurando iptables para permitir el tráfico a través del puerto 6443 (nodo controlador control-plane node)
Esta configuración será deshecha automaticamente luego de reiniciar el nodo controlador control-plane lo cual no representa un problema porque sólo se necesita para hacer que los nodos de procesamiento worker-nodes se unan al clúster de Kubernetes.
Ejecute este comando.
sudo iptables -I INPUT -p tcp -m state --state NEW,ESTABLISHED -m tcp --dport 6443 -m comment --comment "Required for Kubernetes." -j ACCEPT

Añadiendo nodos de procesamiento worker nodes a el clúster de Kubernetes
Siga estas instrucciones.
- Si usted pierde el token necesario para añadir worker-nodes, obtenga uno nuevo con este comando.
sudo kubeadm token create --print-join-command
- En el paso anterior se generó un comando de manera automática; ejecute dicho comando en cada worker-node, en el caso de esta guía tenemos dos worker-nodes.
sudo kubeadm join 10.0.0.228:6443 --token fvnkpq.5nuyu1o3064fryn4 --discovery-token-ca-cert-hash sha256:baffbdb7b6993bdc41384ca46053536e05b04e0359e8b8dac78a22e6a4422358 - Si todo está bien, usted debería ver un resultado similar a este.

Revisando los nodos y Pods con kubectl
- Vaya al nodo controlador control-plane y ejecute este comando.
sudo su - - Configure esta variable.
export KUBECONFIG=/etc/kubernetes/admin.conf - Ejecute este comando para revisar los nodos.
kubectl get nodes -o wide
- Ejecute este comando para revisar los Pods.
kubectl get pods -A -o wide
Conclusión
Esta guía está dirigida para aquellas personas que están dando sus primeros pasos en Kubernetes y necesitan un clúster. En esta guía hemos navegado a través del proceso de instalación de un clúster de Kubernetes el cual puede ser usado para realizar experimientos, para aprender más acerca de esta tecnología tan apasionante y en general para otros fines que el lector de esta guía considere conveniente. Espero que esta guía sea útil para que así pueda aprovechar al máximo el poder de los contenedores y de Kubernetes.
Al escribir esta guía he decido no usar configuración como código dado que como parte del aprendizaje preferí ir a través de cada paso de tal forma que usted se familiarice con Kubernetes.
¡Felicitaciones! Espero que al llegar a este punto, usted cuente con un clúster de Kubernetes.