Aplicación web escalable en Kubernetes
Esta guía de aprendizaje puede incurrir en costes. Utilice Estimador de costes para generar una estimación del coste basada en el uso previsto.
Esta guía de aprendizaje le guía sobre cómo ejecutar una aplicación web localmente en un contenedor y luego desplegarla en un clúster de Kubernetes creado con Kubernetes Service. Como paso opcional, puede crear una imagen de contenedor y enviarla a un registro privado. Además, aprenderá a enlazar un subdominio personalizado, supervisar el estado del entorno y escalar la aplicación.
Los contenedores son una forma estándar de empaquetar apps y todas sus dependencias para poder moverlas entre entornos sin complicaciones. A diferencia de las máquinas virtuales, los contenedores no incorporan el sistema operativo. El contenedor solo contiene código de la app, tiempo de ejecución, herramientas del sistema, bibliotecas y valores. Los contenedores son más ligeros, portátiles y eficientes que una máquina virtual.
Objetivos
- Despliegue una aplicación web en el clúster de Kubernetes.
- Enlace de un subdominio personalizado.
- Supervisión de los registros y del estado del clúster.
- Escalado de pods de Kubernetes.
- Un desarrollador descarga o clona una aplicación web de ejemplo.
- Opcionalmente, cree la aplicación para producir una imagen de contenedor.
- Opcionalmente, la imagen se envía a un espacio de nombres en el IBM Cloud Container Registry.
- La aplicación se despliega en un clúster de Kubernetes.
- Los usuarios acceden a la aplicación.
Antes de empezar
Esta guía de aprendizaje requiere:
- CLI de IBM Cloud,
- plugin de IBM Cloud Kubernetes Service (
kubernetes-service),
- plugin de IBM Cloud Kubernetes Service (
kubectlpara interactuar con los clústeres de Kubernetes,Helm 3para desplegar diagramas.
Encontrará instrucciones para descargar e instalar estas herramientas para su entorno operativo en la guía de Iniciación a las guías de aprendizaje.
Para evitar la instalación de estas herramientas puede utilizar el Cloud Shell en la consola de IBM Cloud.
Además:
- Necesitará una instancia de Secrets Manager. Con Secrets Manager, puede crear, alquilar y gestionar de forma centralizada los secretos que se utilizan en los servicios de IBM Cloud o en las aplicaciones personalizadas. Los secretos se almacenan en una instancia dedicada de Secrets Manager y se puede utilizar en funciones para supervisar la caducidad, planificar o rotar manualmente los secretos. En este tutorial, utilizará un operador de Kubernetes para recuperar un certificado TLS de Secrets Manager e inyectarlo en un secreto Kubernetes. Puede utilizar una instancia existente si ya tiene una o crear una nueva siguiendo los pasos descritos en Creación de una instancia de servicio de Secrets Manager.
- Opcionalmente, configure un espacio de nombres de registro. Sólo es necesario si va a crear su propia imagen de contenedor personalizada.
- Comprenda los conceptos básicos de Kubernetes.
Habilitar la comunicación de servicio a servicio con Secrets Manager
La integración de Secrets Manager con el clúster IBM Cloud Kubernetes Service requiere autorización de comunicación de servicio a servicio. Siga estos pasos para configurar la autorización. Para obtener más información, consulte Integraciones para Secrets Manager.
- En la consola de IBM Cloud, pulse Gestionar > Acceso (IAM).
- Pulse Autorizaciones.
- Pulse Crear.
- En la lista Servicio de origen, seleccione Kubernetes Service.
- Seleccione la opción para limitar el acceso a Todos los recursos.
- En la lista Servicio de destino, seleccione Secrets Manager.
- Seleccione la opción para limitar el acceso a Todos los recursos.
- En la sección Acceso al servicio, marque la opción Gestor.
- Pulse Autorizar.
Creación de un clúster de Kubernetes
El IBM Cloud Kubernetes Service es una oferta gestionada para crear su propio clúster Kubernetes de hosts informáticos para desplegar y gestionar aplicaciones en contenedores en IBM Cloud. Un clúster mínimo con una (1) zona, un (1) nodo trabajador y el menor tamaño disponible (Tipo) son suficientes para esta guía de aprendizaje.
-
Abra los clústeres Kubernetes y haga clic en Crear clúster.
-
Cree un clúster a su elección de Infraestructura.
-
Los pasos siguientes son si selecciona VPC para Kubernetes en la infraestructura de VPC. Es necesario crear una VPC y una subred antes de crear el clúster de Kubernetes. Consulte la documentación Creación de clústeres de VPC para obtener más detalles.
- Pulse Crear VPC.
- En la sección Ubicación, seleccione una Geografía y una Región, por ejemplo,
EuropeyLondon. - Introduzca el nombre de su VPC, seleccione un grupo de recursos y, opcionalmente, añada etiquetas para organizar sus recursos.
- Deseleccione Permitir SSH y Permitir ping desde Grupo de seguridad predeterminado.
- Desmarque Crear subred en cada zona.
- Pulse Crear.
- En Zonas de trabajo y subredes, desmarque las dos zonas para las que no se ha creado la subred.
- Establezca los Nodos de trabajador por zona en
1y pulse Cambiar tipo para explorar y cambiar el tamaño de nodo trabajador de su elección. - En Ingress, habilite Gestión de secretos de Ingress y seleccione la instancia de Secrets Manager existente.
- Especifique un Nombre de clúster y seleccione el mismo Grupo de recursos que ha utilizado para la VPC.
- El registro o la supervisión no son necesarios en esta guía de aprendizaje, inhabilite estas opciones y pulse Crear.
- Mientras espera a que el clúster pase a estar activo, conecte una pasarela pública a la VPC. Vaya a Nubes privadas virtuales.
- Pulse el nombre de la VPC utilizada por el clúster y desplácese hacia abajo hasta la sección de subredes.
- Pulse el nombre de la subred creada anteriormente y, en la sección Public Gateway, pulse Desconectado para cambiar el estado a Conectar.
-
Los pasos siguientes son si selecciona Clásico para Kubernetes en la infraestructura clásica. Consulte la documentación Creación de un clúster clásico estándar para obtener más detalles.
- En la sección Ubicación, seleccione Geografía, Disponibilidad multizona y Metro, por ejemplo
EuropeyLondon. - En Zonas de trabajo y VLAN, desmarque todas las zonas excepto una.
- Establezca los Nodos de trabajador por zona en
1y pulse Cambiar tipo para explorar y cambiar el tamaño de nodo trabajador de su elección. - En Punto final de servicio maestro, seleccione Puntos finales privados y públicos.
- En Ingress, habilite Gestión de secretos de Ingress y seleccione la instancia de Secrets Manager existente.
- Especifique un Nombre de clúster y seleccione el Grupo de recursos bajo el que crear estos recursos.
- El registro o la supervisión no son necesarios en esta guía de aprendizaje, inhabilite estas opciones y pulse Crear.
- En la sección Ubicación, seleccione Geografía, Disponibilidad multizona y Metro, por ejemplo
-
Clonar una aplicación de ejemplo
En esta sección, clonarás un repositorio de GitHub con una sencilla aplicación de ejemplo NodeJS Helm con una página de destino y dos endpoints para empezar. Siempre puede ampliar la aplicación de ejemplo en función de sus necesidades.
- En un terminal, ejecute el mandato siguiente para clonar el repositorio GitHub:
git clone https://github.com/IBM-Cloud/kubernetes-node-app - Cambie al directorio de la aplicación:
cd kubernetes-node-app
Este código de aplicación de ejemplo contiene todos los archivos de configuración necesarios para el desarrollo local y el despliegue en Kubernetes.
Despliegue de la aplicación en el clúster mediante un diagrama de helm
Despliegue la aplicación con Helm 3
La imagen del contenedor para la aplicación ya ha sido creada y enviada a un registro público en el IBM Cloud Container Registry. En esta sección desplegará la aplicación de ejemplo utilizando Helm. Helm le ayuda a gestionar aplicaciones Kubernetes mediante diagramas de Helm, que ayudan a definir, instalar y actualizar incluso la aplicación Kubernetes más compleja.
Nota: Si desea construir y empujar la aplicación a su propio registro de contenedores puede utilizar la CLI Docker para hacerlo. El archivo Dockerfile se proporciona en el repositorio y las imágenes se pueden enviar al IBM Cloud Container
Registry o a cualquier otro registro de contenedores.
-
Defina una variable de entorno llamada
MYAPPy establezca el nombre de la aplicación sustituyendo el marcador de posición por sus iniciales:export MYAPP=<your-initials>kubenodeapp -
Identifique el clúster:
ibmcloud ks cluster ls -
Inicializa la variable con el nombre del cluster:
export MYCLUSTER=<CLUSTER_NAME> -
Inicialice el entorno
kubectlcli:ibmcloud ks cluster config --cluster $MYCLUSTERAsegúrese de que la CLI está configurada para la región y el grupo de recursos donde ha creado el clúster utilizando
ibmcloud target -r <region> -g <resource_group>. Para obtener más información sobre cómo tener acceso al clúster y configurar la CLI para ejecutar mandatos kubectl, consulte la sección Configuración de la CLI -
Puede utilizar el espacio de nombres de Kubernetes
defaulto crear un espacio de nombres nuevo para esta aplicación.- Si desea utilizar el espacio de nombres
defaultKubernetes, ejecute el siguiente comando para establecer una variable de entorno:export KUBERNETES_NAMESPACE=default - Si desea crear un espacio de nombres de Kubernetes nuevo, siga los pasos mencionados en las secciones Copiar un secreto de extracción de imágenes existente y Almacenamiento del secreto de extracción de imágenes en la cuenta de servicio de Kubernetes para el espacio de nombres seleccionado de la documentación
del servicio Kubernetes. Una vez completado, ejecute el siguiente comando:
export KUBERNETES_NAMESPACE=<KUBERNETES_NAMESPACE_NAME>
- Si desea utilizar el espacio de nombres
-
Cambie al directorio de gráficos bajo el directorio de su aplicación de ejemplo:
cd chart/kubernetesnodeapp -
Instale el diagrama de Helm:
helm install $MYAPP --namespace $KUBERNETES_NAMESPACE . --set image.repository=icr.io/solution-tutorials/tutorial-scalable-webapp-kubernetes -
Vuelva al directorio de aplicación de ejemplo:
cd ../..
Visualización de la aplicación
- Obtenga una lista de los servicios de Kubernetes del espacio de nombres:
kubectl get services -n $KUBERNETES_NAMESPACE - Enumera los pods Kubernetes en el espacio de nombres:
kubectl get pods -n $KUBERNETES_NAMESPACE
Utilización del dominio proporcionado por IBM para el clúster
Los clusters vienen con un dominio IBM. Esto le proporciona una mejor opción para exponer aplicaciones con un URL adecuado y en puertos HTTP/S estándares.
Utilice Ingress para configurar la conexión de entrada del clúster con el servicio.
-
Identifique los Subdominio Ingress y Secreto de Ingress proporcionados por IBM:
ibmcloud ks cluster get --cluster $MYCLUSTERpara encontrar
Ingress subdomain: mycluster.us-south.containers.appdomain.cloud Ingress secret: mycluster -
Defina la variable de entorno
INGRESS_SUBDOMAINpara que contenga el valor del subdominio de Ingress:export INGRESS_SUBDOMAIN=<INGRESS_SUBDOMAIN> -
Defina la variable de entorno
INGRESS_SECRETpara que contenga el valor del secreto de Ingress:export INGRESS_SECRET=<INGRESS_SECRET> -
En el directorio de la aplicación de ejemplo ejecute el siguiente comando bash para crear un archivo Ingress
ingress-ibmsubdomain.yamlque apunte al dominio IBM con soporte para HTTP y HTTPS:./ingress.sh ibmsubdomain_httpsEl archivo se genera a partir de un archivo de plantilla
ingress-ibmsubdomain-template.yamlen la carpeta yaml-templates sustituyendo todos los valores incluidos en los marcadores de posición ($) por los valores apropiados de las variables de entorno. -
Despliegue el Ingress:
kubectl apply -f ingress-ibmsubdomain.yaml -
Abra su aplicación en un navegador en
https://<myapp>.<ingress-subdomain>/o ejecute el siguiente comando para ver la salida HTTP:curl -I https://$MYAPP.$INGRESS_SUBDOMAIN
Utilice su propio subdominio personalizado
Esta sección requiere que sea propietario de su propio dominio personalizado. Deberá crear un registro CNAME que apunte al subdominio de entrada IBM para el clúster. Si el dominio es example.com, el CNAME <myapp>.<example.com> apuntará a <myapp>.<ingress-subdomain>.
con HTTP
- Cree una variable de entorno que apunte a su dominio personalizado:
export CUSTOM_DOMAIN=<example.com> - Cree un archivo Ingress
ingress-customdomain-http.yamlque apunte al dominio desde el archivo de plantillaingress-customdomain-http-template.yaml:./ingress.sh customdomain_http - Despliegue el Ingress:
kubectl apply -f ingress-customdomain-http.yaml - Acceda a su aplicación en
http://<myapp>.<example.com>/.
con HTTPS
Si intentaba acceder a su aplicación con HTTPS en este momento https://<myapp>.example.com/, es probable que obtenga un aviso de seguridad del navegador web que le indica que la conexión no es privada.
Ahora, importe el certificado en la instancia de Secrets Manager que ha configurado anteriormente en el clúster.
-
Acceda a la instancia del servicio Secrets Manager desde la Lista de recursos en Security.
-
Pulse Secretos en la navegación de la izquierda.
-
Pulse Añadir.
-
Puede seleccionar Certificado público, Certificado importado o Certificado privado. Los pasos detallados están disponibles en los temas de documentación respectivos: Solicitud de certificados públicos SSL/TLS, Importación de certificados SSL/TLS o Creación de certificados privados SSL/TLS. Si ha seleccionado importar un certificado, asegúrese de cargar el certificado, la clave privada y los archivos de certificado intermedios.
-
Localice la entrada del certificado importado o solicitado y púlsela.
- Compruebe que el nombre de dominio coincide con su $CUSTOM_DOMAIN. Si ha cargado un certificado comodín, el nombre de dominio incluye un asterisco.
- Haga clic en el icono de copia situado junto al CRN del certificado.
- Cree una variable de entorno que apunte al valor que acaba de copiar:
export CERTIFICATE_CRN=<certificate CRN> -
Cree un secreto de Ingress en el clúster para el certificado SSL/TLS:
ibmcloud ks ingress secret create --name nodeapp-tls-cert --cluster $MYCLUSTER --cert-crn $CERTIFICATE_CRN --namespace $KUBERNETES_NAMESPACE -
Cree una variable de entorno que apunte a su dominio personalizado:
export CUSTOM_DOMAIN=<example.com> -
Cree un archivo Ingress
ingress-customdomain-https.yamlque apunte a su dominio a partir de la plantillaingress-customdomain-https-template-sm.yaml:./ingress.sh customdomain_https_sm -
Despliegue el Ingress:
kubectl apply -f ingress-customdomain-https.yaml -
Acceda a su aplicación en
https://$MYAPP.$CUSTOM_DOMAIN/.
curl -I https://$MYAPP.$CUSTOM_DOMAIN
Supervisión del estado de la aplicación
- Para comprobar el estado de la aplicación, vaya a clústeres para ver una lista de clústeres y pulse su clúster.
- Pulse Panel de control de Kubernetes para iniciar el panel de control en un separador nuevo.
- Pulse Pods a la izquierda y, a continuación, pulse un pod-name que coincida con $MYAPP
- Examine el uso de CPU y memoria.
- Anote el nombre de IP de nodo.
- Pulse Ver registros en el menú de acciones de la parte superior derecha para ver la salida estándar y el error de la aplicación.
- Seleccione Nodos en el panel izquierdo, haga clic en el Nombre de un nodo anotado anteriormente y consulte los Recursos de asignación para ver la salud de sus nodos.
- Para llevar a cabo la ejecución en el contenedor, seleccione Ejecutar en en el menú de acciones.
Escalado de pods de Kubernetes
A medida que aumenta la carga en la aplicación, puede aumentar manualmente el número de réplicas de pod del despliegue. Las réplicas se gestionan mediante un ReplicaSet. Para escalar la aplicación a dos réplicas, ejecute el mandato siguiente:
kubectl scale deployment kubernetesnodeapp-deployment --replicas=2
Al poco tiempo, verá dos pods para su aplicación en el panel de control Kubernetes (o con kubectl get pods ). El controlador Ingress del clúster se encargará del equilibrio de carga entre las dos réplicas.
Con Kubernetes, puede activar el autoescalado horizontal de pods para aumentar o reducir automáticamente el número de instancias de sus aplicaciones en función de la CPU.
Para crear un escalador automático y definir su política, ejecute el mandato siguiente
kubectl autoscale deployment kubernetesnodeapp-deployment --cpu-percent=5 --min=1 --max=5
Una vez que el autoescalador se haya creado correctamente, debería ver
horizontalpodautoscaler.autoscaling/<deployment-name> autoscaled.
Eliminación de recursos
-
Suprima el programa de escalado automático de pod horizontal:
kubectl delete horizontalpodautoscaler.autoscaling/kubernetesnodeapp-deployment -
Suprima los recursos aplicados:
kubectl delete -f ingress-customdomain-https.yaml kubectl delete -f ingress-customdomain-http.yaml kubectl delete -f ingress-ibmsubdomain.yaml -
Suprima los artefactos de Kubernetes que se han creado para esta aplicación:
helm uninstall $MYAPP --namespace $KUBERNETES_NAMESPACE -
Suprima el secreto de Kubernetes:
kubectl -n $KUBERNETES_NAMESPACE delete secret kubernetesnodeapp-api-key -
Suprima el operador de secretos externos:
helm uninstall external-secrets -
Suprima el ID de servicio:
ibmcloud iam service-id-delete $SERVICE_ID -
Suprima el clúster.