La correcta gestión de los archivos de configuración en Kubernetes es fundamental para mantener una infraestructura organizada, escalable y fácil de gestionar. A continuación, describimos varios de los archivos clave que puedes encontrar en una estructura común de Kubernetes, junto con su propósito, buenas prácticas, y ejemplos prácticos para cada uno.
Estructura Recomendada de Archivos
Una estructura clara y bien organizada facilita la gestión de los recursos de Kubernetes, especialmente en proyectos grandes o cuando trabajas en equipos. Una posible estructura de directorios para gestionar estos archivos es la siguiente:
└── k8s/ ├── deployments/ │ └── deployment.yaml ├── services/ │ └── service.yaml ├── hpa/ │ └── horizontalpodautoscaler.yaml ├── pvc/ │ └── persistentvolumeclaim.yaml ├── statefulset/ │ └── statefulset.yaml ├── configmaps/ │ └── configmap.yaml ├── secrets/ │ └── secret.yaml └── ingresses/ └── ingress.yaml
Esta organización asegura que cada tipo de recurso tenga su propio espacio, lo que hace que sea más fácil de mantener y entender.
Ejemplos de Archivos YAML en Kubernetes
1. Deployment
Propósito: Un Deployment define y gestiona la replicación de pods, asegurando que el número deseado de réplicas esté en ejecución en todo momento. También permite actualizaciones sin tiempo de inactividad, mediante la actualización controlada de las réplicas.
deployment.yaml:
apiVersion: apps/v1 kind: Deployment metadata: name: my-app-deployment labels: app: my-app spec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-app-container image: my-app-image:v1 ports: - containerPort: 80
Descripción: Este archivo configura un Deployment para una aplicación con tres réplicas, lo que garantiza que al menos tres pods de la aplicación estén siempre disponibles. El contenedor expone el puerto 80, lo cual es útil para la comunicación entre los contenedores y otros servicios.
2. Service
Propósito: El Service define cómo los pods pueden ser accedidos desde otros pods o desde el exterior del clúster. Proporciona una dirección IP estable y un nombre DNS para acceder a los pods, permitiendo la comunicación entre diferentes servicios dentro de Kubernetes.
service.yaml:
apiVersion: v1 kind: Service metadata: name: my-app-service spec: selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 8080 type: LoadBalancer
Descripción: Este archivo crea un servicio tipo LoadBalancer, que proporciona una dirección IP externa para acceder a la aplicación. El servicio redirige el tráfico del puerto 80 al puerto 8080 de los pods correspondientes.
3. HorizontalPodAutoscaler (HPA)
Propósito: El HorizontalPodAutoscaler ajusta el número de réplicas de un Deployment o StatefulSet en función de métricas como el uso de CPU o memoria, permitiendo que las aplicaciones escalen automáticamente según la demanda.
horizontalpodautoscaler.yaml:
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: my-app-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: my-app-deployment minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50
Descripción: Este archivo configura el autoscaling de la aplicación, asegurando que el número de réplicas se ajuste entre 2 y 10 dependiendo de la utilización promedio de la CPU. Si la carga aumenta, Kubernetes escala automáticamente los pods hacia arriba o abajo según la necesidad.
4. PersistentVolumeClaim (PVC)
Propósito: Un PersistentVolumeClaim (PVC) es utilizado para solicitar almacenamiento persistente en un clúster de Kubernetes. Es útil para aplicaciones que requieren que los datos se mantengan incluso después de que los pods sean eliminados o reiniciados.
persistentvolumeclaim.yaml:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-app-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi
Descripción: Este PVC solicita 10 GB de almacenamiento persistente con un acceso en modo ReadWriteOnce, lo que significa que solo un pod puede montar y acceder a este volumen al mismo tiempo. Esto es útil para bases de datos o aplicaciones que necesitan almacenamiento duradero.
5. StatefulSet
Propósito: A diferencia de los Deployments, los StatefulSets se utilizan para aplicaciones con estado, donde cada instancia necesita una identidad única y almacenamiento persistente. Es ideal para aplicaciones como bases de datos distribuidas o cachés.
statefulset.yaml:
apiVersion: apps/v1 kind: StatefulSet metadata: name: my-app-statefulset spec: serviceName: "my-app" replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-app-container image: my-app-image:v1 ports: - containerPort: 8080
Descripción: El StatefulSet asegura que cada réplica tenga un nombre estable y almacenamiento persistente. Esto es importante cuando se necesitan identificadores únicos para cada pod, como en el caso de bases de datos que requieren replicación.
6. ConfigMap
Propósito: El ConfigMap se utiliza para almacenar configuraciones no sensibles que los pods pueden consumir como variables de entorno o archivos. Permite separar las configuraciones de la aplicación del código de la misma.
configmap.yaml:
apiVersion: v1 kind: ConfigMap metadata: name: my-app-config data: DATABASE_URL: "mongodb://mydb:27017" REDIS_URL: "redis://myredis:6379"
Descripción: Este ConfigMap almacena las URLs de las bases de datos, que los pods pueden consumir como variables de entorno, lo que facilita la configuración y el mantenimiento sin tener que modificar el código fuente.
7. Secret
Propósito: Los Secrets permiten almacenar información sensible de forma segura, como contraseñas, claves de API o tokens. Kubernetes cifra automáticamente el contenido de estos objetos para proteger los datos sensibles.
secret.yaml:
apiVersion: v1 kind: Secret metadata: name: my-app-secret type: Opaque data: username: dXNlcm5hbWU= # base64 encoded password: cGFzc3dvcmQ= # base64 encoded
Descripción: Este archivo almacena un nombre de usuario y una contraseña en base64 para que los pods puedan acceder a estos secretos de manera segura. Es esencial para proteger información como credenciales y claves de acceso.
8. Ingress
Propósito: El Ingress gestiona el acceso externo a los servicios dentro del clúster, especialmente para aplicaciones web. Proporciona reglas para enrutar el tráfico HTTP/HTTPS hacia los servicios adecuados dentro del clúster.
ingress.yaml:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-app-ingress spec: rules: - host: my-app.example.com http: paths: - path: / pathType: Prefix backend: service: name: my-app-service port: number: 80
Descripción: El Ingress expone la aplicación web a través de un dominio específico (my-app.example.com) y enruta las solicitudes al servicio correspondiente dentro del clúster. Es útil cuando se necesita exponer aplicaciones a Internet de manera controlada y segura.
El uso adecuado de los archivos de configuración en Kubernetes es importante para mantener una infraestructura robusta y escalable. Siguiendo las buenas prácticas de organización, separación de preocupaciones y seguridad, puedes asegurar que tu infraestructura sea fácil de mantener, flexible ante cambios y eficiente en el uso de recursos. Al mantener tus archivos bien estructurados y aprovechar recursos como ConfigMap, Secrets y StatefulSet, tu clúster Kubernetes estará mejor preparado para manejar aplicaciones complejas y escalables.