Kubernetes es parte de un proyecto de código abierto que ayuda a administrar un clúster de contenedores como un solo sistema. También es una herramienta importante que administra y ejecuta contenedores Docker en múltiples hosts al tiempo que ofrece la ubicación de estos contenedores.

Durante una década, Google se ha beneficiado de la tecnología de contenedores. Con Kubernetes, es más fácil para Google compartir su experiencia en aplicaciones en contenedores y crear una plataforma abierta para ejecutar varios contenedores a gran escala.

En este artículo, lo guiaremos a través de varios pasos para ayudarlo a construir, implementar y administrar Docker en Kubernetes.

requisito

Para completar este proceso necesitará:

  • Una cuenta de Docker activa para guardar la imagen
  • Un clúster de Kubernetes
  • Servidor web o aplicación, en nuestro caso una aplicación de “lista de tareas pendientes” que utiliza una base de datos MongoDB.
  • La aplicación Git está completamente instalada en su computadora.

¿Cómo funciona Kubernetes?

Las instancias de Kubernetes se conocen como clústeres (es decir, servidores maestros y varios minions). El maestro administra los minions que utilizan las herramientas de comando para conectarse al punto final de la API. El host de Docker recibe la señal de los servidores maestros para ejecutar los contenedores.

El clúster de Kubernetes contiene varias unidades:

  • Maestro: conecta todos los componentes del nodo para que funcionen como una unidad.
  • Pods: una colección de unidades que ejecutan uno o más contenedores.
  • Minion: parte de los múltiples hosts de Docker que reciben instrucciones del maestro sobre cómo administrar y ejecutar contenedores.
  • Los componentes de nodo están asociados con pods específicos y pueden ser máquinas físicas o virtuales.

Paso 1: crea una imagen con Dockers

El primer paso es contener el servidor web o la aplicación creando una imagen para Dockers. Visite su página de inicio y luego use Git, modifique la aplicación web del tutorial en la página del repositorio en GitHub.

$ cd ~
$ git clone https://github.com/janakiramm/todo-app.git

Comience compilando la imagen a partir de su archivo Docker. Inserte el nombre de usuario, el nombre de la imagen y una etiqueta (opcional) con la ayuda de t-switch.

$docker build -t sammy/todo

Si la imagen se creó correctamente, debería ver un resultado como este:

Sending build context to Docker daemon  8.238MB
Step 1/7 : FROM node:slim
 ---> 286b1e0e7d3f
Step 2/7 : LABEL maintainer = "jani@janakiram.com"
 ---> Using cache
 ---> ab0e049cf6f8
Step 3/7 : RUN mkdir -p /usr/src/app
 ---> Using cache
 ---> 897176832f4d
Step 4/7 : WORKDIR /usr/src/app
 ---> Using cache
 ---> 3670f0147bed
Step 5/7 : COPY ./app/ ./
 ---> Using cache
 ---> e28c7c1be1a0
Step 6/7 : RUN npm install
 ---> Using cache
 ---> 7ce5b1d0aa65
Step 7/7 : CMD node app.js
 ---> Using cache
 ---> 2cef2238de24
Successfully built 2cef2238de24
Successfully tagged sammy/todo-app:latest

Asegúrese de que la imagen fue creada ingresando el siguiente comando:

$ docker images

Guarde la imagen en Docker Hub en el directorio público iniciando sesión en su cuenta de Hub en Dockers:

$ docker login

Ingrese su información de inicio de sesión. En este caso, use un nombre de usuario único para identificar su imagen en Dockerfile.

$ docker tag your_docker_hub_username/todo-app

Transfiera la imagen a Docker Hub:

$ docker push

Una vez que tenga la imagen de Docker en el registro, puede continuar con la configuración de la aplicación Kubernetes.

Paso 2: Implementar Pod (MongoDB) en Kubernetes

