Namespaces y cuotas

KubernetesBeginner
Practicar Ahora

Introducción

Un clúster de Kubernetes se parece a un edificio de apartamentos grande.

Si todos vivieran en el vestíbulo, habría un caos. No sabría de quién son los muebles y un vecino ruidoso podría molestar a todo el mundo.

Los Namespaces dividen lógicamente un clúster para que distintos equipos, entornos o aplicaciones puedan organizar sus recursos por separado.

Las ResourceQuotas restringen la cantidad de determinados recursos que puede consumir un namespace. Esto ayuda a evitar que un equipo o una carga de trabajo agote la capacidad compartida del clúster.

En este laboratorio, usted hará lo siguiente:

  • Construirá un nuevo «apartamento» (Namespace) llamado dev.
  • Establecerá un «límite de electricidad» estricto (ResourceQuota) para ese apartamento.
  • Intentará introducir muebles (Pods) en el apartamento y comprobará si caben.

Crear un Namespace

En este paso, creará un nuevo namespace para aislar los recursos de un equipo de desarrollo.

Un namespace es un límite lógico dentro de un mismo clúster, no un clúster independiente. Los equipos siguen compartiendo el mismo plano de control y los nodos subyacentes, pero los nombres, las políticas y muchas vistas de recursos pueden separarse para mantener el trabajo organizado.

De forma predeterminada, todo se coloca en el namespace default (el vestíbulo). Consulte qué namespaces existen actualmente:

kubectl get namespaces

Debería ver default, kube-system (donde trabajan los administradores del edificio) y algunos más.

Ahora, cree el apartamento dev:

kubectl create namespace dev

Compruebe que existe:

kubectl get namespaces

Verá dev en la lista. Actualmente es un apartamento vacío, sin paredes ni límites; puede colocar cualquier cosa dentro.

Aplicar límites de recursos

Ahora debemos establecer las reglas. No queremos que el equipo dev consuma toda la CPU y la memoria del clúster.

Crearemos un objeto ResourceQuota. Esto permite indicar: «En el namespace dev, puede utilizar como máximo 2 CPU y 2Gi de memoria».

Las cuotas son especialmente importantes en los clústeres compartidos porque la CPU y la memoria son recursos finitos. Sin cuotas, una carga de trabajo descontrolada podría consumir más de su parte justa y hacer que el clúster dejara de ser fiable para los demás. Por eso, las cuotas no solo sirven para contabilizar recursos; también son una herramienta de estabilidad.

Cree un archivo llamado quota.yaml:

nano quota.yaml

Pegue la siguiente configuración:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: dev-quota
  namespace: dev
spec:
  hard:
    requests.cpu: "1"
    requests.memory: 1Gi
    limits.cpu: "2"
    limits.memory: 2Gi

Guarde el archivo y salga (Ctrl+X, Y, Enter).

Aplique esta regla al clúster:

kubectl apply -f quota.yaml

Puede consultar los detalles de la regla. Verá el límite «Hard» (el que estableció) y la cantidad «Used» (actualmente 0).

kubectl describe resourcequota dev-quota --namespace=dev

Implementar un Pod

Ahora que las reglas están configuradas, intentemos introducirnos.

Regla fundamental: cuando un apartamento tiene un límite, cada mueble que introduzca debe tener declarado su tamaño. En términos de Kubernetes: si un Namespace tiene una Quota, cada Pod debe especificar explícitamente sus resources (requests y limits). Si no lo hace, el administrador del edificio (Kubernetes) le bloqueará la entrada.

Aquí se relacionan dos conceptos. Un request indica al planificador qué cantidad de recursos debe garantizarse al colocar el Pod. Un limit es la cantidad máxima que el contenedor puede utilizar. Las cuotas suman esos requests y limits en todo el namespace para mantener el total dentro de la política.

Cree un archivo llamado pod.yaml:

nano pod.yaml

Pegue lo siguiente. Observe que declaramos explícitamente el tamaño de este pod:

apiVersion: v1
kind: Pod
metadata:
  name: dev-pod
  namespace: dev ## <-- Putting it in the 'dev' apartment
spec:
  containers:
    - name: nginx
      image: nginx
      resources:
        requests:
          memory: "128Mi"
          cpu: "250m"
        limits:
          memory: "256Mi"
          cpu: "500m"

Guarde el archivo y salga (Ctrl+X, Y, Enter).

Implemente el Pod:

kubectl apply -f pod.yaml

Compruebe si se está ejecutando dentro del namespace dev:

kubectl get pods --namespace=dev

Espere hasta que vea Running.

Ahora, vuelva a comprobar el uso de la Quota. Verá que la columna «Used» ha aumentado:

kubectl describe resourcequota dev-quota --namespace=dev

Ha conseguido controlar el uso de recursos con respecto a su presupuesto.

Verificar el aislamiento

Por último, compruebe que las paredes de nuestro «apartamento» son reales.

El aislamiento de los namespaces se basa principalmente en los nombres, las políticas y el ámbito de las operaciones. De forma predeterminada, no significa que las cargas de trabajo se ejecuten en hardware físicamente separado. Esta distinción será importante más adelante, cuando aprenda sobre la selección de nodos y los mecanismos de aislamiento más sólidos.

Colocamos dev-pod dentro de dev. No debería estar visible desde el vestíbulo (default).

Enumere los Pods del namespace predeterminado:

kubectl get pods

Debería ver «No resources found in default namespace» o, al menos, no debería aparecer dev-pod.

Ahora, compruebe si hay una Quota en el namespace predeterminado:

kubectl get resourcequota

No debería aparecer nada. El límite de electricidad que establecimos se aplica solo al apartamento dev, no a todo el edificio.

Esto confirma que los Namespaces proporcionan un aislamiento real para sus equipos.

Resumen

En este laboratorio, se convirtió en el administrador del edificio de su clúster de Kubernetes.

Ha conseguido:

  1. Construir un Namespace privado (dev) para un equipo.
  2. Establecer una ResourceQuota estricta (límite de electricidad) para evitar el consumo excesivo.
  3. Implementar una aplicación que respetara estos límites.
  4. Verificar que las paredes entre los namespaces mantenían los recursos aislados.

Así es como las grandes organizaciones comparten un único clúster de Kubernetes entre cientos de equipos sin que interfieran entre sí.