Sdílet prostřednictvím


Vytvoření image pro virtuální počítač Nexus operátora Azure

V tomto článku se dozvíte, jak vytvořit image kontejneru, která se dá použít k vytvoření virtuálního počítače v operátoru Nexus. Konkrétně se dozvíte, jak do image kontejneru přidat virtuální disk. Jakmile se image kontejneru sestaví a odešle do registru kontejneru Azure, můžete ji použít k vytvoření virtuálního počítače v operátoru Nexus.

Předpoklady

Než začnete vytvářet image virtuálního počítače, ujistěte se, že máte splněné následující požadavky:

  • Nainstalujte nejnovější verzi potřebných rozšíření Azure CLI.

  • Tento článek vyžaduje verzi 2.49.0 nebo novější azure CLI. Pokud používáte Azure Cloud Shell, je už nainstalovaná nejnovější verze.

  • Azure Container Registry (ACR): Nastavte funkční službu Azure Container Registry pro ukládání a správu imagí kontejnerů. ACR poskytuje zabezpečený a privátní registr pro ukládání imagí Dockeru používaných v procesu vytváření imagí virtuálního počítače. Službu ACR můžete vytvořit podle oficiální dokumentace v dokumentaci ke službě Azure Container Registry .

  • Docker: Nainstalujte Docker na místní počítač. Docker je platforma, která umožňuje vytvářet, zabalit a distribuovat aplikace jako jednoduché kontejnery. K sestavení a zabalení image virtuálního počítače použijete Docker. Docker si můžete stáhnout z oficiálních webových stránek Dockeru.

Poznámka:

Příkaz můžete použít az login k ověření v Azure a skript automaticky provede přihlášení ACR pomocí zadaného názvu ACR a ID předplatného. Pokud nemáte na počítači nainstalované Rozhraní příkazového řádku Azure CLI, můžete místo toho zadat uživatelské jméno a heslo pro přihlášení ACR.

Než budete pokračovat vytvořením image virtuálního počítače, ujistěte se, že máte na počítači nainstalovanou funkční službu Azure Container Registry (ACR) a Docker. Seznamte se s používáním a funkcemi ACR a Dockeru, protože jsou nezbytné pro správu imagí kontejnerů a vytváření image virtuálního počítače.

Požadavky na image virtuálního počítače

  • Ujistěte se, že je image funkce virtuální sítě (VNF) ve formátu qcow2, která se dá spustit s cloud-init.

  • V imagi musíte nakonfigurovat spouštěcí zavaděč, jádro a inicializační systém, aby se povolila textová sériová konzola. Tato konfigurace se vyžaduje k povolení podpory konzoly pro virtuální počítač. Ujistěte se, že nastavení sériového portu v systému a terminálu odpovídají správné komunikaci.

  • Potřebujete zajistit, aby image virtuálního počítače podporovala cloud-init verze 2 a během procesu inicializace virtuálního počítače povolte pokročilé možnosti konfigurace.

  • Musíte zajistit, aby image virtuálního počítače obsahovala cloud-init se zdroji nocloud dat. nocloud Zdroj dat umožňuje počáteční konfiguraci a přizpůsobení během zřizování virtuálních počítačů.

  • Disky musí být umístěny do /disk adresáře uvnitř kontejneru.

  • Podporují se nezpracované formáty a formáty qcow2. Qcow2 se doporučuje, aby se zmenšila velikost image kontejneru.

  • Disky kontejnerů by měly být založené na scratch imagi, což je prázdná základní image, která neobsahuje žádné jiné soubory nebo adresáře než samotná image. Použití scratch jako základní image zajišťuje, aby image kontejneru byla co nejmenší a obsahovala pouze potřebné soubory pro VNF.

Postup vytvoření image pro virtuální počítač Operator Nexus

Image pro VNF můžete vytvořit pomocí poskytnutého skriptu. Vygeneruje soubor Dockerfile, který zkopíruje soubor image disku VNF do adresáře kontejneru /disk .

Poznámka:

Následující skript je k dispozici jako příklad. Pokud chcete, můžete image kontejneru vytvořit a odeslat ručně místo skriptu.

Následující proměnné prostředí slouží ke konfiguraci skriptu pro vytvoření image virtuálního počítače pro váš VNF. Před spuštěním skriptu upravte a exportujte tyto proměnné vlastními hodnotami:


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

Pokud chcete vytvořit image virtuálního počítače pro funkci virtuální sítě (VNF), uložte zadaný skript jako create-container-disk.sh, nastavte požadované proměnné prostředí a spusťte skript.

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

Po spuštění skriptu budete mít image virtuálního počítače přizpůsobenou funkci virtuální sítě (VNF). Tuto image můžete použít k nasazení VNF.

Příklad využití

  1. Nastavte požadované proměnné prostředí.

    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. Uložte zadaný skript jako create-container-disk.sh spustitelný.

    chmod +x create-container-disk.sh
    
  3. Spusťte skript.

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

Další kroky

Informace o nasazení VNF pomocí image, kterou jste vytvořili, najdete v průvodci rychlým startem.