Ce document fournit un guide par étapes pour déployer une charge de travail basée sur une machine virtuelle (VM) dans une installation de Google Distributed Cloud (logiciel uniquement) sur un serveur Bare Metal à l'aide de l'environnement d'exécution des VM sur GDC. La charge de travail utilisée dans ce guide est l'exemple d'application de point de vente. Cette application représente un terminal de point de vente type qui s'exécute sur du matériel sur site dans un magasin.
Dans ce document, vous allez migrer cette application d'une VM vers un cluster et accéder à l'interface Web de l'application. Pour migrer une VM existante vers le cluster, vous devez d'abord créer une image de disque de cette VM. L'image doit ensuite être hébergée dans un dépôt auquel le cluster peut accéder. Enfin, l'URL de cette image peut être utilisée pour créer la VM. L'environnement d'exécution de VM sur GDC s'attend à ce que les images soient au format qcow2. Si vous fournissez un autre type d'image, l'image est automatiquement convertie au format qcow2. Pour éviter les conversions répétitives et permettre la réutilisation, vous pouvez convertir une image de disque virtuel et héberger l'image qcow2.
Ce document utilise une image préconfigurée d'une instance de VM Compute Engine où la charge de travail s'exécute en tant que service systemd. Vous pouvez suivre les mêmes étapes pour déployer votre propre application.
Activez l'environnement d'exécution de VM sur GDC et installez le plug-in virtctl.
La définition de ressource personnalisée de l'environnement d'exécution de VM sur GDC fait partie de tous les clusters Bare Metal depuis la version 1.10. Une instance de la ressource personnalisée VMRuntime est déjà créée lors de l'installation. Toutefois, il est désactivé par défaut.
- Activez l'environnement d'exécution de VM sur GDC : - sudo bmctl enable vmruntime --kubeconfig KUBECONFIG_PATH- KUBECONFIG_PATH : chemin d'accès au fichier kubeconfig du cluster d'utilisateur.
 
- Vérifiez que - VMRuntimeest activé :- kubectl wait --for=jsonpath='{.status.ready}'=true vmruntime vmruntime- La préparation de - VMRuntimepeut prendre quelques minutes. Si ce n'est pas le cas, vérifiez plusieurs fois avec de courts délais. L'exemple de résultat suivant indique que- VMRuntimeest prêt :- vmruntime.vm.cluster.gke.io/vmruntime condition met
- Installez le plug-in virtctl pour - kubectl:- sudo -E bmctl install virtctl- L'exemple de résultat suivant montre que le processus d'installation du plug-in - virtctlest terminé :- Please check the logs at bmctl-workspace/log/install-virtctl-20220831-182135/install-virtctl.log [2022-08-31 18:21:35+0000] Install virtctl succeeded
- Vérifiez l'installation du plug-in - virtctl:- kubectl virt- L'exemple de résultat suivant montre que le plug-in - virtctlpeut être utilisé avec- kubectl:- 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. ...
Déployer la charge de travail basée sur une VM
Lorsque vous déployez une VM dans une installation de Google Distributed Cloud (logiciel uniquement) sur Bare Metal, l'environnement d'exécution de VM sur GDC attend une image de VM. Cette image sert de disque de démarrage pour la VM déployée.
Dans ce tutoriel, vous allez migrer une charge de travail basée sur une VM Compute Engine vers un cluster. Cette VM Compute Engine a été créée et l'exemple d'application de point de vente (PDV) a été configuré pour s'exécuter en tant que service systemd. Une image disque de cette VM ainsi que la charge de travail de l'application PoS ont été créées dans Google Cloud. Cette image a ensuite été exportée dans un bucket Cloud Storage en tant qu'image qcow2. Vous utiliserez cette image qcow2 pré-préparée dans les étapes suivantes.
Le code source de ce document est disponible dans le dépôt GitHub anthos-samples. Vous utiliserez les ressources de ce dépôt pour effectuer les étapes suivantes.
- Déployez un - StatefulSetMySQL. L'application de point de vente s'attend à se connecter à une base de données MySQL pour stocker les informations d'inventaire et de paiement. Le dépôt de point de vente contient un exemple de fichier manifeste qui déploie un- StatefulSetMySQL, configure un- ConfigMapassocié et un- ServiceKubernetes.- ConfigMapdéfinit les identifiants de l'instance MySQL, qui sont les mêmes identifiants transmis à l'application de point de vente.- kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/point-of-sale/main/k8-manifests/common/mysql-db.yaml
- Déployez la charge de travail de VM à l'aide de l'image - qcow2préparée :- kubectl virt create vm pos-vm \ --boot-disk-size=80Gi \ --memory=4Gi \ --vcpu=2 \ --image=https://storage.googleapis.com/pos-vm-images/pos-vm.qcow2- Cette commande crée un fichier YAML nommé d'après la VM ( - google-virtctl/pos-vm.yaml). Vous pouvez inspecter le fichier pour voir la définition de- VirtualMachineet- VirtualMachineDisk. Au lieu d'utiliser le plug-in- virtctl, vous auriez pu déployer la charge de travail de VM à l'aide des définitions du modèle de ressources Kubernetes (KRM), comme indiqué dans le fichier YAML créé.- Lorsque la commande s'exécute correctement, elle génère une sortie semblable à l'exemple suivant, qui explique les différentes ressources créées : - 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"
- Vérifiez l'état de la création de la VM. - La ressource - VirtualMachineest identifiée par la ressource- vm.cluster.gke.io/v1.VirtualMachinedans l'environnement d'exécution de VM sur GDC. Son format court est- gvm.- Lorsque vous créez une VM, les deux ressources suivantes sont créées : - VirtualMachineDisk est le disque persistant dans lequel le contenu de l'image de VM est importé.
- Une VirtualMachine est l'instance de VM elle-même. Le DataVolume est monté dans la VirtualMachine avant le démarrage de la VM.
 - Vérifiez l'état de VirtualMachineDisk. VirtualMachineDisk crée en interne une ressource - DataVolume. L'image de VM est importée dans le DataVolume monté dans la VM :- kubectl get datavolume- L'exemple de résultat suivant montre le début de l'importation d'image : - NAME PHASE PROGRESS RESTARTS AGE pos-vm-boot-dv ImportScheduled N/A 8s
