☸️ Kubernetes Cheatsheet Completo ☸️

Kubernetes (K8s) es una plataforma portable y extensible de código abierto para gestionar cargas de trabajo y servicios en contenedores. Facilita la configuración declarativa y la automatización.


1. 🌟 Conceptos Clave


2. 🛠️ Configuración Inicial

  1. Instalar kubectl: Sigue la guía oficial para tu sistema operativo.
  2. Configurar Acceso al Clúster: kubectl usa un archivo de configuración (~/.kube/config) para conectarse a los clústeres.
    • Para clústeres locales (ej. Minikube, Docker Desktop Kubernetes): Generalmente se configura automáticamente.
    • Para clústeres en la nube (GKE, EKS, AKS): Usa las herramientas de la nube para generar el archivo de configuración.
  3. Verificar Conexión al Clúster:
    kubectl cluster-info
    kubectl get nodes # Lista los nodos en el clúster

3. 📄 Objetos de Kubernetes (YAML)

Kubernetes se gestiona declarativamente usando archivos YAML (o JSON).

3.1. Estructura Básica de un Objeto K8s

apiVersion: v1 # La versión de la API de Kubernetes (ej. v1, apps/v1, networking.k8s.io/v1)
kind: Pod    # El tipo de objeto que estamos creando
metadata:    # Metadatos sobre el objeto
  name: my-pod       # Nombre único del objeto
  labels:            # Etiquetas clave-valor para organizar y seleccionar objetos
    app: my-app
    tier: frontend
spec:        # La especificación deseada para el objeto
  # ... contenido específico del tipo de objeto (ej. contenedores para un Pod)

3.2. Pod

La unidad más pequeña de despliegue.

# my-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: my-nginx-pod
  labels:
    app: web
spec:
  containers: # Lista de contenedores en este Pod
    - name: nginx-container # Nombre del contenedor
      image: nginx:latest   # Imagen Docker a usar
      ports:
        - containerPort: 80 # Puerto que expone el contenedor
      env: # Variables de entorno
        - name: MY_ENV_VAR
          value: "Hello"
      resources: # Límites y solicitudes de recursos
        requests:
          memory: "64Mi"
          cpu: "250m" # 250 milicpu = 0.25 vCPU
        limits:
          memory: "128Mi"
          cpu: "500m"
      livenessProbe: # Comprueba si el contenedor está vivo
        httpGet:
          path: /
          port: 80
        initialDelaySeconds: 5
        periodSeconds: 5
      readinessProbe: # Comprueba si el contenedor está listo para servir tráfico
        httpGet:
          path: /
          port: 80
        initialDelaySeconds: 5
        periodSeconds: 5

3.3. Deployment

Controlador para gestionar réplicas de Pods y actualizaciones.

# my-deployment.yaml
apiVersion: apps/v1 # API para Deployments
kind: Deployment
metadata:
  name: my-web-app-deployment
  labels:
    app: my-web-app
spec:
  replicas: 3 # Número deseado de Pods (réplicas)
  selector:   # Cómo el Deployment encuentra los Pods que gestiona
    matchLabels:
      app: my-web-app # Debe coincidir con los labels del template del Pod
  template:   # Plantilla para crear Pods
    metadata:
      labels:
        app: my-web-app
    spec:
      containers:
        - name: web-container
          image: nginx:1.21.6 # Usa una versión específica de la imagen
          ports:
            - containerPort: 80
  strategy: # Estrategia de actualización (default: RollingUpdate)
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1 # Cuántos Pods se pueden crear por encima de las réplicas deseadas
      maxUnavailable: 1 # Cuántos Pods pueden estar no disponibles durante la actualización

3.4. Service

Abstracción para exponer un conjunto de Pods como un servicio de red.

# my-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: my-web-app-service
spec:
  selector: # Selecciona los Pods a los que enviar tráfico (coincide con labels de Pods)
    app: my-web-app
  ports:
    - protocol: TCP
      port: 80        # Puerto que el Service expone
      targetPort: 80  # Puerto del contenedor al que el Service envía tráfico
      # nodePort: 30080 # Para NodePort, opcional
  type: ClusterIP   # Tipo de Service (default: ClusterIP)
  # Tipos de Service:
  # - ClusterIP: Solo accesible desde el clúster (default).
  # - NodePort: Expone el Service en un puerto estático en cada Nodo. Accesible desde fuera del clúster.
  # - LoadBalancer: Expone el Service externamente usando el balanceador de carga del proveedor de nube.
  # - ExternalName: Mapea el Service a un CNAME.

3.5. ConfigMap / Secret

Para inyectar datos de configuración o secretos en los Pods.

# my-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-app-config
data: # Datos en formato clave-valor
  config_file.properties: | # Multilínea
    key1=value1
    key2=value2
  database_url: "jdbc:postgresql://mydb:5432/myapp"

4. 🚀 Comandos kubectl Comunes

4.1. Ver Información

4.2. Crear, Aplicar, Actualizar y Eliminar

4.3. Escalado

4.4. Rollouts (Despliegues)

