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
- Asegurarse de estar en el servidor
bastioncon el usuariostudentstudent@lab-0-bastion:~> - Ingresar como usuario administrador al cluster de Kubernetes con el siguiente comando:
export KUBECONFIG=/home/student/rke2_conn/cluster1/cluster1_kubeconfig.yaml - Crear un nuevo namespace llamado example-secrets
kubectl create ns example-secrets - Establecer el nuevo namespace por defecto en el contexto actual:
kubectl config set-context --current --namespace=example-secrets - Crea un
Secretque almacene una contraseña de forma segura. Usa el siguiente comando:Esto crea unkubectl create secret generic db-credentials \ --from-literal=DB_PASSWORD=supersecretpasswordSecretllamadodb-credentialsque contiene la contraseñaDB_PASSWORD. - Verifica que el Secret fue creado correctamente:
La contraseña estará codificada en Base64 en el campo data:
kubectl get secret db-credentials -o yamlapiVersion: 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 - Crea un Deployment que use el
Secretcomo una variable de entorno. Guarda el siguiente manifiestoYAMLen un archivo llamadodeployment-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 - Aplica el manifiesto:
kubectl apply -f deployment-secret.yaml - Verificar el Uso del Secret
Primero, identifica el nombre del Pod:
kubectl get pods -l app=example-secret - Luego, accede al contenedor y verifica que la contraseña se muestra correctamente:
Deberías ver
kubectl exec -it <pod-name> -- sh -c 'echo $DB_PASSWORD'supersecretpassworden la salida.
Laboratorio: Usar un Secret para un Certificado TLS
- Verificar el Wildcard Domain para las aplicaciones correspondiente a su laboratorio en el archivo
CSVde inventario que le fue entregado, por ejemplo:apps.lab-0.mx-g05.ws.itmlabs.ioy a continuación incorporarlo a la variableCLUSTER_WILDCARD:export CLUSTER_WILDCARD=apps.lab-0.mx-g05.ws.itmlabs.io - Comprobar el contenido de la variable:
echo $CLUSTER_WILDCARD - Genera un certificado TLS y una clave privada en una sola línea:
Esto genera: tls.key: Clave privada. tls.crt: Certificado.
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout tls.key -out tls.crt -subj "/CN=secret-tls.$CLUSTER_WILDCARD" - Crea un Secret de tipo TLS con el certificado y la clave:
kubectl create secret tls tls-secret \ --cert=tls.crt --key=tls.key - Verifica que el Secret fue creado correctamente:
El Secret incluirá el certificado y la clave codificados en Base64:
kubectl get secret tls-secret -o yamlapiVersion: v1 kind: Secret metadata: name: tls-secret type: kubernetes.io/tls data: tls.crt: <certificado codificado en Base64> tls.key: <clave codificada en Base64> - Crea un recurso Ingress que utilice el Secret TLS para exponer un servicio.
Primero, crea un servicio simple:
kubectl create deployment web --image=nginxkubectl expose deployment web --port=80 --target-port=80 --type=ClusterIP - Luego, guarda el siguiente manifiesto
YAMLen un archivo llamadoingress-tls.yaml, asegurarse de actualizar los valores dehostscorrespondientes 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 - Aplica el manifiesto:
kubectl apply -f ingress-tls.yaml - Asegúrate de que el Ingress está funcionando:
kubectl get ingress example-ingress - 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 - 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. - Elimina todos los recursos creados:
kubectl delete deployment example-deployment-secret webkubectl delete service webkubectl delete ingress example-ingresskubectl delete secret db-credentials tls-secretrm -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.