En Mi Local Funciona

Technical thoughts, stories and ideas

Introducción a Kubernetes (II) - Simplemente Dockers

Publicado por Manuel Valle el

DevOpsKubernetes

En nuestro post "Introducción a Kubernetes (I)" veíamos como montar un entorno demo para probar un cluster de Kubernetes. Como ya explicamos, un cluster Kubernetes nos permite desplegar aplicaciones abstrayéndonos de la infraestructura física.

Pero además de poder desplegar aplicaciones complejas con métodos complejos, balanceadores, replication controllers, deployments y demás conceptos de Kubernetes, también podemos usar el cluster como un simple gestor de contenedores Docker. Al igual que utilizamos en nuestro local docker-engine podemos usar de manera similar nuestro cluster Kubernetes. Esta funcionalidad nos puede permitir hacer pruebas con nuestras imágenes Docker o incluso hacer pilotos básicos para pruebas de concepto.

Creación de un namespace

Por defecto en Kubernetes nos vamos a encontrar 2 namespaces: kube-system, que es el namespace de todos los componentes core del cluster Kubernetes; y el namespace default que es un namespace para empezar a trabajar y que está definido como por defecto para poder empezar a utilizarlo. Nosotros vamos a crear un namespace para nuestras pruebas y así dejar de usar el por defecto default. Para ello ejecutaremos el siguiente comando:

kubectl create namespace enmilocalfunciona  

Una vez creado nuestro namespace podemos ver todos los namespaces y comprobar que existe el nuevo:

$ cluster/kubectl.sh get namespaces
NAME                STATUS    AGE  
default             Active    7d  
enmilocalfunciona   Active    1m  
kube-system         Active    7d  

Para poder utilizar y crear pods, réplicas, etc. en este namespace deberemos especificarlo en cada comando con la opcion --namespace=enmilocalfunciona

Creación de un contenedor ubuntu

kubectl run ubuntu-test --image=ubuntu --restart=Never --namespace=enmilocalfunciona -- sleep infinity  

Esto crea un pod. Si pusieramos --restart=Always o no pusiéramos esta opción, Kubernetes crea un "Replica set" y un "Deployment" para asegurar que ese pod/contenedor esté siempre funcionando. Un "Replica Set" es la siguiente generación de un "Replication Controller" que veíamos en el articulo anterior. Kubernetes soporta ambos motores de replicación. La única diferencia entre un "Replica Set" y un "Replication Controller" es que el primero soporta el nuevo tipo de selector (ver la documentación de labels), el segundo solo soporta etiquetas tipo clave-valor.

Troubleshooting de contenedor

Nos podemos conectar para hacer operaciones. De este modo podemos abrir un terminal:

kubectl --namespace=enmilocalfunciona exec -it ubuntu-test bash  

Para ver que ocurre o eventos relacionados con nuestro pod, podemos ejecutar:

$ cluster/kubectl.sh describe pod ubuntu-test --namespace=enmilocalfunciona
Name:        ubuntu-test  
Namespace:    enmilocalfunciona  
Node:        kubernetes-node-1/10.245.1.3  
Start Time:    Wed, 13 Jul 2016 16:15:31 +0200  
Labels:        <none>  
Status:        Running  
IP:        10.246.71.3  
Controllers:    <none>  
Containers:  
  ubuntu-test:
    Container ID:    docker://8de74b8675cacf6195fbf1f85eb2ba5aebe329feefd4af4e5ff65ee889e58972
    Image:        ubuntu
    Image ID:        docker://sha256:cf62323fa025e4e73960df25ed10af56d8ddbb1b3f5ef1842738f2891f9e416e
    Port:        
    Args:
      sleep
      infinity
    State:            Running
      Started:            Thu, 14 Jul 2016 11:49:57 +0200
    Ready:            True
    Restart Count:        0
    Environment Variables:    <none>
Conditions:  
  Type        Status
  Initialized     True 
  Ready     True 
  PodScheduled     True 
Volumes:  
  default-token-558pu:
    Type:    Secret (a volume populated by a Secret)
    SecretName:    default-token-558pu
QoS Tier:    BestEffort  
Events:  
  FirstSeen    LastSeen    Count   From                SubobjectPath           Type        Reason  Message
  ---------    --------    -----   ----                -------------           --------    ------  -------
  27m        27m     1   {kubelet kubernetes-node-1} spec.containers{ubuntu-test}    Normal      Pulled  Container image "ubuntu" already present on machine
  27m        27m     1   {kubelet kubernetes-node-1} spec.containers{ubuntu-test}    Normal      Created Created container with docker id 8de74b8675ca
  27m        27m     1   {kubelet kubernetes-node-1} spec.containers{ubuntu-test}    Normal      Started Started container with docker id 8de74b8675ca

Con este comando podemos ver toda la información relacionada con el pod, así como los últimos eventos.

Para ver los eventos en tiempo real podemos ejecutar el siguiente comando:

cluster/kubectl.sh --namespace=enmilocalfunciona get events -w  

Una guía para hacer troubleshooting podéis encontrarla aquí.

Para ver los logs de un contenedor tendremos que ejecutar el siguiente comando:

kubectl logs ubuntu-test ubuntu-test --namespace=enmilocalfunciona  

No os asustéis si no veis ninguna linea de log, ya que el ejemplo que hicimos fue con una máquina Ubuntu que, si recordamos, está ejecutando como entrypoint sleep infinity

Monitorizacion de Kubernetes

Para poder monitorizar los recursos en Kubernetes podemos acceder al Cockpit que viene preinstalado en nuestra instalación del piloto:

https://10.245.1.2:9090

Usuario: vagrant, password: vagrant

Aquí encontraremos gráficas e información tanto del nodo master como del cluster en general.

Esperemos que con esta guía os animéis a empezar a hacer vuestras pruebas y laboratorios en Kubernetes.

Si quieres estar al día de nuevos capítulos de esta serie sobre Kubernetes, ¡síguenos en Twitter!

Manuel Valle
Autor

Manuel Valle

Miembro de Oficina Técnica en atSistemas.
Implantador y "contagiador" de filosofía DevOps y metodologías Ágiles. Especialista en IaaS y PaaS.
Twitter: @manuvaldi