Skip to content

Tema:

Secrets en Kubernetes


Introducción

Los Secrets en Kubernetes son recursos esenciales para almacenar y gestionar información sensible, como contraseñas, claves SSH y certificados TLS, de forma segura dentro de un clúster. Al desacoplar las credenciales y otros datos confidenciales del código fuente, los Secrets permiten implementar buenas prácticas de seguridad y flexibilidad en el despliegue de aplicaciones. Este laboratorio proporcionará una guía paso a paso para crear y utilizar Secrets en escenarios prácticos.


Objetivo

Objetivo General:

  • El objetivo de este laboratorio es familiarizar a los participantes con el uso de Secrets en Kubernetes, permitiéndoles: Almacenar y manejar contraseñas de manera segura utilizando Secrets y acceder a ellas desde un Deployment, por otra parte Crear y gestionar certificados TLS mediante Secrets para asegurar la comunicación en un recurso Ingress.

Laboratorio: Usar un Secret para Contraseña

  1. Asegurarse de estar en el servidor bastion con el usuario student
    student@lab-0-bastion:~>
    
  2. Ingresar como usuario administrador al cluster de Kubernetes con el siguiente comando:
    export KUBECONFIG=/home/student/rke2_conn/cluster1/cluster1_kubeconfig.yaml
    
  3. Crear un nuevo namespace llamado example-secrets
    kubectl create ns example-secrets
    
  4. Establecer el nuevo namespace por defecto en el contexto actual:
    kubectl config set-context --current --namespace=example-secrets
    
  5. Crea un Secret que almacene una contraseña de forma segura. Usa el siguiente comando:
    kubectl create secret generic db-credentials \
      --from-literal=DB_PASSWORD=supersecretpassword
    
    Esto crea un Secret llamado db-credentials que contiene la contraseña DB_PASSWORD.
  6. Verifica que el Secret fue creado correctamente:
    kubectl get secret db-credentials -o yaml
    
    La contraseña estará codificada en Base64 en el campo data:
    apiVersion: v1
    data:
      DB_PASSWORD: c3VwZXJzZWNyZXRwYXNzd29yZA==
    kind: Secret
    metadata:
      creationTimestamp: "2025-01-16T05:24:17Z"
      name: db-credentials
      namespace: example-secrets
      resourceVersion: "107354"
      uid: 02bb2796-7b2a-4682-b4d9-91c3769ab0dc
    type: Opaque
    
  7. Crea un Deployment que use el Secret como una variable de entorno. Guarda el siguiente manifiesto YAML en un archivo llamado deployment-secret.yaml:
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: example-deployment-secret
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: example-secret
      template:
        metadata:
          labels:
            app: example-secret
        spec:
          containers:
          - name: example-container
            image: busybox
            command: ["sh", "-c", "echo $DB_PASSWORD; sleep 3600"]
            env:
            - name: DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: db-credentials
                  key: DB_PASSWORD
    
  8. Aplica el manifiesto:
    kubectl apply -f deployment-secret.yaml
    
  9. Verificar el Uso del Secret Primero, identifica el nombre del Pod:
    kubectl get pods -l app=example-secret
    
  10. Luego, accede al contenedor y verifica que la contraseña se muestra correctamente:
    kubectl exec -it <pod-name> -- sh -c 'echo $DB_PASSWORD'
    
    Deberías ver supersecretpassword en la salida.

Laboratorio: Usar un Secret para un Certificado TLS

  1. Verificar el Wildcard Domain para las aplicaciones correspondiente a su laboratorio en el archivo CSV de inventario que le fue entregado, por ejemplo: apps.lab-0.mx-g05.ws.itmlabs.io y a continuación incorporarlo a la variable CLUSTER_WILDCARD:
    export CLUSTER_WILDCARD=apps.lab-0.mx-g05.ws.itmlabs.io
    
  2. Comprobar el contenido de la variable:
    echo $CLUSTER_WILDCARD
    
  3. Genera un certificado TLS y una clave privada en una sola línea:
    openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
      -keyout tls.key -out tls.crt -subj "/CN=secret-tls.$CLUSTER_WILDCARD"
    
    Esto genera: tls.key: Clave privada. tls.crt: Certificado.
  4. Crea un Secret de tipo TLS con el certificado y la clave:
    kubectl create secret tls tls-secret \
      --cert=tls.crt --key=tls.key
    
  5. Verifica que el Secret fue creado correctamente:
    kubectl get secret tls-secret -o yaml
    
    El Secret incluirá el certificado y la clave codificados en Base64:
    apiVersion: v1
    kind: Secret
    metadata:
      name: tls-secret
    type: kubernetes.io/tls
    data:
      tls.crt: <certificado codificado en Base64>
      tls.key: <clave codificada en Base64>
    
  6. Crea un recurso Ingress que utilice el Secret TLS para exponer un servicio. Primero, crea un servicio simple:
    kubectl create deployment web --image=nginx
    
    kubectl expose deployment web --port=80 --target-port=80 --type=ClusterIP
    
  7. Luego, guarda el siguiente manifiesto YAML en un archivo llamado ingress-tls.yaml, asegurarse de actualizar los valores de hosts correspondientes a su ambiente en este archivo:
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: example-ingress
      annotations:
        nginx.ingress.kubernetes.io/ssl-redirect: "true"
    spec:
      tls:
      - hosts:
        - secret-tls.apps.lab-0.mx-g05.ws.itmlabs.io
        secretName: tls-secret
      rules:
      - host: secret-tls.apps.lab-0.mx-g05.ws.itmlabs.io
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web
                port:
                  number: 80
    
  8. Aplica el manifiesto:
    kubectl apply -f ingress-tls.yaml
    
  9. Asegúrate de que el Ingress está funcionando:
    kubectl get ingress example-ingress
    
  10. Obtener la URL y abrir una nueva ventana del Navegador Web:
    echo https://secret-tls.$CLUSTER_WILDCARD
    
    # Reemplazar el valor de $CLUSTER_WILDCARD
    https://secret-tls.$CLUSTER_WILDCARD
    
  11. Deberá mostrarse la página de bienvenida de Nginx, puedes explorar el Certficado TLS.
    Welcome to nginx!
    
    If you see this page, the nginx web server is successfully installed and working. Further configuration is required.
    
    For online documentation and support please refer to nginx.org.
    Commercial support is available at nginx.com.
    
    Thank you for using nginx.
    
  12. Elimina todos los recursos creados:
    kubectl delete deployment example-deployment-secret web
    
    kubectl delete service web
    
    kubectl delete ingress example-ingress
    
    kubectl delete secret db-credentials tls-secret
    
    rm -f deployment-secret.yaml tls.key tls.crt ingress-tls.yaml
    

Conclusión

En este laboratorio, aprendiste a utilizar Secrets en Kubernetes para:

  • Manejar contraseñas de manera segura y pasarlas como variables de entorno a un contenedor.

  • Crear y usar un Secret para almacenar certificados TLS en un recurso Ingress.

Estas técnicas son fundamentales para manejar información sensible y mejorar la seguridad en aplicaciones desplegadas en Kubernetes.