Bitácora MKTECH Kubernetes PoC

Introducción

Kubernetes

Kubernetes es una plataforma de código abierto diseñada para automatizar el despliegue, la escalabilidad y la gestión de aplicaciones en contenedores. Aquí tienes un resumen:

En resumen, Kubernetes facilita la administración de aplicaciones en contenedores, permitiendo a los desarrolladores y operadores enfocarse en la lógica de la aplicación sin preocuparse por la infraestructura subyacente.

CRI-O

CRI-O es un proyecto de código abierto diseñado para proporcionar una implementación ligera de la interfaz de tiempo de ejecución de contenedores (Container Runtime Interface CRI) para Kubernetes. Aquí tienes un resumen:

En resumen, CRI-O es una solución eficiente y optimizada para ejecutar contenedores en Kubernetes, proporcionando una interfaz estándar y ligera compatible con los estándares de contenedores OCI.

Guía

Kubernetes and CRI-O

Kubernetes con un servidor master y dos servidores workers configurado para usar CRI-O en sistemas operativos RHEL 8.9.

Prerrequisitos

Configurar Kubernetes para usar NFS como almacenamiento persistente

Crear un Persistent Volume (PV): Debes crear un recurso Persistent Volume en Kubernetes que apunte a tu servidor NFS. Aquí tienes un ejemplo de un archivo de configuración para un PV:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
  labels:
    type: nfs
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs
  nfs:
    path: /var/nfs/general
    server: 192.168.1.10 # Asegúrate de reemplazar esto con la IP de tu servidor NFS

Crear un Persistent Volume Claim (PVC): Los pods en Kubernetes usan PVCs para solicitar almacenamiento físico. Aquí tienes un ejemplo de un PVC que corresponde al PV anterior:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  resources:
    requests:
      storage: 10Gi

Usar el PVC en un pod: Finalmente puedes montar este volumen en un pod especificando el PVC en la configuración del pod:

apiVersion: v1
kind: Pod
metadata:
  name: nfs-pod
spec:
  containers:
    - name: app
      image: myapp:latest
      volumeMounts:
      - mountPath: "/data"
        name: nfs-storage
  volumes:
    - name: nfs-storage
      persistentVolumeClaim:
        claimName: nfs-pvc

Estos pasos te permitirán configurar un servidor NFS en Red Hat 8.9 y usarlo como solución de almacenamiento persistente en un clúster de Kubernetes. Asegúrate de ajustar los ejemplos a tus necesidades específicas como la capacidad de almacenamiento y las direcciones IP.

System Configs

Environment

Server: lg-mps01 (MASTER)

# echo 'export HISTTIMEFORMAT="%F %T "' >> /etc/bashrc
# su -
...

Server: lg-mps02 (Worker 1)

# echo 'export HISTTIMEFORMAT="%F %T "' >> /etc/bashrc
# su -
...

Server: lg-mps03 (Worker 2)

# echo 'export HISTTIMEFORMAT="%F %T "' >> /etc/bashrc
# su -
...

Exec/Probe of Concept

Paso 1: Configurar Repositorios de Kubernetes y CRI-O

Agregar repositorio de CRI-O:

sudo curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo \ https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/CentOS_8_Stream/devel:kubic:libcontainers:stable.repo

Agregar repositorio de Kubernetes:

cat <

Paso 2: Instalar CRI-O

Instalar CRI-O:

sudo dnf install -y cri-o

Habilitar y arrancar CRI-O:

sudo systemctl enable crio
sudo systemctl start crio

Paso 3: Instalar Kubernetes (kubeadm kubelet y kubectl)

Instalar kubeadm kubelet y kubectl:

sudo dnf install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

Habilitar y arrancar kubelet:

sudo systemctl enable kubelet
sudo systemctl start kubelet

Paso 4: Configurar el Master Node

Inicializar el cluster de Kubernetes:

sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --cri-socket=unix:///var/run/crio/crio.sock --apiserver-advertise-address=172.30.218.70

Configurar kubectl para el usuario no root:

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

Instalar el plugin de red (Flannel en este caso):

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

Guardar el comando kubeadm join (producido al finalizar kubeadm init) para usarlo en los nodos workers. El comando tiene este formato:

kubeadm join 172.30.218.70:6443 --token  --discovery-token-ca-cert-hash sha256: --cri-socket=unix:///var/run/crio/crio.sock

Paso 5: Configurar los Worker Nodes (172.30.218.71 y 172.30.218.72)

Ejecutar el comando kubeadm join en cada worker node:

sudo kubeadm join 172.30.218.70:6443 --token  --discovery-token-ca-cert-hash sha256: --cri-socket=unix:///var/run/crio/crio.sock

Paso 6: Verificar la Configuración

En el master node verificar que los nodos se hayan unido correctamente:

kubectl get nodes

Paso 7: Configurar el Firewall (opcional pero recomendado)

En cada nodo abre los puertos necesarios para Kubernetes y CRI-O:

sudo firewall-cmd --permanent --add-port=6443/tcp
sudo firewall-cmd --permanent --add-port=2379-2380/tcp
sudo firewall-cmd --permanent --add-port=10250/tcp
sudo firewall-cmd --permanent --add-port=10251/tcp
sudo firewall-cmd --permanent --add-port=10252/tcp
sudo firewall-cmd --permanent --add-port=10255/tcp
sudo firewall-cmd --permanent --add-port=8472/udp
sudo firewall-cmd --permanent --add-port=179/tcp
sudo firewall-cmd --permanent --add-port=4789/udp
sudo firewall-cmd --reload

Paso 8: Habilitar el Forwarding de IP

En cada nodo asegúrate de que el forwarding de IP esté habilitado:

sudo sysctl net.bridge.bridge-nf-call-iptables=1
sudo sysctl net.ipv4.ip_forward=1

Añadir las configuraciones a /etc/sysctl.d/k8s.conf:

echo "net.bridge.bridge-nf-call-iptables = 1" | sudo tee -a /etc/sysctl.d/k8s.conf
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.d/k8s.conf
sudo sysctl --system

Kubernetes Dashboard (with helm)

Install Helm:

curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

Install Helm Repo for Kubernetes Dashboard:

helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/

Update Helm Repo:

helm repo update

Install Dashboard:

helm install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --namespace kubernetes-dashboard --create-namespace

Create administrator user:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended.yaml

Get access token:

kubectl -n kubernetes-dashboard create token admin-user

Access:

https://: