Saltar al contenido principal

namespaces

Namespaces

Los namespaces son una forma de agrupar y aislar los recursos de kubernetes. Esto permite que podamos segregar los diferentes recursos de una aplicación ( pod, deployment, service, etc) para establecer unas cuotas recursos, políticas de seguridad y configuraciones específicas.

Por omisión, kubernetes crea un namespace llamado default que es el namespace por defecto.

Listar namespaces

Podemos listar los namespaces con el comando:

kubectl get ns

Esto nos muestra nuestro namespace por defecto y los namespaces del sistema de kubernetes (no tocar estos namespaces):

NAME              STATUS   AGE
default Active 26d
kube-node-lease Active 26d
kube-public Active 26d
kube-system Active 26d

Puede ser interesante listar los namespaces junto con sus `labels``:

kubectl get ns --show-labels

Este comando nos muestra nuestros namespaces de la siguiente forma:

NAME              STATUS   AGE   LABELS
default Active 26d kubernetes.io/metadata.name=default
kube-node-lease Active 26d kubernetes.io/metadata.name=kube-node-lease
kube-public Active 26d kubernetes.io/metadata.name=kube-public
kube-system Active 26d kubernetes.io/metadata.name=kube-system

Crear un namespace

Podemos crear un namespace simplemente con el comando:

kubectl create ns <nombre-namespace>

Aún así, también también lo podemos crear con un fichero de configuración (este en formato json) para dejarlo definido como código:

{
"apiVersion": "v1",
"kind": "Namespace",
"metadata": {
"name": "development",
"labels": {
"name": "development"
}
}
}

Para utilizar este json de configuración podemos utilizar el comando:

kubectl create -f <fichero-json>

Borrar un namespace

Podemos borrar un namespace con el comando:

kubectl delete ns <nombre-namespace>

Cambiar de namespace y contextos

Podríamos ejecutar comandos en cualquier namespace añadiendo el parámentro --namespace o -n a cualquier comando, por ejemplo:

kubectl get pods --namespace development

El proceso anterior sería más farragoso, excepto que queramos lanzar un comando puntual en un namespace concreto, es más recomendable utilizar la configuración de contexto de kubectl:

kubectl config set-context <nombre-context> --namespace=<nombre-namespace>

Así estaríamos asociando un namespace a un contexto.

Context

Los contextos en kubernetes permiten definir a nuestro cliente diferentes entornos a los que conectarse. Estos entornos puedes ser namespaces o clusters diferentes.

Podemos ver nuestra configuración con el comando:

kubectl config view

Esto nos mostrará nuestra configuración de organizada de la siguiente manera:

apiVersion: v1
kind: Config
preferences: {}

clusters:
- cluster:
name: development
- cluster:
name: scratch

users:
- name: developer
- name: experimenter

contexts:
- context:
name: dev-frontend
user: developer
cluster: development
- context:
cluster: scratch
namespace: develop
user: experimenter
name: scratch-frontend

Podemos distinguir tres elementros de la configuración:

  • Clusters: definen los clusters a los que podemos conectarnos.
  • Users: definen los usuarios que podemos utilizar para conectarnos a los clusters.
  • Contexts: definen los contextos a los que podemos conectarnos. Estos contextos guardan la relación de usuario, cluster y namespace.

Esta organización nos permite definir clusters y usuarios individualmente y luego ir asociándolos en contexto concretos.

Este fichero de configuración se suele alojar en el directorio ~/.kube/config. Podemos añadir una nueva configuración editando el fichero o usando el comando:

kubectl config set-context <nombre del contexto> --namespace=<nombre namespace OPCIONAL> \
--cluster=<nombre del cluster> \
--user=<usuario>

Definir usuario

Se puede definir un usuario con el comando en nuestro fichero de configuración con el siguiente comando:

kubectl config set-credentials <nombre-usuario> --client-certificate=<certificado> --client-key=<clave>

Definir un cluster

También podemos definir por comandos clusters:

kubectl config set-cluster <nombre-cluster> --server=<url del cluster> --certificate-authority=<certificado-autoridad>