Freigeben über


Erstellen eines Images für einen virtuellen Azure Operator Nexus-Computer

In diesem Artikel erfahren Sie, wie Sie ein Containerimage erstellen, das zum Erstellen eines virtuellen Computers in Operator Nexus verwendet werden kann. Insbesondere erfahren Sie, wie Sie dem Containerimage einen virtuellen Datenträger hinzufügen. Nachdem das Containerimage erstellt und an eine Azure-Containerregistrierung übertragen wurde, kann es verwendet werden, um einen virtuellen Computer in Operator Nexus zu erstellen.

Voraussetzungen

Bevor Sie mit dem erstellen eines VM-Images beginnen, stellen Sie sicher, dass die folgenden Voraussetzungen erfüllt sind:

  • Installieren Sie die aktuelle Version der notwendigen Azure CLI-Erweiterung.

  • Für diesen Artikel ist mindestens Version 2.49.0 der Azure CLI erforderlich. Bei Verwendung von Azure Cloud Shell ist die aktuelle Version bereits installiert.

  • Azure Container Registry (ACR): Erstellen Sie eine funktionierende Azure Container Registry, um Ihre Containerimages zu speichern und zu verwalten. ACR bietet eine sichere und private Registrierung zum Speichern von Docker-Images, die in Ihrem VM-Imageerstellungsprozess verwendet werden. Sie können eine ACR erstellen, indem Sie die offizielle Dokumentation unter Azure Container Registry befolgen.

  • Docker: Installieren Sie Docker auf Ihrem lokalen Rechner. Docker ist eine Plattform, mit der Sie Anwendungen als einfache Container erstellen, verpacken und verteilen können. Mit Docker erstellen und verpacken Sie Ihr VM-Image. Sie können Docker von der offiziellen Website von Docker herunterladen.

Hinweis

Sie können den az login-Befehl verwenden, um sich bei Azure zu authentifizieren, und das Skript führt die ACR-Anmeldung automatisch mithilfe des bereitgestellten ACR-Namens und der Abonnement-ID aus. Wenn Sie die Azure CLI nicht auf Ihrem Computer installiert haben, können Sie stattdessen Ihren Benutzernamen und Ihr Kennwort für die ACR-Anmeldung angeben.

Stellen Sie sicher, dass Sie eine betriebsfähige Azure Container Registry (ACR) und Docker auf Ihrem Computer installiert haben, bevor Sie mit der Erstellung eines VM-Images fortfahren. Machen Sie sich mit der Verwendung und Funktionalität von ACR und Docker vertraut, da sie für die Verwaltung Ihrer Containerimages und das Erstellen des VM-Images unerlässlich sind.

Anforderungen für VM-Images

  • Stellen Sie sicher, dass sich Ihr VNF-Image (Virtual Network Function) im qcow2-Format befindet, das mit cloud-init gestartet werden kann.

  • Sie müssen das Startladeprogramm, den Kernel und das Init-System in Ihrem Image konfigurieren, um eine textbasierte serielle Konsole zu aktivieren. Diese Konfiguration ist erforderlich, um die Konsolenunterstützung für Ihren virtuellen Computer (VM) zu aktivieren. Stellen Sie sicher, dass die Einstellungen für den seriellen Anschluss auf Ihrem System und Terminal übereinstimmen, um eine ordnungsgemäße Kommunikation herzustellen.

  • Sie müssen sicherstellen, dass Ihr VM-Image Cloud-init Version 2 unterstützt, wodurch erweiterte Konfigurationsoptionen während des VM-Initialisierungsprozesses aktiviert werden.

  • Sie müssen sicherstellen, dass Ihr VM-Image cloudinit mit der Datenquelle nocloud enthält. Die Datenquelle nocloud ermöglicht die anfängliche Konfiguration und Anpassung während der VM-Bereitstellung.

  • Datenträger müssen im /disk-Verzeichnis innerhalb des Containers platziert werden.

  • Die Formate RAW und QCOW2 werden unterstützt. QCOW2 wird empfohlen, um die Größe des Containerimages zu verringern.

  • Containerdatenträger sollten auf dem scratch-Image basieren, bei dem es sich um ein leeres Basisimage handelt, das außer dem Image selbst keine Dateien oder Verzeichnisse enthält. Durch die Verwendung von scratch als Basisimage wird sichergestellt, dass das Containerimage so klein wie möglich ist und nur die erforderlichen Dateien für die VNF enthält.

Schritte zum Erstellen eines Images für einen virtuellen Operator Nexus-Computer

Sie können mithilfe des bereitgestellten Skripts ein Bild für Ihre VNF erstellen. Es erstellt ein Dockerfile, welches die VNF-Imagedatei in das Verzeichnis /disk des Containers kopiert.

Hinweis

Das folgende Skript ist ein Beispiel: Wenn es Ihnen lieber ist, können Sie das Containerimage auch manuell erstellen und übertragen, anstatt dem Skript zu folgen.

Die folgenden Umgebungsvariablen werden verwendet, um das Skript zum Erstellen eines VM-Images für Ihre VNF zu konfigurieren. Ändern Sie diese Variablen mit Ihren eigenen Werten, und exportieren Sie es, bevor Sie das Skript ausführen:


# 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=""

Um ein VM-Image für Ihre virtualisierte Netzwerkfunktion (Virtual Network Function, VNF) zu erstellen, speichern Sie das bereitgestellte Skript als create-container-disk.sh, legen Sie die erforderlichen Umgebungsvariablen fest, und führen Sie das Skript aus.

#!/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!"

Nach dem Ausführen des Skripts verfügen Sie über ein VM-Image, das auf Ihre VNF zugeschnitten ist. Sie können dieses Image zum Bereitstellen Ihrer VNF verwenden.

Hinweis

Um zu gewährleisten, dass das VNF-Image korrekt abgerufen werden kann, stellen Sie sicher, dass sich die ACR-URL in der Zulassungsliste des Clouddienste-Netzwerks befindet, das Sie mit Ihrer Operator Nexus-VM verwenden werden.

Beispielverwendung

  1. Legen Sie die erforderliche Umgebungsvariablen fest.

    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. Speichern Sie das bereitgestellte Skript als create-container-disk.sh, und erstellen Sie es als ausführbare Datei.

    chmod +x create-container-disk.sh
    
  3. Führen Sie das Skript aus.

    $ ./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!
    

Nächste Schritte

Lesen Sie die Schnellstartanleitung, um eine VNF mithilfe des von Ihnen erstellten Images bereitzustellen.