Dela via


Skapa avbildning för den virtuella Azure Operator Nexus-datorn

I den här artikeln får du lära dig hur du skapar en containeravbildning som kan användas för att skapa en virtuell dator i Operator Nexus. Mer specifikt lär du dig hur du lägger till en virtuell disk i containeravbildningen. När containeravbildningen har skapats och push-överförts till ett Azure-containerregister kan den användas för att skapa en virtuell dator i Operator Nexus.

Förutsättningar

Innan du börjar skapa en virtuell datoravbildning måste du se till att du har följande förutsättningar på plats:

  • Installera den senaste versionen av nödvändiga Azure CLI-tillägg.

  • Den här artikeln kräver version 2.61.0 eller senare av Azure CLI. Om du använder Azure Cloud Shell är den senaste versionen redan installerad.

  • Azure Container Registry (ACR): Konfigurera ett fungerande Azure Container Registry för att lagra och hantera dina containeravbildningar. ACR tillhandahåller ett säkert och privat register för lagring av Docker-avbildningar som används i processen för att skapa vm-avbildningar. Du kan skapa en ACR genom att följa den officiella dokumentationen i Azure Container Registry-dokumentationen .

  • Docker: Installera Docker på den lokala datorn. Docker är en plattform där du kan skapa, paketera och distribuera program som lätta containrar. Du använder Docker för att skapa och paketera din VM-avbildning. Du kan ladda ned Docker från Docker officiella hemsida.

Kommentar

Du kan använda kommandot för att autentisera az login med Azure, och skriptet utför automatiskt ACR-inloggningen med det angivna ACR-namnet och prenumerations-ID:t. Om du inte har Installerat Azure CLI på datorn kan du ange ditt användarnamn och lösenord för ACR-inloggning i stället.

Se till att du har ett fungerande Azure Container Registry (ACR) och Docker installerat på datorn innan du fortsätter med att skapa en VM-avbildning. Bekanta dig med användningen och funktionerna i ACR och Docker, eftersom de är viktiga för att hantera dina containeravbildningar och skapa vm-avbildningen.

Avbildningskrav för virtuell dator

  • Kontrollera att VNF-avbildningen (Virtual Network Function) är i qcow2-format som kan startas med cloud-init.

  • Du måste konfigurera systemet bootloader, kernel och init i avbildningen för att aktivera en textbaserad seriekonsol. Den här konfigurationen krävs för att aktivera konsolstöd för den virtuella datorn (VM). Kontrollera att inställningarna för serieporten på systemet och terminalen matchar för att upprätta korrekt kommunikation.

  • Du måste se till att vm-avbildningen stöder cloud-init version 2, vilket aktiverar avancerade konfigurationsalternativ under initieringsprocessen för den virtuella datorn.

  • Du måste se till att den virtuella datoravbildningen nocloud innehåller cloud-init med datakällan. nocloud datakälla möjliggör inledande konfiguration och anpassning under etablering av virtuella datorer.

  • Diskar måste placeras i /disk katalogen i containern.

  • Raw- och qcow2-format stöds. Qcow2 rekommenderas för att minska containeravbildningens storlek.

  • Containerdiskar ska baseras på avbildningen scratch , vilket är en tom basavbildning som inte innehåller några andra filer eller kataloger än själva avbildningen. Om du använder scratch som basavbildning ser du till att containeravbildningen är så liten som möjligt och endast innehåller nödvändiga filer för VNF.

Steg för att skapa avbildning för den virtuella Operator Nexus-datorn

Du kan skapa en avbildning för din VNF med hjälp av det angivna skriptet. Den genererar en Dockerfile som kopierar VNF-diskavbildningsfilen till containerns /disk katalog.

Kommentar

Följande skript tillhandahålls som ett exempel. Om du vill kan du skapa och push-överföra containeravbildningen manuellt i stället för att följa skriptet.

Följande miljövariabler används för att konfigurera skriptet för att skapa en virtuell datoravbildning (VM) för din VNF. Ändra och exportera dessa variabler med dina egna värden innan du kör skriptet:


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

Om du vill skapa en VM-avbildning för din virtuella nätverksfunktion (VNF) sparar du det angivna skriptet som create-container-disk.sh, anger nödvändiga miljövariabler och kör skriptet.

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

När du har kört skriptet har du en VM-avbildning som är anpassad för din virtuella nätverksfunktion (VNF). Du kan använda den här avbildningen för att distribuera din VNF.

Kommentar

Kontrollera att VNF-avbildningen kan hämtas korrekt genom att se till att ACR-URL:en finns i listan över tillåtna utgående molntjänster som du ska använda med den virtuella Operator Nexus-datorn.

Exempel på användning

  1. Ange nödvändiga miljövariabler.

    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. Spara det angivna skriptet som create-container-disk.sh och gör det körbart.

    chmod +x create-container-disk.sh
    
  3. Kör skriptet.

    $ ./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ästa steg

Se snabbstartsguiden för att distribuera en VNF med den avbildning som du skapade.