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.
-
Ve a la Sitio web de DockerHub e inicie sesión en su cuenta.
-
Navega a la pestaña “Repositorios” en el menú superior.
-
Haga clic en el botón “Crear repositorio”.
-
Enter un nombre para su repositorio y seleccione “Privado” de las opciones de visibilidad.
-
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