Desplegando la aplicación en docker y creando manifiestos para kubernetes

Guillermo Garcia - Jun 9 - - Dev Community

Hemos estado realizando nuestro primer pipeline para nuestra aplicación en react, lo que vamos a realizar en este video es probar nuestra imagen en docker y crear nuestros manifestos para kubernetes.

Nota: Estamos partiendo que tienes conocimientos básicos de docker y kubernetes, ta les como:
¿Qué es docker?
¿Qué es kubernetes?

  1. Docker Para correr nuestra imagen ejecutamos el siguiente comando:
      docker run -d --name my-rdicidr -p 3000:3000 ahioros/rdicidr:latest
Enter fullscreen mode Exit fullscreen mode

Verificamos nuestro contenedor en la consola:

      docker ps | grep my-rdicidr
Enter fullscreen mode Exit fullscreen mode

Para detener el contenedor ejecutamos el siguiente comando:

      docker stop my-rdicidr
Enter fullscreen mode Exit fullscreen mode

Para borrar el contenedor ejecutamos el siguiente comando:

      docker rm my-rdicidr
Enter fullscreen mode Exit fullscreen mode

Para borrar la imagen ejecutamos el siguiente comando:

      docker image rm ahioros/rdicidr:latest
      # también funciona el shortcut para borrar la imagen
      docker rmi ahioros/rdicidr
Enter fullscreen mode Exit fullscreen mode

Ahora vamos a ver en nuestro navegador que nuestra aplicación se esta desplegando en el puerto 3000.

  1. Kubernetes

Vamos a crear los siguientes archivos:
01-namespace.yaml : crearemos un namespace para nuestra aplicación.
02-deployment.yaml : creamos el deployment para nuestra aplicación, y definimos la cantidad de replicas y puerto de escucha de nuestra aplicación.
03-service.yaml : añadiremos un servicio para nuestra aplicación y un puerto de escucha para nuestro servicio.
04-ingress.yaml : y por último un ingress para acceder nuestra aplicación.

01-namespace.yaml

  apiVersion: v1
  kind: Namespace
  metadata:
    name: production
Enter fullscreen mode Exit fullscreen mode

02-deployment.yaml

  apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: deployment-rdicidr
    namespace: production
    labels:
      app: rdicidr
  spec:
    replicas: 3
    selector:
      matchLabels:
        app: rdicidr
    template:
      metadata:
        labels:
          app: rdicidr
      spec:
        containers:
        - name: rdicidr
          image: ahioros/rdicidr:latest
          ports:
          - containerPort: 3000
Enter fullscreen mode Exit fullscreen mode

03-service.yaml

  apiVersion: v1
  kind: Service
  metadata:
    name: service-rdicidr
    namespace: production
  spec:
    selector:
      app: rdicidr
    ports:
      - protocol: TCP
        port: 80
        targetPort: 3000
Enter fullscreen mode Exit fullscreen mode

04-ingress.yaml

  apiVersion: networking.k8s.io/v1
  kind: Ingress
  metadata:
    name: rdicidr-nginx-ingress
    namespace: production
    annotations:
      nginx.ingress.kubernetes.io/rewrite-target: /
  spec:
    ingressClassName: nginx
    rules:
    - http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: service-rdicidr
              port:
                number: 80
Enter fullscreen mode Exit fullscreen mode

Aplicamos los manifests:

      kubectl apply -f .
Enter fullscreen mode Exit fullscreen mode

Nota : Como los archivos tienen un número al inicio del nombre este especifica un orden, esto hace que se aplique en ese orden.

Realizamos un port-forward:

      kubectl port-forward --namespace=production service/service-rdicidr 8080:80
Enter fullscreen mode Exit fullscreen mode

Ahora vamos a ver en nuestro navegador que nuestra aplicación se esta desplegando en el puerto http://localhost:8080.

Después de realizar las pruebas y comprobar que la aplicación está funcionando podemos eliminarla de nuestro kubernetes:

      kubectl delete -f .
Enter fullscreen mode Exit fullscreen mode

Acá te dejo el video de esta configuración por si tienes dudas:

En nuestro siguiente post te enseñaré a instalar ArgoCD en Kubernetes para que automaticemos el despliegue.

. . . . . . . . . .