Namespaces

Namespaces

Namespaces son espacios de trabajo dentro de un cluster, donde cada namespace es independiente del otro, es decir los services, deployments, replicasets y pods no se ven entre cada espacio de trabajo. esto es especialmente bueno para trabajar con diferentes departamentos de trabajo, como desarrolladores, sysadmin, ... Otra ventaja es que se puede limitar los espacios de trabajo en los recursos que podrán consumir cada uno de ellos y también en acceso.

Por defecto kubernetes tiene los espacios de trabajo que no debemos tocar kube-public, kube-system y kube-node-lease estos espacios de trabajo los utiliza kubernetes y no es buena practica trastear en ellos. El usuario o administrador trabaja en el namespace default o uno creado para un grupo especifico.

sudo kubectl get namespaces              
NAME              STATUS   AGE
default           Active   15d
kube-node-lease   Active   15d
kube-public       Active   15d
kube-system       Active   15d

Comandos

sudo kubectl get namespaces    # visualizar
sudo kubectl create namespace test-ns # crear
sudo kubectl delete namespace test-ns # eliminar
sudo kubectl describe namespaces test-ns # inspeccionar
# ver objeto de namespace -n abreviacion
sudo kubectl get pods|replicasets|deployments|services --namespace test-ns
sudo kubectl get pods|replicasets|deployments|services -n test-ns
# ver de todos los namespaces -A abreviacion de all-namespaces
sudo kubectl get pods|replicasets|deployments|services -A

Gestión manual

# Crear namespace simple
sudo kubectl create namespace test-ns
namespace/test-ns created

sudo kubectl get namespaces              
NAME              STATUS   AGE
default           Active   15d
kube-node-lease   Active   15d
kube-public       Active   15d
kube-system       Active   15d
test-ns           Active   5s

# ver contenido namspace
sudo kubectl describe namespaces test-ns
Name:         test-ns
Labels:       <none>
Annotations:  <none>
Status:       Active

No resource quota.
No LimitRange resource.

resource quota: Es la limitación de cierta cantidad de recursos, que el namespace no va a ser sobrepasar.

limitRange resource: Es una manera de controlar recursos a nivel de objetos individuales. Es decir, pods, deployments, replicasets, ...

Ejemplo espacios de trabajo

# creo un pod en el namespace test-ns
sudo kubectl run   --generator=run-pod/v1 podtest --image=nginx:alpine --namespace test-ns 
pod/podtest created

# desde el namespace default no hay nada
sudo kubectl get pods
No resources found in default namespace.

# pero en el namespace test-ns se a creado
sudo kubectl get pods -n test-ns
NAME      READY   STATUS    RESTARTS   AGE
podtest   1/1     Running   0          26s

sudo kubectl delete pod podtest -n test-ns
pod "podtest" deleted

sudo kubectl delete namespaces test-ns    
namespace "test-ns" deleted

Template

En el siguiente templte se crean dos namespaces, con un deployment en cada uno. Para indicar que un deployment pertenece a un namespace, se le añade en el deployment la metadata namespace: nombre-del-namespace .

apiVersion: v1
kind: Namespace
metadata:
  name: dev
  labels:
    name: dev
---
apiVersion: v1
kind: Namespace
metadata:
  name: prod
  labels:
    name: prod
---
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    kubernetes.io/change-cause: "version inicial"
  name: deployment-test
  namespace: dev
  labels:
    app: front-nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: front-nginx
  template:
    metadata:
      labels:
        app: front-nginx
    spec:
      containers:
      - name: nginx
        image: nginx:alpine
        ports:
        - containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    kubernetes.io/change-cause: "version inicial"
  name: deployment-prod
  namespace: prod
  labels:
    app: front-nginx
spec:
  replicas: 4
  selector:
    matchLabels:
      app: front-nginx
  template:
    metadata:
      labels:
        app: front-nginx
    spec:
      containers:
      - name: nginx
        image: nginx:alpine
        ports:
        - containerPort: 80

Se pude ver como se crea en cada namespace su deployment con sus pods independientes del cada espacio de trabajo.

sudo kubectl apply -f  namespaces/envs-ns.yml
namespace/dev unchanged
namespace/prod unchanged
deployment.apps/deployment-test created
deployment.apps/deployment-prod created

# en el namespace default no hay nada
sudo kubectl get deploy     
No resources found in default namespace.

# el namespace dev esta corriendo el deployment con sus pods
sudo kubectl get deploy -n dev
NAME              READY   UP-TO-DATE   AVAILABLE   AGE
deployment-test   2/2     2            2           81s

sudo kubectl get pods -n dev 
NAME                               READY   STATUS    RESTARTS   AGE
deployment-test-694b78cb4c-2lfp9   1/1     Running   0          2m7s
deployment-test-694b78cb4c-ddcv4   1/1     Running   0          2m7s

# en el namespace prod corre su deploy y sus pods
sudo kubectl get deploy -n prod
NAME              READY   UP-TO-DATE   AVAILABLE   AGE
deployment-prod   4/4     4            4           99s

sudo kubectl get pods -n prod 
NAME                               READY   STATUS    RESTARTS   AGE
deployment-prod-694b78cb4c-c8w4f   1/1     Running   0          2m
deployment-prod-694b78cb4c-f5bx6   1/1     Running   0          2m
deployment-prod-694b78cb4c-w57ch   1/1     Running   0          2m
deployment-prod-694b78cb4c-z66ln   1/1     Running   0          2m

# la opcion all-namespaces muestra todo
sudo kubectl get deploy -A
NAMESPACE     NAME              READY   UP-TO-DATE   AVAILABLE   AGE
dev           deployment-test   2/2     2            2           6m59s
kube-system   coredns           2/2     2            2           15d
prod          deployment-prod   4/4     4            4           6m59s

Dns entre namespaces

El dns en un namespace se crea automáticamente y los pods de un mismo espacio de trabajo se ven entre ellos, pero entre espacios de trabajo solo se podran ver a nivel de servicios y especificando el FQDN de la siguiente manera.

service-name + namespace-name + svc.cluster.local

Ejemplo de dns entre namespaces.

sudo kubectl get services -n dev
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
my-service   ClusterIP   10.98.97.69   <none>        8080/TCP   15m

sudo kubectl run -ti --generator=run-pod/v1 podtest --image=nginx:alpine --namespace default -- sh 
# no esta en el mismo namespace y no lo ve
/ # curl my-service:8080
curl: (6) Could not resolve host: my-service

# pero con el FQDN llegan a verse.
/ # curl my-service.dev.svc.cluster.local:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>

Contexto

El contexto en kubernetes es el espacio de trabajo en el que trabaja un usuario.

Un usuario por defecto trabaja en el namespace default y si es un desarrollador y tiene su namespace desarrollo, tiene que estar indicando siempre -n desarrollo o --namespace desarrollo y esto es engorroso.

Para esto mismo existen los contextos, para asignarte un namespace por defecto en un usuario.

# contexto actual
sudo kubectl config current-context
minikube

# añadier nuevo contexto context-dev con namespace por defecto dev
sudo kubectl config set-context context-dev --namespace=dev \
  --cluster=minikube \
  --user=minikube

# usar contexto
sudo kubectl config use-context context-dev
Switched to context "context-dev".

# verificar
sudo kubectl config current-context        
context-dev

# ahora por defecto muestra los objetos del namespace dev
sudo kubectl get svc 
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
my-service   ClusterIP   10.98.97.69   <none>        8080/TCP   35m