Secret en Kubernetes


En este post revisaremos los Secret en Kubernetes, como crearlos y usarlos en un pod

oscar Escrito por oscar 19 August 2025 4 0

¿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

Comentario

Debe aceptar antes de enviar