Esta aplicación utiliza una base de datos MongoDB para garantizar el almacenamiento seguro de Listas de tareas pendientes que se crean en el servidor web / aplicación. Para implementar correctamente MongoDB en Kubernetes, debe ejecutarlo como un pod.

Empiece por crear un archivo YAML, comúnmente conocido como db-pod.yamI:

$ nano db-pod.yaml

Pegue el puerto predeterminado que define su pod en MongoDB. Esto debe incluir el nombre y la aplicación. Se utilizan para configurar pods.

db-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: db
  labels:
    name: mongo
    app: todoapp

spec:
      containers:
      - image: mongo
        name: mongo
        ports:
        - name: mongo
          containerPort: 27017

        volumeMounts:
          - name: mongo-storage
            mountPath: /data/db

      volumes:
          - name: mongo-storage
            hostPath:
              path: /data/db

A continuación, ejecute el siguiente comando para crear su pod

$ kubectl create -f db-pod.yml

Asegúrese de obtener el siguiente resultado:

$ pod "db" created

Verifique que el pod se esté ejecutando con el siguiente comando:

$ kubectl get pods

La siguiente figura muestra que el pod se ejecuta correctamente:

NAME      READY     STATUS    RESTARTS   AGE
db   1/1       Running   0          2m

Para que el pod esté disponible para los clientes de los clústeres, cree un archivo llamado db-service.yaml que contiene el código que representa MongoDB.

db-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: db
  labels:
    name: mongo
    app: todoapp

spec:
  selector:
    name: mongo

  type: ClusterIP
  ports:
    - name: db
      port: 27017
      targetPort: 27017

Guarde su archivo y use el comando kubectl para transmitir el resultado al clúster del sistema:

$ kubectl create -f db-service.yml

Debería tener algo como esto como salida:

$ service "db" created

Para saber qué puerto muestra el pod exacto que está utilizando, ejecute el siguiente comando:

$ kubectl get services

La salida debería verse así:

NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)     AGE
db           ClusterIP   10.109.114.243   <none>        27017/TCP   14s
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP     47m

En este ejemplo, notará que el pod de servicio que creó aparece en el puerto 27017, que es el puerto predeterminado que usa MongoDB. Por lo tanto, la aplicación web puede llegar fácilmente a este servicio con los resultados anteriores. Este proceso facilita que los pods se identifiquen y se conecten entre sí.

Paso 3: escalar la aplicación web

Escalar los servicios web con conjuntos de réplicas es un proceso para garantizar que la cantidad de pods converja en todas partes. Al empaquetar el pod como un conjunto de réplicas, Kubernetes puede ejecutar la menor cantidad de pods implementados.

Necesitamos eliminar el pod existente y crear un nuevo conjunto para el conjunto de réplicas.

Ejecute el siguiente comando para eliminar el pod actual:

$ kubectl delete pod web

La salida debería verse así:

pod "web" deleted

Continúe con la creación de un nuevo conjunto de réplicas.

Empiece a crear el archivo web-rs.yaml luego agregue el siguiente código:

apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
  name: web
  labels:
    name: web
    app: todoapp

spec:
  replicas: 2
  template:
    metadata:
      labels:
        name: web
    spec:
      containers:
      - name: web
        image: sammy/todo-app
        ports:
        - containerPort: 3000

Ahora guarda y sal.

Continúe y cree su conjunto de réplicas como se muestra a continuación:

$ kubectl create -f web-rs.yaml

La salida debería verse así:

replicaset "web" created

Verifique la cantidad exacta de pods creados:

$ kubectl get pods
NAME        READY     STATUS    RESTARTS   AGE
db          1/1       Running   0          18m
web-n5l5h   1/1       Running   0          25s
web-wh6nf   1/1       Running   0          25s

Pruebe que el conjunto de réplicas esté funcionando. Para hacer esto, elimine uno de sus pods y observe lo que sucede:

$ kubectl delete pod web-wh6nf

La salida debe contener el siguiente texto:

pod "web-wh6nf" deleted

Verifique las cápsulas para confirmar que estén funcionando:

kubectl get pods

producción

NAME        READY     STATUS              RESTARTS   AGE
db          1/1       Running             0          19m
web-n5l5h   1/1       Running             0          1m
web-wh6nf   1/1       Terminating         0          1m
web-ws59m   0/1       ContainerCreating   0          2s

Cuando se elimina un pod, Kubernetes crea otro conjunto para reemplazarlo y continuar con el proceso.

Ejecute el siguiente comando para escalar su conjunto de réplicas a más pods web, por ejemplo 7,

$ kubectl scale rs/web --replicas=7

producción

replicaset "web" scaled

Verifique la cantidad de vainas

$ kubectl get pods

La salida debería verse así:

Output
NAME        READY     STATUS              RESTARTS   AGE
db          1/1       Running             0          22m
web-4nh4g   1/1       Running             0          21s
web-7vbb5   1/1       Running             0          21s
web-8zd55   1/1       Running             0          21s
web-f8hvq   0/1       ContainerCreating   0          21s
web-ffrt6   1/1       Running             0          21s
web-k6zv7   0/1       ContainerCreating   0          21s
web-n5l5h   1/1       Running             0          3m
web-qmdxn   1/1       Running             0          21s
web-vc45m   1/1       Running             0          21s
web-ws59m   1/1       Running             0          2m

Kubernetes ahora ha comenzado a escalar el pod de aplicaciones web. Una vez que el servicio esté activo, se enrutará a un pod específico en su conjunto de réplicas.

Cuando la carga disminuye, puede restablecer el servicio al estado inicial de dos pods con el siguiente comando:

kubectl scale rs/web --replicas=2

producción

replicaset "web" scaled

Para terminar el resto de los pods excepto los dos, ejecute el siguiente comando:

$ kubectl get pods

Debería tener la siguiente salida:

producción

NAME        READY     STATUS        RESTARTS   AGE
db          1/1       Running       0          24m
web-4nh4g   1/1       Terminating   0          2m
web-7vbb5   1/1       Terminating   0          2m
web-8zd55   1/1       Terminating   0          2m
web-f8hvq   1/1       Terminating   0          2m
web-ffrt6   1/1       Terminating   0          2m
web-k6zv7   1/1       Terminating   0          2m
web-n5l5h   1/1       Running       0          5m
web-qmdxn   1/1       Terminating   0          2m
web-vc45m   1/1       Terminating   0          2m
web-ws59m   1/1       Running       0          4m

Compruebe si el conjunto de réplicas está disponible intentando eliminar uno de sus pods en el servicio:

$ kubectl delete pod web-ws59m

La salida debería verse así:

Output
pod "web-ws59m" deleted
$ kubectl get pods

producción

NAME        READY     STATUS              RESTARTS   AGE
db          1/1       Running             0          25m
web-n5l5h   1/1       Running             0          7m
web-ws59m   1/1       Terminating         0          5m
web-z6r2g   0/1       ContainerCreating   0          5s

Cuando cambia el número de pods, Kubernetes se ajusta para coincidir con el número específico de pods en el archivo YAML.

Ejecute el siguiente comando para eliminar alguno o todos los elementos de esta guía:

$ kubectl delete -f db-pod.yaml -f db-service.yaml -f web-rs.yaml -f web-service.yaml

La salida debería verse así:

Output
pod "db" deleted
service "db" deleted
replicaset "web" deleted
service "web" deleted

Conclusión

Si sigue esta guía paso a paso, debería poder implementar y escalar Docker con Kubernetes. Esperamos que esta guía haya ayudado a que eso suceda.

Si desea obtener más información sobre Kubernetes, consulte la guía de Hosting Más Barato para el alojamiento de Kubernetes.

Consulte los 3 mejores servicios de alojamiento en la nube: