IBM Cloud Docs
Traslado de una app basada en VM a Kubernetes

Traslado de una app basada en VM a 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 guiará por el proceso de mover una aplicación basada en VM a un clúster de Kubernetes utilizando Kubernetes Service. Kubernetes Service ofrece herramientas potentes combinando tecnologías de contenedor y Kubernetes, una experiencia de usuario intuitiva y una seguridad y aislamiento incorporados para automatizar el despliegue, el funcionamiento, el escalado y la supervisión de aplicaciones contenerizadas en un clúster de hosts de cálculo.

Las lecciones de esta guía de aprendizaje incluyen conceptos sobre cómo tomar una app existente, contener la app y desplegarla en un clúster de Kubernetes. Para contenerizar la app basada en VM, puede elegir entre las opciones siguientes.

  1. Identificar los componentes de una aplicación monolítica que pueden separarse en su propio microservicio. Puede contenerizar estos microservicios y desplegarlos en un clúster Kubernetes.
  2. Contenerice toda la app y despliéguela en un clúster de Kubernetes.

En función del tipo de app que tenga, los pasos para migrar la app pueden variar. Puede utilizar esta guía de aprendizaje para conocer ver los pasos generales que debe seguir y las cosas que debe tener en cuenta antes de migrar la app.

Objetivos

  • Comprenda cómo identificar microservicios en una aplicación basada en máquinas virtuales y aprenda a asignar componentes entre máquinas virtuales y Kubernetes.
  • Aprender a contenerizar una app basada en VM.
  • Aprender a desplegar el contenedor en un clúster de Kubernetes en Kubernetes Service.
  • Poner en práctica todo lo aprendido y ejecutar la app JPetStore en el clúster.

Arquitectura

Arquitectura de app tradicional con máquinas virtuales (VM)

En el diagrama siguiente se muestra un ejemplo de una arquitectura de app tradicional basada en máquinas virtuales.

Diagrama de la
de la aplicación tradicional*Diagrama de la arquitectura del

  1. El usuario envía una solicitud al punto final público de la app. El punto final público se representa mediante un servicio de equilibrador de carga que equilibra la carga del tráfico de red entrante entre las instancias disponibles del servidor de app.
  2. El equilibrador de carga selecciona una de las instancias de servidor de app que esté en buen estado que se ejecutan en una máquina virtual y reenvía la solicitud. Los archivos de la aplicación, como el código, los archivos de configuración y las dependencias, se almacenan en la máquina virtual del servidor de aplicaciones.
  3. El servidor de aplicaciones almacena los datos de la aplicación en una base de datos MySQL que se ejecuta en una máquina virtual de base de datos.

Arquitectura contenerizada

En el diagrama siguiente se muestra un ejemplo de una arquitectura de contenedor moderna que se ejecuta en un clúster de Kubernetes.

Diagrama de una arquitectura de contenedor moderna
Diagrama de una arquitectura de contenedor moderna

  1. El usuario envía una solicitud al punto final público de la app. El punto final público está representado por un equilibrador de carga de aplicación (ALB) Ingress que equilibra la carga del tráfico de red de entrada entre las pods de app del clúster. El ALB es una colección de reglas que permiten el tráfico de red de entrada en una app expuesta públicamente.
  2. El ALB reenvía la solicitud a uno de las pods de la app disponibles en el clúster. Las pods de la app se ejecutan en nodos trabajadores que pueden ser una máquina virtual o física.
  3. Los pods de la app almacenan datos en volúmenes persistentes. Los volúmenes persistentes se pueden utilizar para compartir datos entre instancias de la app o nodos trabajadores.
  4. Los pods de la app guardan los datos en un servicio de base de datos de IBM Cloud. Puede ejecutar su propia base de datos dentro del clúster de Kubernetes, pero una base de datos como servicio (DBaaS) gestionada suele ser más fácil de configurar y proporciona copias de seguridad integradas y funciones de escalado. Puede encontrar muchos tipos de bases de datos en el catálogo deIBM Cloud.

VM, contenedores y Kubernetes

Kubernetes Service proporciona la posibilidad de ejecutar apps en contenedores en clústeres de Kubernetes y proporciona las herramientas y funciones siguientes:

  • Experiencia de usuario intuitiva y herramientas potentes.
  • Seguridad y aislamiento integrados para permitir la entrega rápida de aplicaciones seguras.
  • Servicios en la nube que incluyen capacidades cognitivas de IBM® Watson™.
  • Capacidad para gestionar recursos de clúster dedicados tanto para aplicaciones sin estado como para cargas de trabajo con estado.

Máquinas virtuales frente a contenedores

Las apps tradicionales de VM se ejecutan en hardware nativo. Generalmente una sola app no utiliza todos los recursos de un solo host de cálculo. Muchas organizaciones intentan ejecutar varias apps en un solo host de cálculo para no malgastar recursos. Podría ejecutar varias copias de la misma app, pero, para proporcionar aislamiento, puede utilizar máquinas virtuales para ejecutar varias instancias de las apps (VM) en el mismo hardware. Estas máquinas virtuales tienen pilas completas de sistemas operativos que las hacen relativamente ineficientes debido a la duplicación tanto en tiempo de ejecución como en disco.

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.

Además, los contenedores le permiten compartir el sistema operativo del host. Esto reduce la duplicación al tiempo que proporciona aislamiento. Los contenedores también le permiten descartar los archivos innecesarios, como bibliotecas del sistema y binarios, para ahorrar espacio y reducir la superficie de ataque. Obtenga más información sobre máquinas virtuales y contenedores en ¿Qué son los contenedores?.

Orquestación de Kubernetes

Kubernetes es un orquestador de contenedores que gestiona el ciclo de vida de las aplicaciones en contenedores en un clúster de nodos de trabajo. Es posible que sus apps necesiten muchos otros recursos para ejecutarse, como por ejemplo volúmenes, redes y secretos, que le ayudarán a conectarse a otros servicios de nube y a claves seguras. Kubernetes le ayuda a añadir estos recursos a su app. El paradigma clave de Kubernetes es su modelo declarativo. El usuario proporciona el estado deseado y Kubernetes intenta ajustarse al estado descrito y luego lo mantiene.

Este taller de Kubernetes a su propio ritmo puede ayudarle a obtener su primera experiencia práctica con Kubernetes. Además, consulte la página de documentación Kubernetes conceptos para obtener más información sobre los conceptos de Kubernetes.

Qué hace IBM por usted

Si utiliza clústeres de Kubernetes con IBM Cloud Kubernetes Service, obtiene las siguientes ventajas:

  • Varios centros de datos donde puede desplegar sus clústeres.
  • Soporte para las opciones de red de entrada y de equilibrador de carga.
  • Soporte dinámico de volúmenes persistentes.
  • Nodos maestros de Kubernetes gestionados por IBM de alta disponibilidad.

Dimensionamiento de los clústeres

A medida que diseña la arquitectura del clúster, desea equilibrar los costes frente a disponibilidad, fiabilidad, complejidad y capacidad de recuperación. Los clústeres de Kubernetes de IBM Cloud Kubernetes Service proporcionan opciones arquitectónicas basadas en las necesidades de sus apps. Con una pequeña planificación, puede sacar el máximo provecho de los recursos de la nube sin planificar arquitecturas excesivas ni incurrir en un coste excesivo. Incluso si sobreestima o subestima, puede ampliar o reducir fácilmente su clúster, cambiando el número o el tipo de nodos trabajadores.

Para ejecutar una app de producción en la nube mediante Kubernetes, tenga en cuenta los elementos siguientes:

  1. ¿Espera tráfico procedente de una ubicación geográfica específica? Si es así, seleccione la ubicación que tenga más cerca físicamente para obtener el mejor rendimiento.
  2. ¿Cuántas réplicas de su clúster desea obtener una mayor disponibilidad? Un buen punto de partida podría ser tres clústeres: uno para desarrollo, uno para pruebas y otro para producción. Consulte la guía de soluciones Prácticas recomendadas para organizar recursos y asignar acceso para crear varios entornos.
  3. ¿Qué hardware necesita para los nodos trabajadores? ¿Máquinas virtuales o servidores nativos?
  4. ¿Cuántos nodos trabajadores necesita? Esto depende en gran medida de la escala de las apps; cuantos más nodos tenga, más resistente será su app.
  5. ¿Cuántas réplicas debería tener para conseguir una alta disponibilidad? Despliegue clústeres de réplicas en varias ubicaciones para aumentar la disponibilidad de la app y para proteger la app frente a un error en la ubicación.
  6. ¿Cuál es el conjunto mínimo de recursos que necesita tu aplicación para arrancar? Se recomienda probar la app para ver la cantidad de memoria y de CPU que necesita para ejecutarse. El nodo trabajador debe tener suficientes recursos para desplegar e iniciar la app. Luego asegúrese de establecer las cuotas de recursos como parte de las especificaciones de pod. Este valor es el que utiliza Kubernetes para seleccionar (o planificar) un nodo trabajador de modo que tenga suficiente capacidad para dar soporte a la solicitud. Realice una estimación de la cantidad de pods que se ejecutarán en el nodo trabajador y de los requisitos de recursos para dichos pods.
  7. ¿Cuándo aumentar el número de nodos trabajadores? Puede supervisar el uso del clúster y aumentar el número de nodos cuando sea necesario. Véase Supervisión del estado del clúster.
  8. ¿Necesita almacenamiento redundante y fiable? En caso afirmativo, cree una reclamación de volumen persistente para almacenamiento NFS o vincule un servicio de base de datos IBM Cloud a su pod.
  9. ¿Necesita desplegar un clúster en la infraestructura de nube privada virtual o en la infraestructura clásica? VPC le proporciona la seguridad de un entorno de nube privado con la escalabilidad dinámica de una nube pública.