4.5. Configuración de Contexto


5. 🌐 Networking Avanzado

5.1. Ingress

Expone Servicios HTTP/HTTPS a clientes externos, proporcionando enrutamiento basado en host o path. Requiere un Ingress Controller (ej. Nginx Ingress Controller, Traefik).

# my-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app-ingress
  annotations: # Anotaciones específicas del Ingress Controller
    nginx.ingress.kubernetes.io/rewrite-target: / # Ejemplo Nginx
spec:
  rules:
    - host: myapp.example.com # Enrutamiento basado en host
      http:
        paths:
          - path: / # Coincide con la ruta raíz
            pathType: Prefix # O Exact
            backend:
              service:
                name: my-web-app-service # El Service a enlazar
                port:
                  number: 80 # Puerto del Service
    - http: # Enrutamiento basado en path (sin host específico)
        paths:
          - path: /api/v1
            pathType: Prefix
            backend:
              service:
                name: my-api-service
                port:
                  number: 8080
  tls: # Configuración TLS/SSL (requiere un Secret con certificado)
    - hosts:
        - myapp.example.com
      secretName: myapp-tls-secret

5.2. NetworkPolicy

Define reglas de firewall para controlar el flujo de tráfico entre Pods, Namespaces y IPs externas.

# my-network-policy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend-to-backend
  namespace: default
spec:
  podSelector: # Pods a los que se aplica la política
    matchLabels:
      app: backend
  policyTypes:
    - Ingress # Reglas de entrada
    - Egress # Reglas de salida
  ingress: # Permitir entrada a Pods de backend desde Pods de frontend
    - from:
        - podSelector: # Pods de frontend en el mismo Namespace
            matchLabels:
              app: frontend
      ports:
        - protocol: TCP
          port: 8080 # Puerto que el backend expone
  egress: # Permitir salida a IPs externas
    - to:
        - ipBlock:
            cidr: 0.0.0.0/0 # Cualquier IP externa
      ports:
        - protocol: TCP
          port: 443 # Solo tráfico HTTPS

6. 💾 Almacenamiento (Storage)

Para la persistencia de datos más allá del ciclo de vida del Pod.

type: Opaque # Tipo de secreto (default: Opaque, otros: kubernetes.io/dockerconfigjson, etc.)
data:
  username: dXNlcm5hbWU= # 'username' base64-encoded
  password: cGFzc3dvcmQ= # 'password' base64-encoded
# my-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-app-pvc
spec:
  accessModes: # Modos de acceso
    - ReadWriteOnce # Se puede montar como lectura-escritura por un solo nodo
    # - ReadOnlyMany: montado como solo lectura por muchos nodos
    # - ReadWriteMany: montado como lectura-escritura por muchos nodos (depende del proveedor)
  resources:
    requests:
      storage: 1Gi # Solicita 1 Gigabyte de almacenamiento
  storageClassName: standard # Opcional: Nombre de la StorageClass

Para usar en un Pod/Deployment:
    ```yaml
    # En la especificación del Pod (template del Deployment)
    spec:
      volumes: # Define el volumen referenciando la PVC
        - name: my-storage
          persistentVolumeClaim:
            claimName: my-app-pvc
      containers:
        - name: my-container
          image: busybox
          command: ["sh", "-c", "echo 'Hello from volume' > /data/hello.txt && cat /data/hello.txt"]
          volumeMounts: # Monta el volumen dentro del contenedor
            - name: my-storage
              mountPath: "/data" # Ruta dentro del contenedor donde se montará el volumen```

7. 🔒 Seguridad (RBAC y Secrets)

7.1. RBAC (Role-Based Access Control)

Controla quién puede hacer qué en tu clúster.

# my-serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-app-sa

# my-role.yaml (en un Namespace específico)
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: pod-reader
rules:
  - apiGroups: [""] # "" indica el core API group
    resources: ["pods", "pods/log"]
    verbs: ["get", "watch", "list"]

# my-rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods-binding
  namespace: default
subjects:
  - kind: ServiceAccount
    name: my-app-sa
    namespace: default
roleRef: # Referencia al Role o ClusterRole
  kind: Role # Debe ser Role para RoleBinding
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

7.2. Secrets (Revisado)

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

# En un Pod/Deployment spec
spec:
  containers:
    - name: my-secure-app
      image: my-app-image
      env: # Inyectar como variables de entorno
        - name: DB_USERNAME
          valueFrom:
            secretKeyRef:
              name: my-db-secret # Nombre del Secret
              key: username      # Clave dentro del Secret
      volumeMounts: # Montar como archivos
        - name: db-credentials
          mountPath: "/etc/secrets"
          readOnly: true
  volumes:
    - name: db-credentials
      secret:
        secretName: my-db-secret

8. 💡 Buenas Prácticas y Consejos


Este cheatsheet te proporciona una referencia completa de Kubernetes, cubriendo sus conceptos esenciales, objetos, comandos kubectl, networking, almacenamiento, seguridad y las mejores prácticas para construir y gestionar aplicaciones en contenedores a escala.