Cómo implementar una aplicación Express.js en Vultr Kubernetes Engine

Introducción

Express es un marco de aplicación web para Node.js que proporciona características para crear aplicaciones web robustas, rápidas y escalables. Simplifica el proceso de enrutamiento, manejo de solicitudes y respuestas y administración de middleware. También permite la integración con varias bases de datos y motores de plantillas. Agiliza el proceso de desarrollo y permite a los desarrolladores crear aplicaciones web eficientes.

La implementación de Express en Kubernetes ofrece varios beneficios, como escalabilidad, alta disponibilidad e implementación de múltiples entornos. Puede escalar su aplicación Express en Vultr Kubernetes Engine, asegurándose de que la aplicación pueda manejar un mayor tráfico. La implementación de Kubernetes también garantiza la alta disponibilidad de su aplicación, lo que la hace más tolerante a fallas. También permite implementar y administrar múltiples entornos, como desarrollo, preparación, producción, etc.

Este artículo muestra los pasos para crear un example aplicación usando Express, colóquela en un contenedor e impleméntela en Vultr Kubernetes Engine.

requisitos previos

Antes de comenzar, debe:

  • Implemente un clúster de Vultr Kubernetes Engine.

  • Tener acceso a la configuración de DNS de un nombre de dominio. Este artículo utiliza expresar.googlesyndication.com para demostración

  • implementar un Cloud Instancia de cómputo con la aplicación Docker Marketplace para usar como estación de trabajo de administración. En la estación de trabajo de administración:

    • Instalar Kubectl .

    • Descargue su configuración de VKE y configure Kubectl.

Crear una aplicación web

Esta sección lo guía a través de los pasos para crear una aplicación básica usando Express para demostración. Puede pasar a la siguiente sección para contener su aplicación existente.

Instala el nodejs y el npm paquetes

                      
                        # apt install nodejs npm

                      
                    

El comando anterior instala el nodejs y el npm paquetes en el servidor.

Cree e ingrese un nuevo directorio llamado express-demo .

                      
                        # mkdir express-demo

# cd express-demo

                      
                    

El comando anterior crea e ingresa el express-demo directorio. Utiliza este directorio para almacenar todos los archivos relacionados con esta aplicación.

Inicializar el npm paquete.

                      
                        # npm init

                      
                    

El comando anterior inicia el paquete y crea un nuevo archivo llamado package.json en el directorio que contiene toda la información sobre el proyecto, como nombre, versión, dependencias, etc.

Instale la biblioteca Express usando npm .

                      
                        # npm install express

                      
                    

El comando anterior instala la biblioteca Express. Almacena los datos en el node_modules directorio y actualiza la sección de dependencias en el package.json archivo.

Crear un nuevo archivo llamado app.js .

                      
                        # nano app.js

                      
                    

Agregue los siguientes contenidos al archivo.

                      
                        const express = require('express')

const app = express()



app.get("https://www.vultr.com/", (req, res) => {

  res.send('<h1>Hello World, Greetings from Vultr</h1>')

})



app.listen(3000, () => {

  console.log('Server Listening on Port 3000')

})

                      
                    

El código anterior crea un único punto final / que responde Hola Mundo, Saludos desde Vultr a las solicitudes GET entrantes en el puerto 3000 .

Deshabilite el cortafuegos.

                      
                        # ufw disable

                      
                    

El comando anterior deshabilita el firewall para permitir conexiones entrantes en 3000 .

Ejecute la aplicación Express.

                      
                        # node app.js

                      
                    

El comando anterior inicia el servidor Express. Puede verificar el acceso abriendo https://PUBLIC_IP:3000 en su navegador web. Detenga el servidor usando CTRL + C.

Ponga en contenedores la aplicación Express

Debe crear una imagen de contenedor para su aplicación Express para implementarla en el clúster de Kubernetes. Una imagen de contenedor contiene todas las dependencias y los archivos de aplicación esenciales para ejecutar el servicio. Para usar la imagen del contenedor en el clúster de Kubernetes, debe asegurarse de que pueda obtener la imagen. Esta sección demuestra los pasos para contener una aplicación Express y enviarla a DockerHub en un repositorio privado.

Crear un nuevo archivo llamado Dockerfile .

                      
                        # nano Dockerfile

                      
                    

El DockerFile declara los pasos para construir la imagen del contenedor.

Agregue los siguientes contenidos al archivo.

                      
                        FROM node:latest



WORKDIR /app



COPY package*.json ./

RUN npm install



COPY . .



EXPOSE 3000



CMD ["node", "app.js"]

                      
                    

Las instrucciones anteriores heredan la imagen del contenedor oficial de Node.js como imagen base. Usa /app como el directorio de trabajo y copia el package.json y el package-lock.json archivos usando un símbolo de comodín antes de ejecutar el npm install comando para instalar todas las dependencias. Luego copia todos los demás archivos de la aplicación, expone el puerto 3000 e inicia el servidor Express usando el node app.js dominio.

Crear un nuevo archivo llamado .dockerignore .

                      
                        # nano .dockerignore

                      
                    

