En este documento, se proporciona una guía paso a paso para implementar una carga de trabajo basada en máquina virtual (VMs) en una instalación de Google Distributed Cloud (solo software) en equipos físicos con el entorno de ejecución de VM en GDC. La carga de trabajo que se usa en esta guía es la aplicación de ejemplo de punto de venta. Esta aplicación representa una terminal de punto de venta típica que se ejecuta en hardware local en una tienda minorista.
En este documento, migrarás esta aplicación de una VM a un clúster y accederás al frontend web de la aplicación. Para migrar una VM existente al clúster, primero se debe crear una imagen de disco de esa VM. Luego, la imagen debe alojarse en un repositorio al que el clúster pueda acceder. Por último, se puede usar la URL de esa imagen para crear la VM. El entorno de ejecución de VM en GDC espera que las imágenes estén en formato qcow2. Si proporcionas un tipo de imagen diferente, se convierte automáticamente al formato qcow2. Para evitar la conversión repetitiva
y habilitar la reutilización, puedes convertir una imagen de disco virtual y
alojar la qcow2 imagen.
En este documento, se usa una imagen preparada previamente de una instancia de VM de Compute Engine en la que la carga de trabajo se ejecuta como un servicio de systemd. Puedes seguir estos mismos pasos para implementar tu propia aplicación.
Objetivos
Antes de comenzar
Para completar este documento, necesitas los siguientes recursos:
- Acceso a un clúster de equipos físicos de la versión 1.12.0 o superior que se creó siguiendo la guía Instala con el balanceador de cargas manual. En este documento, se configuran los recursos de red para que puedas acceder a la carga de trabajo que se ejecuta dentro de la VM a través de un navegador. Si no necesitas ese comportamiento, puedes seguir este documento con cualquier instalación de Google Distributed Cloud en equipos físicos.
- Una estación de trabajo que cumpla con los siguientes requisitos:
Habilita el entorno de ejecución de VM en GDC y, luego, instala el
complemento virtctl
La definición de recurso personalizado del entorno de ejecución de VM en GDC forma parte de todos los clústeres de equipos físicos desde la versión 1.10. Ya se creó una instancia del recurso personalizado VMRuntime durante la instalación. Sin embargo, está inhabilitada de forma predeterminada.
Habilita el entorno de ejecución de VM en GDC:
sudo bmctl enable vmruntime --kubeconfig KUBECONFIG_PATH- KUBECONFIG_PATH: Es la ruta de acceso al archivo de configuración del clúster de usuario.
Valida que
VMRuntimeesté habilitado:kubectl wait --for=jsonpath='{.status.ready}'=true vmruntime vmruntimeEs posible que esto tarde algunos minutos para
VMRuntime. Si no está listo, verifica varias veces con demoras breves. En el siguiente ejemplo de resultado, se muestra queVMRuntimeestá listo:vmruntime.vm.cluster.gke.io/vmruntime condition metInstala el virtctl complemento para
kubectl:sudo -E bmctl install virtctlEn el siguiente ejemplo de resultado, se muestra que se completó el proceso de instalación del complemento
virtctl:Please check the logs at bmctl-workspace/log/install-virtctl-20220831-182135/install-virtctl.log [2022-08-31 18:21:35+0000] Install virtctl succeededVerifica la instalación del complemento
virtctl:kubectl virtEn el siguiente ejemplo de resultado, se muestra que el complemento
virtctlestá disponible para usarse conkubectl:Available Commands: addvolume add a volume to a running VM completion generate the autocompletion script for the specified shell config Config subcommands. console Connect to a console of a virtual machine instance. create Create subcommands. delete Delete subcommands. ...
Implementa la carga de trabajo basada en VM
Cuando implementas una VM en una instalación de Google Distributed Cloud (solo software) en equipos físicos, el entorno de ejecución de VM en GDC espera una imagen de VM. Esta imagen actúa como el disco de arranque de la VM implementada.
En este instructivo, migrarás una carga de trabajo basada en VM de Compute Engine a un clúster. Se creó esta VM de Compute Engine y se configuró la aplicación de ejemplo de punto de venta (PDV) para que se ejecute como un servicio de systemd. Se creó una imagen de disco de
esta VM junto con la carga de trabajo de la aplicación de PDV
en
en Google Cloud. Luego, esta imagen se exportó a un bucket de Cloud Storage como
una imagen qcow2. Usarás esta imagen qcow2 preparada previamente en los siguientes pasos.
El código fuente de este documento está disponible en el anthos-samples repositorio de GitHub. Usarás recursos de este repositorio para completar los pasos que siguen.
Implementa un
StatefulSetde MySQL. La aplicación de punto de venta espera conectarse a una base de datos de MySQL para almacenar información de pago e inventario. El repositorio de punto de venta tiene un manifiesto de ejemplo que implementa unStatefulSetde MySQL, configura unConfigMapasociado y unServicede Kubernetes. ElConfigMapdefine las credenciales de la instancia de MySQL, que son las mismas credenciales que se pasan a la aplicación de punto de venta.kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/point-of-sale/main/k8-manifests/common/mysql-db.yamlImplementa la carga de trabajo de la VM con la imagen
qcow2preparada previamente:kubectl virt create vm pos-vm \ --boot-disk-size=80Gi \ --memory=4Gi \ --vcpu=2 \ --image=https://storage.googleapis.com/pos-vm-images/pos-vm.qcow2Este comando crea un archivo YAML con el nombre de la VM (
google-virtctl/pos-vm.yaml). Puedes inspeccionar el archivo para ver la definición deVirtualMachineyVirtualMachineDisk. En lugar de usar el complementovirtctl, podrías haber implementado la carga de trabajo de la VM con definiciones del modelo de recursos de Kubernetes (KRM), como se ve en el archivo YAML creado.Cuando el comando se ejecuta correctamente, produce un resultado como el siguiente ejemplo que explica los diferentes recursos que se crearon:
Constructing manifest for vm "pos-vm": Manifest for vm "pos-vm" is saved to /home/tfadmin/google-virtctl/pos-vm.yaml Applying manifest for vm "pos-vm" Created gvm "pos-vm"Verifica el estado de creación de la VM.
El recurso
VirtualMachinese identifica con elvm.cluster.gke.io/v1.VirtualMachinerecurso en el entorno de ejecución de VM en GDC. La forma abreviada esgvm.Cuando creas una VM, se crean los siguientes dos recursos:
- Un VirtualMachineDisk es el disco persistente en el que se importa el contenido de la imagen de VM.
- Una VirtualMachine es la instancia de VM en sí. El DataVolume se activa en la VirtualMachine antes de que se inicie la VM.
Verifica el estado de VirtualMachineDisk. VirtualMachineDisk crea internamente un recurso
DataVolume. La imagen de VM se importa a DataVolume, que se activa en la VM:kubectl get datavolumeEn el siguiente ejemplo de resultado, se muestra el inicio de la importación de la imagen:
NAME PHASE PROGRESS RESTARTS AGE pos-vm-boot-dv ImportScheduled N/A 8sVerifica el estado de
VirtualMachine.VirtualMachineestá en el estadoProvisioninghasta que se importa por completoDataVolume:kubectl get gvmEn el siguiente ejemplo de resultado, se muestra el aprovisionamiento de
VirtualMachine:NAME STATUS AGE IP pos-vm Provisioning 1mEspera a que la imagen de VM se importe por completo a
DataVolume. Sigue observando el progreso mientras se importa la imagen:kubectl get datavolume -wEn el siguiente ejemplo de resultado, se muestra la importación de la imagen de disco:
NAME PHASE PROGRESS RESTARTS AGE pos-vm-boot-dv ImportInProgress 0.00% 14s ... ... pos-vm-boot-dv ImportInProgress 0.00% 31s pos-vm-boot-dv ImportInProgress 1.02% 33s pos-vm-boot-dv ImportInProgress 1.02% 35s ...Cuando se completa la importación y se crea
DataVolume, el siguiente ejemplo de resultado muestra laPHASEdeSucceeded:kubectl get datavolumeNAME PHASE PROGRESS RESTARTS AGE pos-vm-boot-dv Succeeded 100.0% 14m18sConfirma que se creó
VirtualMachinecorrectamente:kubectl get gvmSi la creación se realizó correctamente, el
STATUSmuestraRUNNING, como se muestra en el siguiente ejemplo, junto con la dirección IP de la VM:NAME STATUS AGE IP pos-vm Running 40m 192.168.3.250
Conéctate a la VM y verifica el estado de la aplicación
La imagen que se usa para la VM incluye la aplicación de ejemplo de punto de venta. La aplicación está configurada para iniciarse automáticamente en el arranque como un servicio de systemd. Puedes ver los archivos de configuración de los servicios de systemd en el pos-systemd-services directorio.
Conéctate a la consola de VM. Ejecuta el siguiente comando y presiona Intro⏎ después de ver el mensaje
Successfully connected to pos-vm…:kubectl virt console pos-vmEste comando produce el siguiente ejemplo de resultado que te solicita que ingreses los login details:
Successfully connected to pos-vm console. The escape sequence is ^] pos-from-public-image login:Usa la siguiente cuenta de usuario y contraseña. Esta cuenta se configuró dentro de la VM original desde la que se creó la imagen para el entorno de ejecución de VM en GDC VirtualMachine.
- Nombre de usuario de acceso:
abmuser - Contraseña:
abmworks
- Nombre de usuario de acceso:
Verifica el estado de los servicios de la aplicación de punto de venta. La aplicación de punto de venta incluye tres servicios: API, inventario y pagos. Todos estos servicios se ejecutan como servicios del sistema.
Los tres servicios se conectan entre sí a través de localhost. Sin embargo, la aplicación se conecta a la base de datos de MySQL con un servicio de Kubernetes mysql-db que se creó en el paso anterior. Este comportamiento significa que la VM se conecta automáticamente a la misma red que los
PodsyServices, lo que permite una comunicación fluida entre las cargas de trabajo de VM y otras aplicaciones en contenedores. No tienes que hacer nada adicional para que losServicesde Kubernetes sean accesibles desde las VMs implementadas con el entorno de ejecución de VM en GDC.sudo systemctl status pos*En el siguiente ejemplo de resultado, se muestra el estado de los tres servicios y el servicio de sistema raíz,
pos.service:● pos_payments.service - Payments service of the Point of Sale Application Loaded: loaded (/etc/systemd/system/pos_payments.service; enabled; vendor > Active: active (running) since Tue 2022-06-21 18:55:30 UTC; 1h 10min ago Main PID: 750 (payments.sh) Tasks: 27 (limit: 4664) Memory: 295.1M CGroup: /system.slice/pos_payments.service ├─750 /bin/sh /pos/scripts/payments.sh └─760 java -jar /pos/jars/payments.jar --server.port=8083 ● pos_inventory.service - Inventory service of the Point of Sale Application Loaded: loaded (/etc/systemd/system/pos_inventory.service; enabled; vendor> Active: active (running) since Tue 2022-06-21 18:55:30 UTC; 1h 10min ago Main PID: 749 (inventory.sh) Tasks: 27 (limit: 4664) Memory: 272.6M CGroup: /system.slice/pos_inventory.service ├─749 /bin/sh /pos/scripts/inventory.sh └─759 java -jar /pos/jars/inventory.jar --server.port=8082 ● pos.service - Point of Sale Application Loaded: loaded (/etc/systemd/system/pos.service; enabled; vendor preset: e> Active: active (exited) since Tue 2022-06-21 18:55:30 UTC; 1h 10min ago Main PID: 743 (code=exited, status=0/SUCCESS) Tasks: 0 (limit: 4664) Memory: 0B CGroup: /system.slice/pos.service Jun 21 18:55:30 pos-vm systemd[1]: Starting Point of Sale Application... Jun 21 18:55:30 pos-vm systemd[1]: Finished Point of Sale Application. ● pos_apiserver.service - API Server of the Point of Sale Application Loaded: loaded (/etc/systemd/system/pos_apiserver.service; enabled; vendor> Active: active (running) since Tue 2022-06-21 18:55:31 UTC; 1h 10min ago Main PID: 751 (api-server.sh) Tasks: 26 (limit: 4664) Memory: 203.1M CGroup: /system.slice/pos_apiserver.service ├─751 /bin/sh /pos/scripts/api-server.sh └─755 java -jar /pos/jars/api-server.jar --server.port=8081Sal de la VM. Para salir de la conexión de la consola, usa la secuencia de escape
^]presionandoCtrl + ].
Accede a la carga de trabajo basada en VM
Si tu clúster se configuró siguiendo la
guía Instala con el balanceador de cargas manual, ya tiene un recurso Ingress llamado pos-ingress creado. Este recurso enruta el tráfico de la dirección IP externa del balanceador de cargas de Ingress al servicio del servidor de API de la aplicación de ejemplo de punto de venta.
Si tu clúster no tiene este recurso
Ingress, créalo aplicando el siguiente manifiesto:kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/anthos-samples/main/anthos-bm-gcp-terraform/resources/manifests/pos-ingress.yamlCrea un
Servicede Kubernetes que enrute el tráfico a la VM. El recursoIngressenruta el tráfico a esteService:kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/anthos-samples/main/anthos-vmruntime/pos-service.yamlEn el siguiente ejemplo de resultado, se confirma la creación de un servicio:
service/api-server-svc createdObtén la dirección IP externa del balanceador de cargas
Ingress. El balanceador de cargasIngressenruta el tráfico según las reglas de recursosIngress. Ya tienes una reglapos-ingresspara reenviar solicitudes alServicedel servidor de API. EsteServicereenvía las solicitudes a la VM:INGRESS_IP=$(kubectl get ingress/pos-ingress -o jsonpath='{.status.loadBalancer.ingress[0].ip}') echo $INGRESS_IPEn el siguiente ejemplo de resultado, se muestra la dirección IP del balanceador de cargas
Ingress:172.29.249.159 # you might have a different IP addressAccede a la aplicación con la dirección IP del balanceador de cargas de Ingress en un navegador. En las siguientes capturas de pantalla de ejemplo, se muestra el quiosco de punto de venta con dos elementos. Puedes hacer clic en los elementos más de una vez si deseas pedir varios y realizar un pedido con el botón Pagar. Esta experiencia muestra que implementaste correctamente una carga de trabajo basada en VM en un clúster con el entorno de ejecución de VM en GDC.
Limpia
Puedes borrar todos los recursos que creaste en este instructivo o solo borrar la VM y conservar los recursos reutilizables. En Borra una VM , se explican las opciones disponibles en detalle.
Borrar todo
Borra el
VirtualMachinedel entorno de ejecución de VM en GDC junto con todos los recursos:kubectl virt delete vm pos-vm --allEn el siguiente ejemplo de resultado, se confirma la eliminación:
vm "pos-vm" used the following resources: gvm: pos-vm VirtualMachineDisk: pos-vm-boot-dv Start deleting the resources: Deleted gvm "pos-vm". Deleted VirtualMachineDisk "pos-vm-boot-dv".
Borra solo la VM
Si borras solo la VM, se conserva el
VirtualMachineDiskque se crea. Esto permite la reutilización de esta imagen de VM y ahorra tiempo dedicado a importar la imagen cuando se crea una VM nueva.kubectl virt delete vm pos-vmEn el siguiente ejemplo de resultado, se confirma la eliminación:
vm "pos-vm" used the following resources: gvm: pos-vm VirtualMachineDisk: pos-vm-boot-dv Start deleting the resources: Deleted gvm "pos-vm".
¿Qué sigue?
- La VM original que se usa en esta guía es una instancia de Compute Engine que ejecuta Ubuntu 20.04 LTS. Se puede acceder públicamente a la imagen de esta VM a través del pos-vm-images bucket de Cloud Storage. Para obtener más información sobre cómo se configuró la VM y se creó su imagen, consulta las instrucciones en el repositorio de punto de venta.
- Cuando creas una VM en un clúster con el comando
kubectl virt create vm pos-vm, se crea un archivo YAML con el nombre de la VM (google-virtctl/pos-vm.yaml). Puedes inspeccionar el archivo para ver la definición deVirtualMachineyVirtualMachineDisk. En lugar de usar el complementovirtctl, puedes implementar una VM con definiciones de KRM, como se ve en el archivo YAML creado.