Partager via


Créer une image pour une machine virtuelle Azure Operator Nexus

Dans cet article, vous allez découvrez comment créer une image conteneur qui peut être utilisée pour créer une machine virtuelle dans Operator Nexus. En particulier, vous découvrez comment ajouter un disque virtuel à l’image conteneur. Une fois l’image conteneur générée et envoyée (push) à un registre de conteneurs Azure, elle peut être utilisée pour créer une machine virtuelle dans Operator Nexus.

Prérequis

Avant de commencer à créer une image de machine virtuelle, vérifiez que les prérequis suivants sont satisfaits :

  • Installez la dernière version des extensions Azure CLI nécessaires.

  • Cet article nécessite la version 2.49.0 ou ultérieure d’Azure CLI. Si vous utilisez Azure Cloud Shell, la version la plus récente est déjà installée.

  • Azure Container Registry (ACR) : Créez un registre de conteneurs Azure fonctionnel pour stocker et gérer vos images conteneur. ACR fournit un registre sécurisé et privé pour stocker des images Docker utilisées dans votre processus de création d’images de machine virtuelle. Vous pouvez créer un ACR en suivant la documentation officielle d’Azure Container Registry.

  • Docker : Docker installé sur votre machine locale. Docker est une plateforme qui vous permet de générer, empaqueter et distribuer des applications en tant que conteneurs légers. Vous utilisez Docker pour générer et empaqueter votre image de machine virtuelle. Vous pouvez télécharger Docker depuis le site web officiel de Docker.

Remarque

Vous pouvez utiliser la commande az login pour vous authentifier auprès d’Azure ; le script va alors effectuer automatiquement la connexion à ACR en utilisant le nom du registre de conteneurs Azure et l’ID d’abonnement fournis. Si Azure CLI n’est pas installé sur votre machine, vous pouvez fournir à la place votre nom d’utilisateur et votre mot de passe pour la connexion à ACR.

Vérifiez que vous disposez d’un registre de conteneurs Azure opérationnel et de Docker installé sur votre machine avant de procéder à la création d’une image de machine virtuelle. Familiarisez-vous avec l’utilisation et les fonctionnalités d’ACR et Docker, car elles sont essentielles pour gérer vos images conteneur et pour générer l’image de machine virtuelle.

Exigences pour l’image de machine virtuelle

  • Vérifiez que votre image de fonction réseau virtualisée (VNF, Virtual Network Function) est au format qcow2, qui peut démarrer avec cloud-init.

  • Vous devez configurer le chargeur de démarrage, le noyau et le système init dans votre image pour activer une console série texte. Cette configuration est nécessaire pour activer la prise en charge de la console pour votre machine virtuelle. Vérifiez que la correspondance des paramètres de port série sur votre système et sur votre terminal pour établir une communication appropriée.

  • Vous devez vérifier que votre image de machine virtuelle prend en charge cloud-init version 2, qui donne accès aux options de configuration avancées pendant le processus d’initialisation de la machine virtuelle.

  • Vous devez vérifier que votre image de machine virtuelle inclut cloud-init avec la source de données nocloud. La source de données nocloud permet une configuration et une personnalisation initiales lors de l’approvisionnement d’une machine virtuelle.

  • Les disques doivent être placés dans le répertoire /disk à l’intérieur du conteneur.

  • Les formats Raw and qcow2 sont pris en charge. Qcow2 est recommandé pour réduire la taille de l’image conteneur.

  • Les disques de conteneur doivent être basés sur l’image scratch, qui est une image de base vide qui ne contient aucun fichier ou répertoire autre que l’image elle-même. L’utilisation de scratch comme image de base garantit que l’image conteneur est aussi petite que possible et seulement les fichiers nécessaires pour la fonction réseau virtualisée.

Étapes pour créer une image pour une machine virtuelle Operator Nexus

Vous pouvez créer une image pour votre fonction réseau virtualisée en utilisant le script fourni. Il génère un Dockerfile qui copie le fichier image du disque de la fonction réseau virtualisée dans le répertoire /disk du conteneur.

Remarque

Le script suivant est fourni à titre d’exemple. Si vous préférez, vous pouvez créer et envoyer (push) l’image conteneur manuellement au lieu d’utiliser le script.

Les variables d’environnement suivantes sont utilisées afin de configurer le script pour la création d’une image de machine virtuelle pour votre fonction réseau virtualisée. Modifiez et exportez ces variables avec vos propres valeurs avant d’exécuter le script :


# Azure subscription ID (provide if not using username-password)
export SUBSCRIPTION="your_subscription_id"

# (Mandatory) Azure Container Registry name
export ACR_NAME="your_acr_name"

# (Mandatory) Name of the container image
export CONTAINER_IMAGE_NAME="your_container_image_name"

# (Mandatory) Tag for the container image
export CONTAINER_IMAGE_TAG="your_container_image_tag"

# (Mandatory) VNF image (URL, local file, or full local path)
export VNF_IMAGE="your_vnf_image"

# (Optional) ACR URL (leave empty to derive from ACR_NAME)
export ACR_URL=""

# (Optional) ACR login username (provide if not using subscription)
export USERNAME=""

# (Optional) ACR login password (provide if not using subscription)
export PASSWORD=""

Pour créer une image de machine virtuelle pour votre fonction réseau virtualisée, enregistrez le script fourni en tant que create-container-disk.sh, définissez les variables d’environnement requises, puis exécutez le script.

#!/bin/bash

# Define the required environment variables
required_vars=(
    "ACR_NAME"                  # Azure Container Registry name
    "CONTAINER_IMAGE_NAME"      # Name of the container image
    "CONTAINER_IMAGE_TAG"       # Tag for the container image
    "VNF_IMAGE"                 # VNF image (URL or file path)
)

# Verify if required environment variables are set
for var in "${required_vars[@]}"; do
    if [ -z "${!var}" ]; then
        echo "Error: $var environment variable is not set."
        exit 1
    fi
done

# Check if either SUBSCRIPTION or USERNAME with PASSWORD is provided
if [ -z "$SUBSCRIPTION" ] && [ -z "$USERNAME" ] && [ -z "$PASSWORD" ]; then
    echo "Error: Either provide SUBSCRIPTION or USERNAME with PASSWORD."
    exit 1
fi

# Set default value for DOCKERFILE_NAME if not set
if [ -z "$DOCKERFILE_NAME" ]; then
    DOCKERFILE_NAME="nexus-vm-img-dockerfile"
fi

# Check if ACR_URL is already set by the user
if [ -z "$ACR_URL" ]; then
    # Derive the ACR URL from the ACR_NAME
    ACR_URL="$ACR_NAME.azurecr.io"
fi

# Initialize variables for downloaded/copied files
downloaded_files=()

# Function to clean up downloaded files
cleanup() {
    for file in "${downloaded_files[@]}"; do
        if [ -f "$file" ]; then
            rm "$file"
        fi
    done
}

# Register the cleanup function to be called on exit
trap cleanup EXIT

# Check if the VNF image is a URL or a local file
if [[ "$VNF_IMAGE" == http* ]]; then
    # Use curl to download the file
    filename=$(basename "$VNF_IMAGE")
    # Download the VNF image file and save the output to a file
    curl -f -Lo "$filename" "$VNF_IMAGE"
    if [ $? -ne 0 ]; then
        echo "Error: Failed to download file."
        exit 1
    fi
    # Add the downloaded file to the list for cleanup
    downloaded_files+=("$filename")
elif [[ "$VNF_IMAGE" == /* ]]; then
    # Use the provided full local path
    filename=$(basename "$VNF_IMAGE")
    # Copy the VNF image file to the current directory for cleanup
    cp "$VNF_IMAGE" "./$filename"
    # Add the copied file to the list for cleanup
    downloaded_files+=("$filename")
else
    # Assume it's a local file in the current directory
    filename="$VNF_IMAGE"
fi

# Check if the file exists
if [ ! -f "$filename" ]; then
    echo "Error: File $filename does not exist."
    exit 1
fi

# Create a Dockerfile that copies the VNF image file into the container's /disk directory
# The containerDisk needs to be readable for the user with the UID 107 (qemu).
cat <<EOF > "$DOCKERFILE_NAME"
FROM scratch
ADD --chown=107:107 "$filename" /disk/
EOF

# Build the Docker image and tag it to the Azure Container Registry
docker build -f "$DOCKERFILE_NAME" -t "$CONTAINER_IMAGE_NAME:$CONTAINER_IMAGE_TAG" .

# Log in to Azure Container Registry
if [ -n "$USERNAME" ] && [ -n "$PASSWORD" ]; then
    docker login "$ACR_NAME.azurecr.io" -u "$USERNAME" -p "$PASSWORD"
else
    az acr login --name "$ACR_NAME" --subscription "$SUBSCRIPTION"
fi

docker tag "$CONTAINER_IMAGE_NAME:$CONTAINER_IMAGE_TAG" "$ACR_URL/$CONTAINER_IMAGE_NAME:$CONTAINER_IMAGE_TAG"
docker push "$ACR_URL/$CONTAINER_IMAGE_NAME:$CONTAINER_IMAGE_TAG"

# Remove the downloaded/copied files
cleanup

rm "$DOCKERFILE_NAME"

echo "VNF image $ACR_URL/$CONTAINER_IMAGE_NAME:$CONTAINER_IMAGE_TAG created successfully!"

Après avoir exécuté le script, vous disposez d’une image de machine virtuelle adaptée à votre fonction réseau virtualisée. Vous pouvez utiliser cette image pour déployer votre fonction réseau virtualisée.

Remarque

Pour vous assurer que l’image VNF peut être extraite correctement, vérifiez que l’URL ACR se trouve dans la liste d’autorisation de sortie du réseau de services cloud que vous utiliserez avec votre machine virtuelle Operator Nexus.

Exemple d’utilisation

  1. Définissez les variables d’environnement requises.

    export SUBSCRIPTION=""00000000-0000-0000-0000-000000000000""
    export ACR_NAME="myvnfacr"
    export CONTAINER_IMAGE_NAME="ubuntu"
    export CONTAINER_IMAGE_TAG="20.04"
    export VNF_IMAGE="https://cloud-images.ubuntu.com/releases/focal/release/ubuntu-20.04-server-cloudimg-amd64.img"
    
  2. Enregistrez le script fourni en tant que create-container-disk.sh et définissez-le comme exécutable.

    chmod +x create-container-disk.sh
    
  3. Exécutez le script.

    $ ./create-container-disk.sh
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100  622M  100  622M    0     0  24.7M      0  0:00:25  0:00:25 --:--:-- 26.5M
    [+] Building 36.6s (5/5) FINISHED
     => [internal] load .dockerignore                                                              0.1s
     => => transferring context: 2B                                                                0.0s
     => [internal] load build definition from nexus-vm-img-dockerfile                              0.1s
     => => transferring dockerfile: 137B                                                           0.0s
     => [internal] load build context                                                              36.4s
     => => transferring context: 652.33MB                                                          36.3s
     => CACHED [1/1] ADD --chown=107:107 ubuntu-20.04-server-cloudimg-amd64.img /disk/             0.0s
     => exporting to image                                                                         0.0s
     => => exporting layers                                                                        0.0s
     => => writing image sha256:5b5f531c132cdbba202136b5ec41c9bfe9d91beeb5acee617c1ef902df4ca772   0.0s
     => => naming to docker.io/library/ubuntu:20.04                                                0.0s
    Login Succeeded
    The push refers to repository [myvnfacr.azurecr.io/ubuntu]
    b86efae7de58: Layer already exists
    20.04: digest: sha256:d514547ee28d9ed252167d0943d4e711547fda95161a3728c44a275f5d9669a8 size: 529
    VNF image myvnfacr.azurecr.io/ubuntu:20.04 created successfully!
    

Étapes suivantes

Reportez-vous au Guide de démarrage rapide pour déployer une fonction réseau virtualisée en utilisant l’image que vous avez créée.