El .dockerignore file declara la lista de archivos y directorios a ignorar mientras se construye la imagen para evitar la inclusión de datos innecesarios.

Agregue el siguiente contenido al archivo.

                      
                        node_modules/

                      
                    

Esto evita la copia de bibliotecas instaladas en la máquina host y obliga a Docker a instalar todas las bibliotecas en la sección de dependencias. Puede agregar cualquier otro archivo o directorio en este archivo para excluirlo de la imagen del contenedor.

Cree un nuevo repositorio privado en DockerHub.

  1. Ve a la Sitio web de DockerHub e inicie sesión en su cuenta.

  2. Navega a la pestaña “Repositorios” en el menú superior.

  3. Haga clic en el botón “Crear repositorio”.

  4. Enter un nombre para su repositorio y seleccione “Privado” de las opciones de visibilidad.

  5. Haga clic en el botón “Crear” para crear su nuevo repositorio privado.

Inicie sesión en la cuenta de DockerHub.

                      
                        # docker login

                      
                    

El comando anterior le solicita que ingrese sus credenciales de DockerHub para compilar y enviar la imagen en DockerHub.

Construye y empuja la imagen.

                      
                        # docker build -t DOCKERHUB_USERNAME/REPO_NAME:latest .

# docker push DOCKERHUB_USERNAME/REPO_NAME:latest

                      
                    

Los comandos anteriores compilan y envían la imagen a DockerHub. Debe enviar la imagen a un registro de contenedor para que cualquier servidor pueda extraer la imagen con autorización. Utilizará el repositorio de DockerHub para obtener la imagen del contenedor en un manifiesto de Kubernetes más adelante en las siguientes secciones.

Preparar el clúster de Kubernetes

Debe preparar el clúster de Kubernetes para implementar la aplicación Express instalando los complementos necesarios y creando algunos recursos. Esta sección muestra los pasos para instalar el ingress-nginx controlador, instale el cert-manager plugin y crea un ClusterIssuer recurso para emitir certificados de Let’s Encrypt.

Instala el ingress-nginx controlador y el cert-manager enchufar.

                      
                        # kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.5.1/deploy/static/provider/cloud/deploy.yaml

# kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.10.0/cert-manager.yaml

                      
                    

Los comandos anteriores instalan el ingress-nginx controlador y el cert-manager complemento en el clúster de Kubernetes utilizando los archivos de manifiesto oficiales. El ingress-nginx El controlador aprovisiona un complemento de balanceador de carga para manejar las solicitudes HTTP entrantes en el Ingress recursos.

Obtenga la dirección IP del balanceador de carga.

                      
                        # kubectl get services/ingress-nginx-controller -n ingress-nginx

                      
                    

Pueden pasar hasta 5 minutos antes de que el balanceador de carga esté listo. Puede confirmar la implementación yendo al portal del cliente, abriendo la página del clúster y navegando a la pestaña Recursos vinculados. Debería ver un nuevo recurso de equilibrador de carga vinculado al clúster. Debes apuntar el A registro para expresar.googlesyndication.com a la dirección IP del balanceador de carga.

Crear un nuevo archivo llamado le_clusterissuer.yaml .

                      
                        # nano le_clusterissuer.yaml

                      
                    

Agregue los siguientes contenidos al archivo.

                      
                        apiVersion: cert-manager.io/v1

kind: ClusterIssuer

metadata:

  name: letsencrypt-prod

spec:

  acme:

    server: https://acme-v02.api.letsencrypt.org/directory

    email: "YOUR_EMAIL"

    privateKeySecretRef:

      name: letsencrypt-prod

    solvers:

      - http01:

          ingress:

            class: nginx

                      
                    

El manifiesto anterior crea un ClusterIssuer recurso para emitir certificados de Let’s Encrypt. utiliza el HTTP01 solucionador de desafíos para verificar la propiedad. Debes cambiar el spec.acme.email valor a su dirección de correo electrónico.

Aplicar el archivo de manifiesto.

                      
                        # kubectl apply -f le_clusterissuer.yaml

                      
                    

Verifique la implementación.

                      
                        # kubectl get clusterissuer letsencrypt-prod

                      
                    

Cree el recurso secreto para las credenciales de DockerHub.

                      
                        # kubectl create secret docker-registry regcred --docker-username=DOCKERHUB_USER --docker-password=DOCKERHUB_PASS --docker-email=DOCKERHUB_EMAIL

                      
                    

El comando anterior crea un nuevo recurso secreto con sus credenciales de DockerHub, que utilizará en la siguiente sección para obtener la imagen que creó en la sección anterior.

Implementar la aplicación Express

Instala los complementos y complementos necesarios en la sección anterior, como el cert-manager complemento y el ingress-nginx controlador. También creó un nuevo recurso secreto que contiene las credenciales de DockerHub. Esta sección muestra los pasos para crear un nuevo Deployment recurso que usa la imagen del contenedor para generar el servidor Express dentro de los pods. Además, creas un Service recurso para exponer las conexiones dentro del clúster, y un Ingress recurso para configurar el acceso externo.

Crear un nuevo archivo llamado express-deployment.yaml .

                      
                        # nano express-deployment.yaml

                      
                    