Para concretar los pasos anteriores, supongamos que desea ejecutar una aplicación web de producción en la nube y espera una carga de tráfico de moderada a alta. Vamos a explorar qué recursos necesitará:

  1. Configure tres clústeres: uno para desarrollo, uno para pruebas y otro para producción.
  2. Los clústeres de desarrollo y pruebas pueden comenzar con una opción mínima de RAM y CPU (por ejemplo, 2 CPU, 4GB de RAM y un nodo trabajador para cada clúster).
  3. En el caso del clúster de producción, es posible que desee disponer de más recursos para obtener un mejor rendimiento, alta disponibilidad y resistencia. Podríamos elegir una opción dedicada o incluso bare metal y tener al menos 4 CPU, 16GB de RAM y dos nodos de trabajadores.

Decisión sobre qué opción de base de datos utilizar

Con Kubernetes, tiene dos opciones para manejar bases de datos:

  1. Puede ejecutar la base de datos dentro del clúster de Kubernetes; para ello tendría que crear un microservicio para ejecutar la base de datos. Por ejemplo, si utiliza una base de datos MySQL, tendría que completar los pasos siguientes:
    • Crear un MySQL Dockerfile, ver un ejemplo de MySQL Dockerfile aquí.
    • Necesitaría utilizar secretos para almacenar la credencial de la base de datos. Consulte el ejemplo de este aquí.
    • Necesitaría un archivo deployment.yaml con la configuración de la base de datos para desplegarse en Kubernetes. Consulte el ejemplo de este aquí.
  2. La segunda opción sería utilizar la opción de base de datos como servicio (DBaaS) gestionada. Esta opción suele ser más fácil de configurar y proporciona copias de seguridad y escalado incorporadas. Puede encontrar muchos tipos de bases de datos en el catálogo deIBM Cloud. Para utilizar esta opción, tendría que hacer lo siguiente:

Decisión sobre dónde almacenar los archivos de la aplicación

Kubernetes Service proporciona varias opciones para almacenar y compartir datos entre los pods. No todas las opciones de almacenamiento ofrecen el mismo nivel de persistencia y de disponibilidad en situaciones de desastre.

Almacenamiento de datos no persistente

Los contenedores y pods son, por diseño, efímeros y pueden fallar inesperadamente. Puede almacenar datos en el sistema de archivos local de un contenedor. Los datos que hay dentro de un contenedor no se pueden compartir con otros contenedores o pods y se pierden cuando el contenedor se bloquea o se elimina.

Más información sobre cómo crear almacenamiento de datos persistente para la app

Puede persistir los datos de la aplicación y los datos del contenedor en el almacenamiento de archivos NFS o en el almacenamiento de bloques mediante el uso de volúmenes persistentes nativos Kubernetes.

Para suministrar almacenamiento en bloque o almacenamiento de archivos NFS, debe solicitar almacenamiento para el pod mediante la creación de una reclamación de volumen persistente (PVC). En su PVC, puede elegir entre clases de almacenamiento predefinidas que definen el tipo de almacenamiento, la capacidad de almacenamiento en gigabytes, las IOPS, la política de retención de datos y los permisos de lectura y escritura para su almacenamiento. Una PVC suministra de forma dinámica un volumen persistente (PV) que representa un dispositivo de almacenamiento real en IBM Cloud. Puede montar la PVC en su pod para leer y escribir en el PV. Los datos que se almacenan en los PV están disponibles, incluso si el contenedor se bloquea o se replanifica el pod. IBM agrupa en clústeres el almacenamiento de archivos NFS y el almacenamiento de bloques que respalda la PV para proporcionar alta disponibilidad a sus datos.

Para obtener información sobre cómo crear una PVC, siga los pasos de la documentación del almacenamiento de Kubernetes Service.

Más información sobre cómo mover los datos existentes al almacenamiento persistente

Para copiar los datos de la máquina local en el almacenamiento persistente, debe montar la PVC en un pod. A continuación, puede copiar los datos de la máquina local en el volumen persistente en el pod.

  1. Para copiar datos, en primer lugar, debería crear una configuración que se parezca a algo así:

    kind: Pod
    apiVersion: v1
    metadata:
      name: task-pv-pod
    spec:
      volumes:
        - name: task-pv-storage
          persistentVolumeClaim:
           claimName: mypvc
      containers:
        - name: task-pv-container
          image: nginx
          ports:
            - containerPort: 80
              name: "http-server"
          volumeMounts:
            - mountPath: "/mnt/data"
              name: task-pv-storage
    
  2. A continuación, para copiar los datos de la máquina local en el pod, utilice un mandato como este:

     kubectl cp <local_filepath>/<filename> <namespace>/<pod>:<pod_filepath>
    
  3. Copiar datos de un pod del clúster en la máquina local:

    kubectl cp <namespace>/<pod>:<pod_filepath>/<filename> <local_filepath>/<filename>
    

Configuración de copias de seguridad para el almacenamiento persistente

Las comparticiones de archivos y el almacenamiento en bloque se suministran en la misma ubicación que su clúster. IBM aloja el almacenamiento propiamente dicho en servidores en clúster para proporcionar alta disponibilidad. Sin embargo, no se realizan automáticamente copias de seguridad de las comparticiones de archivo ni del almacenamiento en bloque, y pueden no resultar accesibles si falla toda la ubicación. Para evitar que los datos se pierdan o se dañen, puede configurar copias de seguridad periódicas que puede utilizar para restaurar los datos cuando sea necesario.

Para obtener más información, consulte Planificación de opciones de almacenamiento para el almacenamiento de archivos NFS y el almacenamiento de bloques.

Preparación del código

Aplicación de los principios de 12 factores

La aplicación de doce factores es una metodología para crear aplicaciones nativas en la nube. Cuando quiera contenerizar una app, mover dicha app a la nube y orqueste la app con Kubernetes; es importante entender y aplicar algunos de estos principios. Algunos de estos principios son necesarios en IBM Cloud.

Se necesitan los siguientes principios clave:

  • Código base: se realiza un seguimiento de todo el código fuente y de todos los archivos de configuración dentro de un sistema de control de versiones (por ejemplo, un repositorio GIT), lo cual es necesario si se utiliza un conducto DevOps para el despliegue.
  • Creación, release, ejecución: la app de 12 factores utiliza una separación estricta entre las etapas de creación, release y ejecución. Esto se puede automatizar con un conducto de entrega DevOps integrado para compilar y probar la app antes de desplegarla en el clúster. Consulte la guía de aprendizaje sobre cómo desplegar una app en Kubernetes para aprender a configurar un conducto de integración y entrega continuo. Abarca la configuración del control de código fuente, las fases de compilación, prueba y despliegue, y muestra cómo añadir integraciones como escáneres de seguridad, notificaciones y análisis.
  • Configuración: toda la información sobre configuración se almacena en variables de entorno. No se codifica ninguna credencial de servicio dentro del código de la app. Para almacenar credenciales, puede utilizar secretos de Kubernetes. Más sobre las credenciales más adelante.

Almacenamiento de credenciales en secretos de Kubernetes

Nunca resulta recomendable almacenar credenciales dentro del código de la app. En su lugar, Kubernetes proporciona los llamados "secretos" que contienen información sensible, como contraseñas, tokens OAuth o claves SSH. Los secretos de Kubernetes están cifrados de forma predeterminada, lo que hace que los secretos constituyan una opción más segura y flexible para almacenar datos confidenciales que almacenar estos datos en una definición de pod o en una imagen de contenedor.

Una forma de usar secretos en Kubernetes es realizando algo parecido a lo siguiente:

  1. Cree un archivo denominado cloud-secrets.txt y almacenen las credenciales de servicio de todos los servicios de nube.

    {
        "url": "<SERVICE_URL>",
        "api_key": <API_Key>
    }
    
  2. A continuación, cree un secreto Kubernetes ejecutando el siguiente comando y verifique que el secreto se ha creado utilizando kubectl get secrets después de ejecutar el siguiente comando:

    kubectl create secret generic cloud-service-secret --from-file=cloud-secrets.txt=./cloud-secrets.txt
    

Contenerización de la app

Para contenerizar la app, debe crear una imagen de contenedor.

Una imagen se crea a partir de un Dockerfile, que es un archivo que contiene instrucciones y comandos para construir la imagen. Un Dockerfile podría hacer referencia a los artefactos de compilación en sus instrucciones que se almacenan por separado, como por ejemplo una app, la configuración de la app y sus dependencias.

