Desplegar la unidad de carga de trabajo más pequeña posible y co-ubicada.
→Definir un recurso `Pod`. Los Pods pueden contener uno o más contenedores que comparten red y almacenamiento.
Por qué: El Pod es la unidad atómica de programación en Kubernetes. Los contenedores siempre se despliegan dentro de un Pod.
Referencia↗
Asegurar que el estado del clúster coincida continuamente con un estado deseado.
→Confiar en el `kube-controller-manager`. Ejecuta bucles de control que observan recursos (por ejemplo, ReplicaSets, Deployments) y concilian diferencias.
Por qué: Este es el mecanismo declarativo y de auto-recuperación central. Si un Pod gestionado por un ReplicaSet falla, el controlador lo reemplaza automáticamente.
Asignar automáticamente los Pods recién creados al nodo trabajador más adecuado.
→Confiar en el `kube-scheduler`. Filtra nodos basándose en los requisitos del Pod (por ejemplo, solicitudes de recursos) y los puntúa para elegir el más adecuado.
Por qué: El scheduler toma decisiones de ubicación basadas en políticas, afinidad y disponibilidad, abstrayendo la selección de nodos del usuario.
Asegurar que los contenedores especificados en los Pods estén funcionando y saludables en un nodo trabajador dado.
→El agente `kubelet` se ejecuta en cada nodo, se comunica con el API server y gestiona el ciclo de vida del contenedor (inicio, detención, comprobaciones de salud) a través de un tiempo de ejecución de contenedor.
Por qué: Kubelet es el enlace entre el plano de control y el nodo trabajador; ejecuta las especificaciones de los Pods.
Persistir de forma fiable todo el estado y la configuración del clúster de Kubernetes.
→Usar `etcd`, un almacén de clave-valor consistente y de alta disponibilidad. Sirve como la única fuente de verdad para el clúster.
Por qué: Todos los objetos del clúster (Pods, Services, etc.) se almacenan en etcd. Solo el API server se comunica directamente con él.
Implementar reglas de red en cada nodo para habilitar la comunicación a través de Kubernetes Services.
→El componente `kube-proxy` en cada nodo mantiene reglas de red (por ejemplo, iptables, IPVS) que reenvían el tráfico de una IP de Service a los Pods de backend correctos.
Por qué: Kube-proxy es el detalle de implementación detrás de la abstracción de Service, manejando el balanceo de carga y el enrutamiento.
Particionar lógicamente un único clúster de Kubernetes para múltiples equipos, proyectos o entornos.
→Crear recursos `Namespace`. Los Namespaces proporcionan un alcance para los nombres y una forma de adjuntar autorización y políticas (por ejemplo, ResourceQuotas).
Por qué: Los Namespaces permiten la multi-inquilinato y la organización de recursos sin la sobrecarga de múltiples clústeres.
Proporcionar un punto final de red estable (IP y DNS) para un conjunto de Pods efímeros.
→Definir un recurso `Service` que apunta a un conjunto de Pods utilizando un selector de etiquetas.
Por qué: Los Pods son efímeros y sus IPs cambian. Un Service proporciona una abstracción duradera que balancea la carga del tráfico a los Pods correctos.
Referencia↗
Exponer una aplicación que se ejecuta en Pods a diferentes alcances de red.
→Elegir un `type` de Service: `ClusterIP` (solo interno, por defecto), `NodePort` (expone en cada nodo IP:puerto), o `LoadBalancer` (aprovisiona un balanceador de carga en la nube).
Por qué: El tipo de Service determina la accesibilidad de la aplicación, desde puramente interna hasta completamente externa.
Habilitar el descubrimiento de red directo de Pods individuales, omitiendo el proxy de Service.
→Crear un `Service` con `clusterIP: None`. Esto crea registros DNS A para cada Pod, permitiendo a los clientes conectarse a los Pods directamente.
Por qué: Esencial para aplicaciones con estado como bases de datos (a menudo con StatefulSets) donde se requiere comunicación peer-to-peer o identidad de Pod estable.
Organizar y seleccionar un subconjunto de objetos de Kubernetes.
→Adjuntar `labels` de clave-valor a objetos (por ejemplo, `app: my-api`). Usar `label selectors` en otros objetos (por ejemplo, Services, Deployments) para apuntar a ellos.
Por qué: Las Labels son el mecanismo de agrupación central en Kubernetes, permitiendo un acoplamiento laxo entre recursos.
Desacoplar la configuración de la aplicación de la imagen del contenedor.
→Almacenar datos de configuración no sensibles en un `ConfigMap`. Montarlo como un volumen o inyectar claves como variables de entorno en los Pods.
Por qué: Esto permite que la configuración se gestione independientemente del código de la aplicación, siguiendo los principios de la aplicación de 12 factores (12-Factor App).
Almacenar datos sensibles como contraseñas, tokens o claves API para el uso de la aplicación.
→Usar un objeto `Secret`. Montarlo como un volumen o inyectarlo como una variable de entorno.
Por qué: Los Secrets son específicamente para datos sensibles y se manejan de forma más segura que los ConfigMaps (por ejemplo, no se muestran en `kubectl describe` por defecto, pueden cifrarse en reposo).
Proporcionar a las aplicaciones con estado almacenamiento que sobrevive a los reinicios de los Pods.
→Un Pod crea un `PersistentVolumeClaim` (PVC) para solicitar almacenamiento. Un administrador aprovisiona un `PersistentVolume` (PV) que satisface la solicitud.
Por qué: Esto desacopla el consumo de almacenamiento (PVC) del aprovisionamiento de almacenamiento (PV), permitiendo definiciones de carga de trabajo portátiles.
Gestionar la asignación de CPU y memoria para los contenedores.
→Establecer `resources.requests` para recursos garantizados (utilizados para la programación) y `resources.limits` para el uso máximo permitido (aplicado en tiempo de ejecución).
Por qué: Los Requests aseguran que los Pods tengan suficientes recursos para ejecutarse; los Limits evitan que los Pods consuman demasiados recursos e impacten otras cargas de trabajo.
Establecer restricciones de recursos agregadas en un Namespace.
→Crear un objeto `ResourceQuota` para limitar la cantidad total de CPU, memoria o número de objetos (Pods, Services) que pueden crearse en un Namespace.
Por qué: Los ResourceQuotas son esenciales para entornos multi-inquilino para asegurar un reparto justo de recursos y prevenir el consumo excesivo.
Gestionar recursos de Kubernetes utilizando archivos de configuración versionados.
→Usar `kubectl apply -f <filename.yaml>`. Este comando crea o actualiza recursos basándose en el contenido del archivo.
Por qué: `apply` es declarativo, lo que lo hace ideal para GitOps y CI/CD. Rastrea los cambios y realiza una fusión a tres bandas, lo que es más seguro que los comandos imperativos `create` o `replace`.
Diagnosticar por qué un Pod no se está ejecutando correctamente (por ejemplo, atascado en Pending, ContainerCreating o CrashLoopBackOff).
→Usar `kubectl describe pod <pod-name>`. Verificar la sección `Events` en la parte inferior para mensajes detallados del scheduler, kubelet o controladores.
Por qué: `describe` proporciona un registro cronológico de eventos que es la herramienta principal para depurar problemas del ciclo de vida de los recursos.
Proporcionar funcionalidad de red para contenedores, habilitando la comunicación Pod-a-Pod en todo el clúster.
→Usar un plugin de Container Network Interface (CNI) (por ejemplo, Calico, Flannel, Cilium). El kubelet en cada nodo usa el plugin CNI para configurar la red para cada Pod.
Por qué: CNI proporciona una interfaz estándar, permitiendo que Kubernetes se integre con diversas soluciones de red sin modificar los componentes principales.
Controlar el acceso a los recursos de la API de Kubernetes para usuarios y aplicaciones.
→Usar Role-Based Access Control (RBAC). Definir un `Role` (con ámbito de Namespace) o `ClusterRole` (con ámbito de clúster) con permisos, y vincularlo a un sujeto (User, Group, ServiceAccount) usando un `RoleBinding` o `ClusterRoleBinding`.
Por qué: RBAC es el estándar para asegurar Kubernetes, habilitando el principio de menor privilegio para todas las interacciones de la API.
Referencia↗