- Vérifiez l'état du - VirtualMachine. L'- VirtualMachineest à l'état- Provisioningjusqu'à ce que l'- DataVolumesoit entièrement importé :- kubectl get gvm- L'exemple de résultat suivant montre le provisionnement de - VirtualMachine:- NAME STATUS AGE IP pos-vm Provisioning 1m
- Attendez que l'image de VM soit entièrement importée dans - DataVolume. Continuez à suivre la progression de l'importation de l'image :- kubectl get datavolume -w- L'exemple de résultat suivant montre l'importation de l'image disque : - 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 ...- Une fois l'importation terminée et le - DataVolumecréé, l'exemple de résultat suivant affiche le- PHASEde- Succeeded:- kubectl get datavolume- NAME PHASE PROGRESS RESTARTS AGE pos-vm-boot-dv Succeeded 100.0% 14m18s
- Vérifiez que - VirtualMachinea bien été créé :- kubectl get gvm- Si la création a réussi, - STATUSaffiche- RUNNING, comme indiqué dans l'exemple suivant, ainsi que l'adresse IP de la VM :- NAME STATUS AGE IP pos-vm Running 40m 192.168.3.250
Se connecter à la VM et vérifier l'état de l'application
L'image utilisée pour la VM inclut l'exemple d'application de point de vente. L'application est configurée pour démarrer automatiquement au démarrage en tant que service systemd. Vous pouvez consulter les fichiers de configuration des services systemd dans le répertoire pos-systemd-services.
- Connectez-vous à la console de VM. Exécutez la commande suivante et appuyez sur Entrée⏎ après avoir vu le message - Successfully connected to pos-vm…:- kubectl virt console pos-vm- Cette commande produit l'exemple de résultat suivant, qui vous invite à saisir les identifiants : - Successfully connected to pos-vm console. The escape sequence is ^] pos-from-public-image login:- Utilisez le compte utilisateur et le mot de passe suivants. Ce compte a été configuré dans la VM d'origine à partir de laquelle l'image de la VM VirtualMachine de l'environnement d'exécution de VM sur GDC a été créée. - Identifiant de connexion : abmuser
- Mot de passe : abmworks
 
- Identifiant de connexion : 
- Vérifiez l'état des services de l'application de point de vente. L'application de point de vente comporte trois services : API, inventaire et paiements. Tous ces services s'exécutent en tant que services système. - Les trois services sont tous connectés les uns aux autres via localhost. Toutefois, l'application se connecte à la base de données MySQL à l'aide d'un service Kubernetes mysql-db créé à l'étape précédente. Ce comportement signifie que la VM est automatiquement connectée au même réseau que - Podset- Services, ce qui permet une communication fluide entre les charges de travail de la VM et les autres applications conteneurisées. Vous n'avez rien à faire de plus pour rendre le- ServicesKubernetes accessible depuis les VM déployées à l'aide de VM Runtime sur GDC.- sudo systemctl status pos*- L'exemple de résultat suivant affiche l'état des trois services et du service système racine, - 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=8081
- Quittez la VM. Pour quitter la connexion à la console, utilisez la séquence d'échappement - ^]en appuyant sur- Ctrl + ].
Accéder à la charge de travail basée sur une VM
Si votre cluster a été configuré en suivant le guide Installer avec un équilibreur de charge manuel, une ressource Ingress appelée pos-ingress a déjà été créée. Cette ressource achemine le trafic depuis l'adresse IP externe de l'équilibreur de charge Ingress vers le service de serveur d'API de l'exemple d'application de point de vente.
- Si votre cluster ne dispose pas de cette ressource - Ingress, créez-la en appliquant le fichier manifeste suivant :- kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/anthos-samples/main/anthos-bm-gcp-terraform/resources/manifests/pos-ingress.yaml
- Créez un - ServiceKubernetes qui achemine le trafic vers la VM. La ressource- Ingressachemine le trafic vers ce- Service:- kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/anthos-samples/main/anthos-vmruntime/pos-service.yaml- L'exemple de résultat suivant confirme la création d'un service : - service/api-server-svc created
- Obtenez l'adresse IP externe de l'équilibreur de charge - Ingress. L'équilibreur de charge- Ingressachemine le trafic en fonction des règles de la ressource- Ingress. Vous disposez déjà d'une règle- pos-ingresspour transférer les requêtes vers le serveur d'API- Service. Ce- Servicetransfère les requêtes à la VM :- INGRESS_IP=$(kubectl get ingress/pos-ingress -o jsonpath='{.status.loadBalancer.ingress[0].ip}') echo $INGRESS_IP- L'exemple de résultat suivant indique l'adresse IP de l'équilibreur de charge - Ingress:- 172.29.249.159 # you might have a different IP address
- Accédez à l'application en utilisant l'adresse IP de l'équilibreur de charge d'entrée dans un navigateur. Les captures d'écran suivantes montrent le kiosque de point de vente avec deux articles. Vous pouvez cliquer sur les articles (plusieurs fois si vous souhaitez en commander plusieurs) et passer une commande avec le bouton Payer. Cette expérience montre que vous avez déployé une charge de travail basée sur une VM dans un cluster à l'aide de l'environnement d'exécution de VM sur GDC. 
