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:
- Orquestación de Contenedores: Kubernetes ayuda a gestionar contenedores en un entorno de clúster, permitiendo que las aplicaciones se ejecuten de manera eficiente y escalable.
- Despliegue Automático: Facilita el despliegue automático de aplicaciones, actualizaciones y rollbacks, garantizando que el sistema esté siempre en un estado consistente.
- Escalabilidad: Permite escalar aplicaciones hacia arriba o hacia abajo automáticamente según la carga de trabajo. Puedes agregar o eliminar contenedores según sea necesario.
- Autorreparación: Kubernetes puede reiniciar contenedores que fallan, reemplazar contenedores y eliminar aquellos que no respondan a tus checks de salud y no los expone al tráfico de clientes hasta que estén listos para servir.
- Gestión de Configuración y Secretos: Proporciona herramientas para gestionar configuraciones y secretos de manera segura y eficiente, asegurando que la información sensible esté protegida.
- Balanceo de Carga: Distribuye el tráfico de red a través de los contenedores para asegurarse de que ninguna instancia esté sobrecargada.
- Persistencia de Almacenamiento: Ofrece soluciones para la gestión del almacenamiento persistente, permitiendo que los contenedores usen almacenamiento dinámico y persistente.
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:
- Tiempo de Ejecución de Contenedores: CRI-O es un tiempo de ejecución de contenedores que permite que Kubernetes use cualquier tiempo de ejecución compatible con la Open Container Initiative (OCI) para ejecutar contenedores.
- Interfaz de Contenedores (CRI): CRI-O implementa la interfaz CRI definida por Kubernetes, lo que permite que Kubernetes se comunique con diferentes tiempos de ejecución de contenedores de manera estándar.
- Compatibilidad con OCI: Al ser compatible con los estándares de OCI, CRI-O puede usar cualquier runtime que cumpla con las especificaciones OCI, como runc, que es el runtime por defecto utilizado por CRI-O.
- Ligero y Optimizado: CRI-O está diseñado para ser ligero y enfocado, proporcionando solo las funcionalidades necesarias para ejecutar contenedores en Kubernetes sin las características adicionales que pueden encontrarse en otros runtimes de contenedores más complejos.
- Integración Sencilla: Se integra de manera sencilla con Kubernetes, permitiendo una configuración y administración más simplificada del entorno de contenedores.
- Seguridad Mejorada: Al ser un runtime específico y minimalista, CRI-O puede ofrecer un menor superficie de ataque, mejorando la seguridad del entorno de contenedores.
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
- Acceso a los servidores con privilegios de administrador (root).
- Conectividad entre los servidores master y workers.
- Firewall configurado para permitir el tráfico necesario entre los nodos.
- Sincronización de tiempo entre los servidores (usualmente configurado con chrony o ntpd).
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://: