ConfigMaps, Secrets y Volumes
En Kubernetes, la configuracion y los datos persistentes se manejan con recursos dedicados:
• ConfigMap: Almacena configuracion no sensible (variables de entorno, archivos de config). Se puede montar como archivo o inyectar como variable. • Secret: Similar a ConfigMap pero para datos sensibles (passwords, API keys, certificados). Se almacena codificado en base64 (no es encriptacion real sin configuracion extra). • PersistentVolume (PV): Almacenamiento real provisionado por el admin o el cloud provider. • PersistentVolumeClaim (PVC): Solicitud de almacenamiento por parte de un pod. K8s busca un PV que cumpla los requisitos. • StorageClass: Define tipos de almacenamiento disponibles (SSD, HDD, etc). Permite provisionar PVs automaticamente.
# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
DATABASE_HOST: "postgres-service"
DATABASE_PORT: "5432"
LOG_LEVEL: "info"
nginx.conf: |
server {
listen 80;
location / {
proxy_pass http://api-service:3000;
}
}
---
# secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: app-secrets
type: Opaque
stringData: # stringData acepta texto plano (K8s lo codifica)
DATABASE_PASSWORD: "super-secreto-123"
JWT_SECRET: "mi-jwt-key-segura"
API_KEY: "sk-abc123def456"
# deployment con ConfigMap y Secret
apiVersion: apps/v1
kind: Deployment
metadata:
name: mi-app
spec:
replicas: 2
selector:
matchLabels:
app: mi-app
template:
metadata:
labels:
app: mi-app
spec:
containers:
- name: api
image: mi-app:1.0
envFrom:
- configMapRef:
name: app-config # inyecta TODAS las keys como env vars
- secretRef:
name: app-secrets # inyecta secrets como env vars
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/conf.d
volumes:
- name: nginx-config
configMap:
name: app-config
items:
- key: nginx.conf
path: default.conf
# persistent-volume-claim.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-pvc
spec:
accessModes:
- ReadWriteOnce # un solo nodo puede leer/escribir
storageClassName: standard
resources:
requests:
storage: 10Gi
---
# Deployment de Postgres con volumen persistente
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres
spec:
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:16-alpine
env:
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: app-secrets
key: DATABASE_PASSWORD
volumeMounts:
- name: pg-storage
mountPath: /var/lib/postgresql/data
volumes:
- name: pg-storage
persistentVolumeClaim:
claimName: postgres-pvc
# Comandos para ConfigMaps, Secrets y Volumes
# Crear ConfigMap desde literal
kubectl create configmap app-config --from-literal=LOG_LEVEL=info
# Crear ConfigMap desde archivo
kubectl create configmap nginx-conf --from-file=nginx.conf
# Crear Secret desde literal
kubectl create secret generic app-secrets \
--from-literal=DB_PASS=secreto123
# Ver ConfigMaps y Secrets
kubectl get configmaps
kubectl get secrets
kubectl describe configmap app-config
# Ver el valor de un secret (esta en base64)
kubectl get secret app-secrets -o jsonpath="{.data.DB_PASS}" | base64 -d
# Ver PersistentVolumeClaims
kubectl get pvc
kubectl get pv
Practica esta lección
Resuelve los ejercicios del curso de Docker & Kubernetes en la app, gratis y con corrección automática.
Empezar a practicar