Namespace
En Kubernetes, un namespace es una forma de organizar y agrupar recursos dentro de un clúster. Actúa como un “espacio de nombres” lógico que permite dividir el clúster en secciones más pequeñas, lo que facilita la gestión y la organización de los recursos. Los namespaces son especialmente útiles en escenarios donde hay múltiples equipos o proyectos trabajando en el mismo clúster, ya que permite:
-
Aislar recursos: Los recursos (pods, servicios, configuraciones, etc.) creados en un namespace no afectan ni interactúan directamente con los recursos de otro namespace, lo que proporciona un nivel de aislamiento.
-
Evitar conflictos: Al usar namespaces, puedes tener objetos con el mismo nombre (por ejemplo, un pod llamado
frontend
) en diferentes namespaces sin que entren en conflicto entre sí. -
Control de acceso: Puedes aplicar políticas de seguridad y acceso específicas por namespace, lo que facilita el control de quién puede interactuar con ciertos recursos.
-
Cuotas de recursos: Los administradores pueden asignar cuotas de recursos (CPU, memoria, etc.) a cada namespace, ayudando a evitar que un proyecto o equipo consuma todos los recursos del clúster.
Por defecto, Kubernetes tiene algunos namespaces predefinidos, como:
- default: Donde se crean los recursos si no se especifica un namespace.
- kube-system: Usado por los recursos internos del sistema de Kubernetes.
- kube-public: Un namespace de acceso público, aunque no se usa comúnmente.
- kube-node-lease: Gestiona el arrendamiento de nodos.
Esencialmente, los namespaces permiten una mejor organización y administración en clústeres Kubernetes más grandes o multiusuario.
Como ver los namespaces
kubectl get namespace
Como ver los objetos de un namespace
kubectl get pods -n kube-system
kubectl get pods -n kube-public
Crear y borrar namespace
Modo imperativo
kubectl create namespace n1
Modo declarativo
apiVersion: v1
kind: Namespace
metadata:
name: n1
labels:
tipo: desarrollo
Luego kubectl apply -f namespace.yml
Elimiar namespace
kubectl delete namespace n1
Crear objetos en un namespace
Usaremos como ejemplo un objeto que levante elasticsearch:
apiVersion: apps/v1 # i se Usa apps/v1beta2 para versiones anteriores a 1.9.0
kind: Deployment
metadata:
name: elastic
labels:
tipo: "desarrollo"
spec:
selector: #permite seleccionar un conjunto de objetos que cumplan las condicione
matchLabels:
app: elastic
replicas: 2 # indica al controlador que ejecute 2 pods
strategy:
type: RollingUpdate
minReadySeconds: 2
template: # Plantilla que define los containers
metadata:
labels:
app: elastic
spec:
containers:
- name: elastic
image: elasticsearch:7.6.0
ports:
- containerPort: 9200
Ahora enlazamos ese Deployment con el namespace asi :
kubectl apply -f deploy_elastic.yml --namespace=n1
Establecer namespace por defecto
Vamos a cd ~.kube
y en el archivo config en uno de
los context veremos namespace podemos modificarlo ahi.
Podemos hacerlo en caliente tambien, kubectl config view
para ver
la config en caso de que no tengamos el fichero a mano.
Para modificarlo hacemos :
kubectl config set-context --current --namespace=dev1
Ahora si hacemos kubectl get pods
ya no tenemos que indicar
el namespace.
Poner CPU y memoria a los namespace
Creamos limit.yml
apiVersion: v1
kind: LimitRange
metadata:
name: recursos
spec:
limits:
- default:
memory: 512Mi
cpu: 1
defaultRequest:
memory: 256Mi
cpu: 0.5
max:
memory: 1Gi
cpu: 4
min:
memory: 128Mi
cpu: 0.5
type: Container
- default: Si un contenedor no especifica ningún límite, se le aplicarán estos valores (512Mi de memoria y 1 CPU).
- defaultRequest: Si un contenedor no especifica solicitudes, Kubernetes asumirá que el contenedor necesita estos recursos (256Mi de memoria y 0.5 CPU).
- max: Un contenedor no puede pedir más de 1Gi de memoria y 4 CPUs.
- min: Un contenedor no puede pedir menos de 128Mi de memoria y 0.5 CPU.
Si a continuacion hacemos kubectl apply -f limits.yaml
y hacemos un
describe del namespace veremos el limite de recursos.
Name: default
Labels: kubernetes.io/metadata.name=default
Annotations: <none>
Status: Active
No resource quota.
Resource Limits
Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio
---- -------- --- --- --------------- ------------- -----------------------
Container memory 128Mi 1Gi 256Mi 512Mi -
Container cpu 500m 4 500m 1 -
Tene en cuenta que el limit se aplica sobre el namespace en el cual estas parado al menos que uses -n tu-name-space
Controlar los eventos dentro de un Namespace
kubectl create namespaces desarrollo
Cambiar el namespace actual
Si deseas cambiar el namespace predeterminado sin tener que especificarlo manualmente cada vez que ejecutas un comando, puedes usar:
kubectl config set-context --current --namespace=desarrollo
Ver el namespace actual
kubectl config view --minify --output 'jsonpath={..namespace}'
Creamos un pod en ese namespace
kubectl run apache --image=httpd
Vemos los eventos del namespace
❯ kubectl get events --namespace desarrollo
LAST SEEN TYPE REASON OBJECT MESSAGE
17s Normal Scheduled pod/apache Successfully assigned desarrollo/apache to multinode-m04
17s Normal Pulling pod/apache Pulling image "httpd"
16s Normal Pulled pod/apache Successfully pulled image "httpd" in 1.484s (1.484s including waiting). Image size: 148178227 bytes.
16s Normal Created pod/apache Created container apache
16s Normal Started pod/apache Started container apache
Esto mismo aparece si hacemos kubectl describe pod apache
en la zona de eventos.
Filtrar eventos por campos
Si queremos ver solo los eventos donde el TYPE es Warning hacemos :
kubectl get events --field-selector type="Warning"
Viendo eventos en tiempo real
Haciendo uso de -w
(watch)
kubectl get events --namespace desarrollo -w