declarar el Deployment recurso.

                      
                        apiVersion: apps/v1

kind: Deployment

metadata:

  name: express-deployment

spec:

  replicas: 3

  selector:

    matchLabels:

      name: express-app

  template:

    metadata:

      labels:

        name: express-app

    spec:

      imagePullSecrets:

        - name: regcred

      containers:

        - name: express

          image: DOCKERHUB_USERNAME/REPO_NAME:latest

          imagePullPolicy: Always

          ports:

            - containerPort: 3000

                      
                    

Esta parte crea un nuevo recurso de implementación llamado express-deployment que crea 3 pods iniciales utilizando la imagen del contenedor que creó en las secciones anteriores. utiliza el regcred recurso secreto para obtener las credenciales. Debes reemplazar el DOCKERHUB_USERNAME y el REPO_NAME valores con sus datos.

declarar el Service recurso.

                      
                        ---

apiVersion: v1

kind: Service

metadata:

  name: express-service

spec:

  ports:

    - name: http

      port: 80

      protocol: TCP

      targetPort: 3000

  selector:

    name: express-app

                      
                    

Esta parte crea un nuevo recurso de servicio llamado express-service que expone la conexión a los pods que ejecutan el servidor Express usando el name: express-app selector. Este recurso puede detectar los nuevos pods con el mismo selector incluso cuando la implementación se escala en el futuro.

declarar el Ingress recurso.

                      
                        ---

apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

  name: express-ingress

  annotations:

    kubernetes.io/ingress.class: nginx

    cert-manager.io/cluster-issuer: letsencrypt-prod

spec:

  tls:

    - secretName: express-tls

      hosts:

        - express.googlesyndication.com

  rules:

    - host: express.googlesyndication.com

      http:

        paths:

          - path: /

            pathType: Prefix

            backend:

              service:

                name: express-service

                port:

                  number: 80

                      
                    

Esta parte crea un nuevo recurso de ingreso llamado express-ingress que permite el acceso externo a la express-service recurso. utiliza el letsencrypt-prod recurso de emisor de clúster para emitir un nuevo certificado SSL para expresar.googlesyndication.com y almacenarlo como el express-tls recurso secreto.

Guarde el archivo usando CTRL + X y luego ENTER.

Aplicar el archivo de manifiesto.

                      
                        # kubectl apply -f express-deployment.yaml

                      
                    

El comando anterior crea los recursos de implementación, servicio e ingreso en el clúster.

Verifique la implementación.

                      
                        # kubectl get deployment express-deployment

# kubectl get svc express-service

# kubectl get ingress express-ingress

                      
                    

Ahora puede acceder a la aplicación Express abriendo https://express.googlesyndication.com en su navegador web. El certificado Let’s Encrypt almacenado en el express-tls recurso secreto asegura la aplicación. El ingress-nginx controlador maneja las renovaciones automáticas del certificado cuando se trata close a la fecha de caducidad.

Escale la implementación rápida

Esta sección muestra los pasos para aumentar o disminuir la cantidad de réplicas que se ejecutan para el recurso de implementación Express. Puede escalar su implementación para manejar de manera eficiente el tráfico entrante y evitar interrupciones.

Aumentar el número de réplicas.

                      
                        # kubectl scale deployment/express-deployment --replicas=6

                      
                    

El comando anterior aumenta el número de deployment/express-deployment réplicas a 6 .

Verifique el cambio.

                      
                        # kubectl get deployment express-deployment

# kubectl get pods 

                      
                    

Disminuir el número de réplicas.

                      
                        # kubectl scale deployment/express-deployment --replicas=2

                      
                    

El comando anterior aumenta el número de deployment/express-deployment réplicas a 2 .

Verifique el cambio.

                      
                        # kubectl get deployment express-deployment

# kubectl get pods 

                      
                    

También puede probar la tolerancia a fallas de su implementación eliminando cualquier pod en ejecución usando el kubectl delete pod dominio. Kubernetes detecta el cambio de estado y crea instantáneamente un nuevo pod para mantener la implementación en buen estado. El recurso de ingreso detecta nuevos pods que comienzan a atender las solicitudes entrantes en poco tiempo.

Conclusión

Este artículo demostró los pasos para crear un example aplicación usando Express, póngala en un contenedor e impleméntela en Vultr Kubernetes Engine. También lo guió a través de la instalación del cert-manager complemento para emitir certificados Let’s Encrypt y el ingress-nginx controlador para configurar el acceso externo.

Express se centra principalmente en el manejo de solicitudes HTTP. No incluye ninguna funcionalidad de base de datos específica porque el manejo de la base de datos es una preocupación aparte y puede variar según los requisitos del proyecto y la base de datos utilizada. Este artículo no cubrió la implementación del servidor de la base de datos por las mismas razones. Puede consultar el artículo MongoDB sobre Vultr Kubernetes Engine o utilizar el servicio Vultr Managed Database como backend de base de datos para su aplicación.

Más información

Título del artículo Nombre (opcional) Correo electrónico (opcional) Descripción

Enviar sugerencia

Related Posts