Para crear su propio Dockerfile para la app existente, puede utilizar los mandatos siguientes:

  • FROM - elegir una imagen padre para definir el tiempo de ejecución del contenedor.
  • ADD/COPY - copiar el contenido de un directorio en el contenedor.
  • WORKDIR - definir el directorio de trabajo dentro del contenedor.
  • RUN - instalar los paquetes de software que necesitan las apps durante el tiempo de ejecución.
  • EXPOSE - hacer que un puerto esté disponible fuera del contenedor.
  • ENV NAME - definir variables de entorno.
  • CMD - definir mandatos que se ejecutan cuando se inicia el contenedor.

Las imágenes suelen almacenarse en un registro que puede ser de acceso público (registro público) o de acceso limitado para un grupo de usuarios (registro privado). Los registros públicos, como por ejemplo Docker Hub, se pueden utilizar para empezar a trabajar con Docker y Kubernetes para crear la primera app contenerizada de un clúster. Pero, cuando se trata de apps de empresa, utilice un registro privado, como el que se proporciona en IBM Cloud Container Registry, para proteger las imágenes de ser utilizadas y cambiadas por usuarios no autorizados.

Para contenerizar una app y almacenarla en IBM Cloud Container Registry:

  1. Necesitarías crear un Dockerfile, el siguiente código es un ejemplo de un Dockerfile.
    # Build JPetStore war
    FROM openjdk:8 as builder
    COPY . /src
    WORKDIR /src
    RUN ./build.sh all
    
    # Use WebSphere Liberty base image from the Docker Store
    FROM websphere-liberty:latest
    
    # Copy war from build stage and server.xml into image
    COPY --from=builder /src/dist/jpetstore.war /opt/ibm/wlp/usr/servers/defaultServer/apps/
    COPY --from=builder /src/server.xml /opt/ibm/wlp/usr/servers/defaultServer/
    RUN mkdir -p /config/lib/global
    COPY lib/mysql-connector-java-3.0.17-ga-bin.jar /config/lib/global
    
  2. Una vez que se ha creado un Dockerfile, deberá crear la imagen del contenedor y enviarla a IBM Cloud Container Registry. Puede crear un contenedor con un mandato como el siguiente:
    docker build . -t <image_name>
    docker push <image_name>
    

Despliegue de la app en un clúster de Kubernetes

Una vez que se ha creado una imagen de contenedor y se ha enviado a la nube, debe desplegarla en el clúster de Kubernetes. Para ello debe crear un archivo deployment.yaml.

Más información sobre cómo crear un archivo yaml de despliegue de Kubernetes

Para crear archivos deployment.yaml de Kubernetes, tiene que hacer algo parecido a esto:

  1. Cree un archivo deployment.yaml, aquí hay un ejemplo de un archivo deployment YAML.

  2. En su archivo deployment.yaml, puede definir cuotas de recursos para sus contenedores con el fin de especificar cuánta CPU y memoria necesita cada contenedor para iniciarse correctamente. Si los contenedores tienen cuotas de recursos especificadas, el planificador de Kubernetes puede tomar mejores decisiones acerca del nodo trabajador en el que colocar sus pods.

  3. A continuación, puede utilizar los siguientes comandos para crear y ver el despliegue y los servicios creados:

    kubectl create -f <filepath/deployment.yaml>
    kubectl get deployments
    kubectl get services
    kubectl get pods
    

Resumen

En esta guía de aprendizaje, ha aprendido lo siguiente:

  • Las diferencias entre las VM, los contenedores y Kubernetes.
  • Cómo definir clústeres para distintos tipos de entorno (desarrollo, prueba y producción).
  • Cómo manejar el almacenamiento de datos y la importancia del almacenamiento de datos persistente.
  • Cómo aplicar los principios de 12 factores a su app y cómo utilizar secretos para credenciales en Kubernetes.
  • Cómo crear imágenes de contenedor y enviarlas a IBM Cloud Container Registry.
  • Cómo crear archivos de despliegue de Kubernetes y desplegar la imagen de contenedor en Kubernetes.

Puesta en práctica de todo lo aprendido, ejecución de la app JPetStore en el clúster

Para poner en práctica todo lo aprendido, siga la demostración para ejecutar la aplicación JPetStore en su clúster y aplicar los conceptos aprendidos. La app JPetStore tiene ciertas funciones ampliadas que le permiten ampliar una app en Kubernetes ejecutando la clasificación de imágenes como microservicio independiente.