¿Qué es un Secret en Kubernetes?
Un Secret es un objeto de Kubernetes que almacena información sensible como:
- Contraseñas
- Tokens de acceso
- Certificados TLS
- Claves privadas
- Credenciales de conexión a bases de datos o APIs
La idea es no poner información confidencial en los YAML de ConfigMaps o en el código de la aplicación, sino mantenerla en un objeto dedicado que Kubernetes gestiona.
🔹 ¿Dónde y cuándo se deben usar?
👉 Casos recomendados:
- Guardar credenciales de base de datos (usuario y contraseña).
- Tokens de API externas (por ejemplo, GitHub, AWS, GCP).
- Certificados SSL/TLS.
- Credenciales de repositorios privados de imágenes Docker (
imagePullSecrets
). - Claves privadas usadas por aplicaciones.
👉 Casos no recomendados:
- Configuración que no sea sensible → mejor usar ConfigMaps.
- Información que debe estar cifrada de extremo a extremo → usar KMS (Key Management System) con Encryption at Rest en Kubernetes.
Creando Secret
1️⃣ Creando secretes de forma literal
kubectl create secret generic dev-db-secret --from-literal=username=devuser --from-literal=password='S\!B*d$zDsb'
Respuesta: secret/dev-db-secret created
2️⃣ Creando un Secret Usando kubectl create Secret
Crearemos un directorio llamado 📁 secret
en donde vamos a ejecutar los siguiente:
echo -n 'admin' > ./username.txt
echo -n '1f2d1e2e67df' > ./password.txt
Deberá quedar de la siguiente forma:
kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt
Respuesta: secret/db-user-pass created
3️⃣ Creando un Secret Manualmente
Ingresamos por una terminal bash, la misma que se usa en git
echo -n 'admin' | base64
Respuesta: YWRtaW4=
echo -n '1f2d1e2e67df' | base64
Respuesta: MWYyZDFlMmU2N2Rm
Procedemos a crear el archivo secret.yaml donde crearemos el secret con nombre secret-yaml:
apiVersion: v1
kind: Secret
metadata:
name: secret-yaml
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
Aplicamos los cambios
kubectl apply -f secret.yaml
Respuesta: secret "secret-yaml" created
Comandos para gestionar Secrets
1️⃣ Listar Secrets
kubectl get secrets
Respuesta
NAME TYPE DATA AGE
db-user-pass Opaque 2 2d4h
dev-db-secret Opaque 2 2d3h
2️⃣ Ver contenido de un Secret
⚠️ Por seguridad, Kubernetes guarda los valores en Base64.
kubectl get secret dev-db-secret -o yaml
Respuesta
data:
password: U1whQipkJHpEc2I=
username: ZGV2dXNlcg==
kind: Secret
metadata:
creationTimestamp: "2025-08-20T15:28:46Z"
name: dev-db-secret
namespace: default
resourceVersion: "213116"
uid: 09433b27-81a6-4f3a-bed2-dd23cea54435
type: Opaque
kubectl get secret dev-db-secret -o jsonpath='{.data.username}' | base64 -d
Respuesta: devuser
3️⃣ Editar un Secret
kubectl edit secret dev-db-secret
Respuesta: Edit cancelled, no changes made.
4️⃣ Eliminar Secret
kubectl delete secret mysecret
Respuesta: secret "mysecret" deleted
5️⃣ Exportar / Backup de Secrets
kubectl get secret dev-db-secret -o yaml > mi-secret.yaml
Los valores seguirán en Base64
Ejemplo de uso de un Secret
Imagina que tenemos un usuario y un password para una base de datos.
kubectl create secret generic db-secret --from-literal=DB_USER=admin --from-literal=DB_PASSWORD=123456
Esto crea un Secret llamado db-secret con dos claves:
- DB_USER=admin
- DB_PASSWORD=123456
Procedemos a crear el pod con nombre 📃 secret-pod
con el archivo pod-secret.yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-pod
spec:
containers:
- name: demo
image: busybox
command: ["sh", "-c", "echo DB_USER=$DB_USER && echo DB_PASSWORD=$DB_PASSWORD && sleep 3600"]
env:
- name: DB_USER
valueFrom:
secretKeyRef:
name: db-secret
key: DB_USER
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: DB_PASSWORD
Aplicamos los cambios
kubectl apply -f pod-secret.yaml
Luego procedemos a ver los cambios del contenedor
kubectl logs secret-pod
Respuesta
DB_USER=admin
DB_PASSWORD=123456