Primeros pasos con Kubernetes (X):Namespaces

Vamos a ejecutar previamente unos comandos que nos permitirán crear 4 namespaces distintos y desplegar aplicaciones en cada uno de ellos. A lo largo del post se irá concretando que es cada elemento.


export PROJECT=k8slabs-142707

# Generate container
sudo docker build -f ./apps/hello/v1/Dockerfile -t gcr.io/$PROJECT/hello:v1 ./apps/hello/v1
# Deploy container
sudo gcloud docker push gcr.io/$PROJECT/hello:v1

# Create namespaces
kubectl create -f ./namespaces/namespaces.yml

# Create deployment
kubectl create -f ./apps/hello/deployment.yml --namespace=dev1
kubectl create -f ./apps/hello/deployment.yml --namespace=dev2
kubectl create -f ./apps/hello/deployment.yml --namespace=pre1
kubectl create -f ./apps/hello/deployment.yml --namespace=pre2

# Create service
kubectl create -f ./apps/hello/service.yml --namespace=dev1
kubectl create -f ./apps/hello/service.yml --namespace=dev2
kubectl create -f ./apps/hello/service.yml --namespace=pre1
kubectl create -f ./apps/hello/service.yml --namespace=pre2


Todos los ejemplos que hemos realizado hasta el momento se han desplegado sobre el namespace “default” que proporciona Kubernetes. Un namespace es un cluster virtual sobre el cluster físico sobre el que trabajamos, de manera que permite tener una separación total namespaces y evitar conflictos por colisiones como por ejemplo elementos con el mismo nombre.

Todos los elementos que tenemos en un namespace han de tener un nombre único, por lo que no podemos desplegar dos aplicaciones con el mismo nombre. En cluster con muchos usuarios, es una buena práctica crear namespaces por ámbito aplicativo para reducir el impacto de afectaciones entre aplicaciones, como por ejemplo tener un Service que balancee entre instancias de dos aplicaciones, pq estas tienen los mismos labels y el Service casualmente tiene como node selector esos labels compartidos.

Otro uso vital para la creación de namespaces es gestionar multiples entornos (DEV, INT, QA…) dentro de un mismo cluster. Obviamente se desplegarán las mismas aplicaciones para cada entorno y en este caso si se desplegaran todas sobre el namespace “default” daría errores por intentar desplegar varios elementos con el mismo nombre. Para ello, crearíamos un namespace por cada entorno.

Para profundizar más en las características de los namespaces se puede consultar los siguientes enlaces::

http://kubernetes.io/docs/user-guide/namespaces/
http://kubernetes.io/docs/admin/namespaces/walkthrough/
http://kubernetes.io/docs/admin/namespaces/


Para crear los namespaces los configuraremos en un fichero de YAML. Como podemos ver a continuación hemos definido dentro del YAML 4 namespaces (dev1, dev2, pre1, pre2) y hemos lanzado en el script de prearranque la creación de dichos namespaces.


apiVersion: v1
kind: Namespace
metadata:
  name: dev1
  labels:
    environment: development
    line: 1
---
apiVersion: v1
kind: Namespace
metadata:
  name: dev2
  labels:
    environment: development
    line: 2
---
apiVersion: v1
kind: Namespace
metadata:
  name: pre1
  labels:
    environment: preproduction
    line: 1
---
apiVersion: v1
kind: Namespace
metadata:
  name: pre2
  labels:
    environment: preproduction
    line: 2


En el script de prearranque hemos creado el mismo Deployment y Service en cada uno de los namespaces creados. Si vemos a continuación el script de verificación veremos como se ha realizado la distribución.


$ kubectl get namespaces

NAME          STATUS    AGE
default       Active    3h
dev1          Active    2m
dev2          Active    1m
kube-system   Active    3h
pre1          Active    1m
pre2          Active    1m

$ kubectl get po --all-namespaces

NAMESPACE     NAME                                                      READY     STATUS    RESTARTS   AGE
dev1          hello-991347669-1fi65                                     1/1       Running   0          2m
dev2          hello-991347669-knqk2                                     1/1       Running   0          2m
kube-system   fluentd-cloud-logging-gke-bs-default-pool-28f5092a-chrz   1/1       Running   0          3h
kube-system   fluentd-cloud-logging-gke-bs-default-pool-28f5092a-j9g5   1/1       Running   0          3h
kube-system   fluentd-cloud-logging-gke-bs-default-pool-28f5092a-y4wc   1/1       Running   0          3h
kube-system   heapster-v1.2.0-4114705363-uxd17                          2/2       Running   0          3h
kube-system   kube-dns-v19-90l0i                                        3/3       Running   0          3h
kube-system   kube-dns-v19-l8gaz                                        3/3       Running   0          3h
kube-system   kube-proxy-gke-bs-default-pool-28f5092a-chrz              1/1       Running   0          3h
kube-system   kube-proxy-gke-bs-default-pool-28f5092a-j9g5              1/1       Running   0          3h
kube-system   kube-proxy-gke-bs-default-pool-28f5092a-y4wc              1/1       Running   0          3h
kube-system   kubernetes-dashboard-v1.4.0-sgy7u                         1/1       Running   0          3h
kube-system   l7-default-backend-v1.0-7t7sf                             1/1       Running   0          3h
pre1          hello-991347669-88lml                                     1/1       Running   0          2m
pre2          hello-991347669-6g4ll                                     1/1       Running   0          2m



No hay comentarios