Créer et configurer des instances

Il existe deux manières de créer et configurer des instances Compute Engine en exécutant Container-Optimized OS de Google.

Pour les scénarios simples dans lesquels vous souhaitez exécuter un seul conteneur sur une VM ou sur chaque VM d'un groupe d'instances géré, vous pouvez spécifier une image de conteneur et des paramètres de configuration facultatifs lorsque vous définissez l'instance ou le modèle d'instance. Compute Engine crée l'instance avec la dernière version de Container-Optimized OS et lance le conteneur spécifié au démarrage de la VM.

Pour les scénarios avancés dans lesquels vous pouvez déployer plusieurs conteneurs et configurer les options Docker à l'aide de cloud-init, vous pouvez créer une instance Compute Engine avec votre choix d'image de Container-Optimized OS, puis procéder à la configuration selon les besoins.

Créer une instance simple

Utilisez cette méthode pour déployer un seul conteneur sur une VM à l'aide de la dernière version de Container-Optimized OS. Vous pouvez effectuer cette tâche à l'aide de la console Google Cloud ou de gcloud CLI.

Console

  1. Accédez à la page "Instances de VM".

    Accéder à la page Instances de VM

  2. Cliquez sur Créer une instance.

  3. Indiquez un Nom pour votre instance.

  4. Dans la section Conteneur, cochez la case Déployer une image de conteneur dans cette instance de VM.

  5. Spécifiez l'Image de conteneur à utiliser.

    • Vous pouvez spécifier une image provenant de Container Registry ou d'Artifact Registry. Exemple :
      • gcr.io/cloud-marketplace/google/nginx1:1.15 sélectionne une image de conteneur NGINX 1.15 à partir de Google Cloud Marketplace.
      • us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 sélectionne un exemple d'image hello-app dans Artifact Registry.
    • Si vous utilisez une image de conteneur de Docker Hub, spécifiez toujours le nom complet de l'image Docker. Par exemple, indiquez le nom d'image suivant pour déployer une image de conteneur Apache : docker.io/httpd:2.4.
  6. Vous pouvez également cliquer sur Options avancées des conteneurs. Pour plus d'informations, consultez la page Configurer des options pour exécuter votre conteneur.

  7. Cliquez sur Créer pour créer et démarrer l'instance, puis lancez le conteneur.

gcloud

Pour créer une instance de VM simple, exécutez la commande suivante :

gcloud compute instances create-with-container instance-name \
    --container-image image-name

Remplacez les éléments suivants :

  • instance-name : nom de la nouvelle instance.
  • image-name : nom de l'image du conteneur.

Par exemple, la commande suivante crée une nouvelle instance de VM nommée nginx-vm, qui lancera et exécutera l'image de conteneur gcr.io/cloud-marketplace/google/nginx1:1.15 :

gcloud compute instances create-with-container nginx-vm \
    --container-image gcr.io/cloud-marketplace/google/nginx1:1.15

De même, vous pouvez créer une instance de VM nommée hello-app, qui lancera et exécutera un exemple de conteneur dans Artifact Registry :

gcloud compute instances create-with-container hello-app \
--container-image us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0

Lorsque vous utilisez une image de conteneur de Docker Hub, vous devez toujours spécifier le nom complet de l'image Docker. Par exemple, indiquez le nom d'image suivant pour déployer une image de conteneur Apache :

docker.io/httpd:2.4

Pour exécuter un seul conteneur sur chaque VM d'un groupe d'instances géré, spécifiez le nom de l'image du conteneur lors de la définition du modèle d'instance. Pour en savoir plus, consultez la section Créer un modèle d'instance avec une image de conteneur.

Créer une instance pour des scénarios avancés

Utilisez cette méthode pour sélectionner une image Container-Optimized OS spécifique, déployer plusieurs conteneurs et utiliser cloud-init pour la configuration avancée.

Afficher les images disponibles

Les images Container-Optimized OS sont disponibles dans la liste des images de la console Google Cloud avec le préfixe cos. Elles sont hébergées dans le projet cos-cloud. Vous pouvez également voir toutes les versions actuellement disponibles sur la ligne de commande en exécutant la commande suivante :

gcloud compute images list --project cos-cloud --no-standard-images

Le résultat ressemble à ce qui suit :

NAME                       PROJECT    FAMILY      DEPRECATED  STATUS
cos-69-10895-385-0         cos-cloud  cos-69-lts              READY
cos-73-11647-534-0         cos-cloud  cos-73-lts              READY
cos-77-12371-251-0         cos-cloud  cos-77-lts              READY
cos-81-12871-103-0         cos-cloud  cos-81-lts              READY
cos-beta-81-12871-44-0     cos-cloud  cos-beta                READY
cos-dev-84-13078-0-0       cos-cloud  cos-dev                 READY
cos-stable-81-12871-103-0  cos-cloud  cos-stable              READY

Créer une instance

Vous pouvez créer une instance à l'aide de la console Google Cloud, de gcloud CLI ou de l'API.

Console

Pour exécuter une instance Compute Engine avec Container-Optimized OS et Docker installés, procédez comme suit :

  1. Ouvrez la page de création d'instance Compute Engine dans la console Google Cloud.

    Créer une instance Compute Engine

  2. Indiquez un Nom pour votre instance.

  3. Dans la section Conteneurs, décochez la case Déployer une image de conteneur dans cette instance de VM. Cette option est utile si vous souhaitez déployer un conteneur unique sur la VM.

  4. Dans la section Disque de démarrage, sélectionnez une image Container-Optimized OS.

  5. Cliquez sur Créer pour créer et démarrer l'instance.

gcloud

Vérifiez les images actuellement disponibles, puis utilisez la commande suivante pour créer une instance d'image de nœud cos :

gcloud compute instances create instance-name \
    --image image-name \
    --image-project cos-cloud \
    --zone compute-zone \
    --machine-type machine-type-name

Remplacez les éléments suivants :

  • instance-name : nom de votre instance de VM.
  • image-name : nom de l'image Container-Optimized OS de l'instance, obtenu à partir de la liste des images disponibles. Nous pouvons utiliser cos-beta-81-12871-44-0, spécifié dans notre exemple précédent.
  • compute-zone : zone de calcul de votre instance.
  • machine-type-name : type de machine à utiliser pour cette nouvelle instance. Le type par défaut est n1-standard-1.

Par exemple, la commande suivante crée une instance nommée cos-test en utilisant l'image cos-beta-67-10575-13-0 :

gcloud compute instances create cos-test \
    --image cos-beta-67-10575-13-0 \
    --image-project cos-cloud \
    --zone us-east1-d \
    --machine-type n1-standard-1

Si vous souhaitez utiliser l'image Container-Optimized OS dev, beta ou stable la plus récente, utilisez l'option --image-family comme suit :

gcloud compute instances create instance-name \
    --image-family cos-beta \
    --image-project cos-cloud \
    --zone compute-zone \
    --machine-type machine-type-name

Vous pouvez ajouter l'option --preemptible pour les instances expérimentales ponctuelles.

API

Dans l'API, créez une requête normale pour créer une instance, mais incluez une image source Container-Optimized OS. Exemple :

POST https://compute.googleapis.com/compute/v1/projects/project-id/zones/compute-zone/instances

{
  'machineType': 'zones/compute-zone/machineTypes/machine-type-name',
  'name': 'instance-name',
  'networkInterfaces': [
    {
      'accessConfigs': [
        {
          'type': 'ONE_TO_ONE_NAT',
          'name': 'External NAT'
        }
      ],
      'network': 'global/networks/default'
    }
  ],
  'disks': [
    {
      'type': 'PERSISTENT',
      'boot': true,
      'autoDelete': true,
      'initializeParams': {
        'sourceImage': 'projects/cos-cloud/global/images/family/cos-stable'
      }
    }
  ]
}

Configurer une instance

Dans certains cas, vous souhaiterez peut-être effectuer une configuration supplémentaire au démarrage de l'instance. Vous pouvez utiliser l'outil cloud-init avec Container-Optimized OS pour appliquer les informations de configuration que vous fournissez au format cloud-config.

Utiliser cloud-init avec le format de configuration Cloud

Les images Container-Optimized OS incluent cloud-init afin de configurer votre instance au démarrage. L'outil cloud-init attend sa configuration dans la valeur de la clé user-data des métadonnées de l'instance. L'outil cloud-init accepte plusieurs formats.

Voici un exemple de fichier cloud-init montrant comment créer un compte utilisateur et créer un service système appartenant à cet utilisateur qui contrôle la gestion d'un conteneur busybox Docker:

#cloud-config

users:
- name: cloudservice
  uid: 2000

write_files:
- path: /etc/systemd/system/cloudservice.service
  permissions: 0644
  owner: root
  content: |
    [Unit]
    Description=Start a simple docker container

    [Service]
    ExecStart=/usr/bin/docker run --rm -u 2000 --name=mycloudservice busybox:latest /bin/sleep 3600
    ExecStop=/usr/bin/docker stop mycloudservice
    ExecStopPost=/usr/bin/docker rm mycloudservice

runcmd:
- systemctl daemon-reload
- systemctl start cloudservice.service

# Optional once-per-boot setup. For example: mounting a PD.
bootcmd:
- fsck.ext4 -tvy /dev/[DEVICE_ID]
- mkdir -p /mnt/disks/[MNT_DIR]
- mount -t ext4 -O ... /dev/[DEVICE_ID] /mnt/disks/[MNT_DIR]

Pour créer une instance de VM Container-Optimized OS qui fait référence à ce fichier cloud-init, utilisez l'option de ligne de commande --metadata-from-file. En supposant que le fichier cloud-init s'appelle filename dans le répertoire actuel, la commande suivante crée une instance Container-Optimized OS et déclenche cloud-init en attribuant le contenu du fichier à la clé user-data dans les métadonnées d'instance :

gcloud compute instances create instance-name \
    --image-family cos-stable \
    --image-project cos-cloud \
    --metadata-from-file user-data=filename

Remplacez les éléments suivants :

  • instance-name : nom de votre instance de VM.
  • filename : nom du fichier de métadonnées.

Il est possible de définir d'autres options de métadonnées lors de la création d'instances Container-Optimized OS. Ces propriétés étant de simples paires clé/valeur, vous pouvez utiliser l'option --metadata dans la commande gcloud compute instances create pour les créer. En outre, à partir du jalon 97, vous pouvez définir des indicateurs de métadonnées dans les métadonnées du projet à l'aide de l'indicateur --metadata dans la commande gcloud compute project-info add-metadata. Les options définies au niveau de l'instance prévalent sur celles définies au niveau du projet.

Vous pouvez développer l'exemple précédent pour collecter des statistiques d'utilisation et la collecte des vidages d'erreur à l'aide de la commande suivante:

gcloud compute instances create instance-name \
    --image-family cos-stable \
    --image-project cos-cloud \
    --metadata-from-file user-data=filename \
    --metadata=cos-metrics-enabled=true

Autres indicateurs de métadonnées

Clé de métadonnée Description Comportement par défaut
cos-update-strategy Spécifie le comportement de mise à jour. La seule valeur acceptée est : update_disabled. Si ce champ n'est pas spécifié:
  • cos-dev et cos-beta: mises à jour de la dernière version de l'OS dans la famille d'images correspondante
  • Version LTS et cos-stable: mises à jour depuis la dernière version de l'OS à partir de la même version intermédiaire
cos-metrics-enabled Active la collecte des vidages sur plantage. Les valeurs peuvent être les suivantes :
true
false (par défaut).
Désactivé par défaut

Se connecter à une instance

Vous pouvez vous connecter en SSH à votre instance de VM en exécutant l'image de nœud cos de la même manière que lorsque vous vous connectez en SSH à d'autres instances Google Compute Engine.

Exemple :

gcloud compute ssh instance-name \
    --project project-id \
    --zone compute-zone

Exécuter des scripts de démarrage

Vous pouvez spécifier un script de démarrage via le serveur de métadonnées à l'aide de la clé de métadonnées startup-script. Vous pouvez utiliser la Google Cloud CLI, l'API ou la console Google Cloud pour fournir un script de démarrage. Pour en savoir plus, consultez la section Exécuter des scripts de démarrage.

Synchronisation horaire

Avant le jalon 85, Container-Optimized OS utilise le service systemd-timesyncd de systemd pour synchroniser l'horloge système locale avec un serveur NTP (Network Time Protocol) distant via le protocole SNTP. Les entrées suivantes du fichier de configuration /etc/systemd/timesyncd.conf indiquent les valeurs de configuration par défaut en commentaire pour aider l'administrateur à apporter les modifications souhaitées :

cat /etc/systemd/timesyncd.conf
# comments omitted for brevity
[Time]
#NTP=
#FallbackNTP=metadata.google.internal
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048

Ainsi, la distance racine acceptable est de 5 secondes, et les intervalles d'interrogation minimum et maximum pour les messages NTP sont de 32 et 2 048 secondes respectivement.

À partir du jalon 85, Container-Optimized OS utilise le service chronyd pour synchroniser l'horloge système locale avec un serveur NTP (Network Time Protocol) via le protocole NTP. Les entrées suivantes du fichier de configuration /etc/chrony/chrony.conf indiquent les valeurs de configuration par défaut en commentaire pour aider l'administrateur à apporter les modifications souhaitées :

cat /etc/chrony/chrony.conf
# Use custom NTP servers
server metadata.google.internal prefer iburst

# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift

# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3

# Enable kernel synchronization of the real-time clock (RTC).
rtcsync

Le serveur NTP est défini à partir de la réponse DHCP de eth0, qui est généralement le serveur de métadonnées de Compute Engine :

networkctl status eth0 | grep NTP
             NTP: 169.254.169.254

Changer le fuseau horaire

Le fuseau horaire par défaut de Container-Optimized OS par Google est UTC0. Créez un lien symbolique vers le fuseau horaire de votre choix, comme dans l'exemple suivant :

sudo rm /etc/localtime
sudo ln -s /usr/share/zoneinfo/US/Pacific /etc/localtime

Notez que /etc étant sans état, le fuseau horaire est réinitialisé sur la valeur par défaut (UTC0) à chaque redémarrage.

Désactiver les mises à jour automatiques

Il existe deux manières de désactiver les mises à jour automatiques. La méthode privilégiée consiste à utiliser la clé de métadonnées d'instance cos-update-strategy:

gcloud compute instances create instance-name \
    --image-family cos-stable \
    --image-project cos-cloud \
    --metadata cos-update-strategy=update_disabled

À partir du jalon 97, vous pouvez également désactiver les mises à jour automatiques dans les métadonnées du projet:

gcloud compute project-info add-metadata \
    --metadata cos-update-strategy=update_disabled

Vous pouvez également désactiver les mises à jour automatiques sur une instance en cours d'exécution avec systemctl :

sudo systemctl stop update-engine
sudo systemctl mask update-engine