Manual Completo de Kubernetes

1. Introducción a Kubernetes

Kubernetes (también conocido como K8s) es un sistema de orquestación de contenedores open-source para automatizar el despliegue, escalado y gestión de aplicaciones en contenedores.

Características principales:

2. Arquitectura de Kubernetes

Nodos Master (Plano de Control)

Nodos Worker

Componentes Add-ons

3. Conceptos Básicos

Pod

La unidad más pequeña en Kubernetes, que puede contener uno o más contenedores.

Deployment

Gestiona el ciclo de vida de los Pods y permite actualizaciones continuas.

Service

Abstracción que define un conjunto lógico de Pods y una política para acceder a ellos.

Namespace

Mecanismo para dividir recursos de un cluster entre múltiples usuarios.

ConfigMap y Secret

Almacenan configuración y datos sensibles respectivamente.

Volume

Permite persistir datos más allá del ciclo de vida de un Pod.

4. Instalación y Configuración

Minikube (para desarrollo local)

# Instalar Minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

# Iniciar cluster
minikube start --driver=docker

# Verificar instalación
kubectl get nodes

kubectl (CLI para Kubernetes)

# Instalar kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

# Verificar instalación
kubectl version --client

5. Comandos Básicos de kubectl

Comando Descripción
kubectl get <resource> Lista recursos (pods, services, etc.)
kubectl describe <resource> <name> Muestra detalles de un recurso
kubectl create -f archivo.yaml Crea recursos desde un archivo
kubectl apply -f archivo.yaml Aplica cambios a recursos
kubectl delete <resource> <name> Elimina un recurso
kubectl logs <pod> Muestra logs de un pod
kubectl exec -it <pod> -- /bin/bash Ejecuta un comando en un pod
kubectl port-forward <pod> 8080:80 Redirige puertos a un pod
kubectl rollout status deployment/<name> Muestra estado de un despliegue

6. Manifiestos YAML en Kubernetes

Estructura básica de un manifiesto

apiVersion: v1 # Versión de la API
kind: Pod      # Tipo de recurso
metadata:
  name: my-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx-container
    image: nginx:latest
    ports:
    - containerPort: 80

apiVersion comunes

7. Trabajando con Pods

Crear un Pod

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.19
    ports:
    - containerPort: 80

Comandos útiles

# Crear pod desde archivo YAML
kubectl apply -f nginx-pod.yaml

# Ver pods
kubectl get pods

# Ver detalles de un pod
kubectl describe pod nginx-pod

# Eliminar pod
kubectl delete pod nginx-pod

8. Deployments

Los Deployments gestionan el ciclo de vida de los Pods y permiten actualizaciones continuas.

Ejemplo de Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.19
        ports:
        - containerPort: 80

Gestionar Deployments

# Crear deployment
kubectl apply -f nginx-deployment.yaml

# Ver deployments
kubectl get deployments

# Escalar deployment
kubectl scale deployment nginx-deployment --replicas=5

# Actualizar imagen
kubectl set image deployment/nginx-deployment nginx=nginx:1.20

# Ver historial de actualizaciones
kubectl rollout history deployment/nginx-deployment

# Revertir a versión anterior
kubectl rollout undo deployment/nginx-deployment

9. Services

Los Services permiten exponer aplicaciones dentro y fuera del cluster.

Tipos de Services

Ejemplo de Service

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer

Comandos útiles

# Crear service
kubectl apply -f nginx-service.yaml

# Ver services
kubectl get services

# Exponer deployment temporalmente
kubectl expose deployment nginx-deployment --port=80 --type=NodePort

10. ConfigMaps y Secrets

ConfigMap

Para almacenar configuración no sensible.

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  APP_COLOR: blue
  APP_MODE: prod

Secret

Para almacenar información sensible (contraseñas, tokens, etc.).

apiVersion: v1
kind: Secret
metadata:
  name: app-secret
type: Opaque
data:
  DB_Password: cGFzc3dvcmQxMjM= # Base64 encoded

Usar en un Pod

spec:
  containers:
    - name: myapp
      image: myapp:1.0
      envFrom:
        - configMapRef:
            name: app-config
        - secretRef:
            name: app-secret

11. Volúmenes

Tipos de Volúmenes

Ejemplo de Volume

apiVersion: v1
kind: Pod
metadata:
  name: pod-with-volume
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: html-volume
      mountPath: /usr/share/nginx/html
  volumes:
  - name: html-volume
    hostPath:
      path: /data/html
      type: Directory

12. Namespaces

Los namespaces permiten dividir recursos en clusters compartidos.

Comandos básicos

# Listar namespaces
kubectl get namespaces

# Crear namespace
kubectl create namespace dev

# Especificar namespace en comandos
kubectl get pods --namespace=dev

# Cambiar namespace por defecto
kubectl config set-context --current --namespace=dev

Definir namespace en YAML

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx

13. Monitoreo y Depuración

Comandos útiles

# Ver logs de un pod
kubectl logs <pod-name>

# Ver logs de un contenedor específico
kubectl logs <pod-name> -c <container-name>

# Ver logs en tiempo real
kubectl logs -f <pod-name>

# Ejecutar comando en un pod
kubectl exec -it <pod-name> -- /bin/bash

# Ver métricas de recursos
kubectl top pods
kubectl top nodes

# Ver eventos del cluster
kubectl get events --sort-by='.metadata.creationTimestamp'

14. Ejemplo Completo: Aplicación Web

Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: webapp-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: webapp
  template:
    metadata:
      labels:
        app: webapp
    spec:
      containers:
      - name: webapp
        image: myapp:1.0
        ports:
        - containerPort: 8080
        envFrom:
        - configMapRef:
            name: webapp-config
        volumeMounts:
        - name: config-volume
          mountPath: /app/config
      volumes:
      - name: config-volume
        configMap:
          name: webapp-config

Service

apiVersion: v1
kind: Service
metadata:
  name: webapp-service
spec:
  selector:
    app: webapp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: LoadBalancer

15. Conclusión

Kubernetes es una plataforma poderosa para la orquestación de contenedores que ofrece:

Este manual cubre los conceptos fundamentales, pero Kubernetes tiene muchas más capacidades como:

Para aprender más, consulta la documentación oficial y explora los tutoriales disponibles.