Tworzenie obrazu dla maszyny wirtualnej Platformy Azure Operator Nexus

Z tego artykułu dowiesz się, jak utworzyć obraz kontenera, który może służyć do tworzenia maszyny wirtualnej w operatorze Nexus. W szczególności dowiesz się, jak dodać dysk wirtualny do obrazu kontenera. Gdy obraz kontenera zostanie skompilowany i wypchnięty do rejestru kontenerów platformy Azure, można go użyć do utworzenia maszyny wirtualnej w narzędziu Operator Nexus.

Wymagania wstępne

Przed rozpoczęciem tworzenia obrazu maszyny wirtualnej upewnij się, że zostały spełnione następujące wymagania wstępne:

  • Zainstaluj najnowszą wersję niezbędnych rozszerzeń interfejsu wiersza polecenia platformy Azure.

  • Ten artykuł wymaga wersji 2.49.0 lub nowszej interfejsu wiersza polecenia platformy Azure. W przypadku korzystania z usługi Azure Cloud Shell najnowsza wersja jest już zainstalowana.

  • Azure Container Registry (ACR): skonfiguruj działającą usługę Azure Container Registry do przechowywania obrazów kontenerów i zarządzania nimi. Usługa ACR udostępnia bezpieczny i prywatny rejestr do przechowywania obrazów platformy Docker używanych w procesie tworzenia obrazu maszyny wirtualnej. Rejestr ACR można utworzyć, postępując zgodnie z oficjalną dokumentacją w dokumentacji usługi Azure Container Registry .

  • Docker: zainstaluj platformę Docker na komputerze lokalnym. Docker to platforma, która umożliwia tworzenie, pakowanie i dystrybuowanie aplikacji jako uproszczonych kontenerów. Używasz platformy Docker do kompilowania i tworzenia pakietów obrazu maszyny wirtualnej. Możesz pobrać platformę Docker z oficjalnej witryny internetowej platformy Docker.

Uwaga

Możesz użyć az login polecenia do uwierzytelniania za pomocą platformy Azure, a skrypt automatycznie wykona logowanie usługi ACR przy użyciu podanej nazwy usługi ACR i identyfikatora subskrypcji. Jeśli na maszynie nie masz zainstalowanego interfejsu wiersza polecenia platformy Azure, możesz podać nazwę użytkownika i hasło logowania usługi ACR.

Przed kontynuowaniem tworzenia obrazu maszyny wirtualnej upewnij się, że masz działającą usługę Azure Container Registry (ACR) i platformę Docker zainstalowaną na maszynie. Zapoznaj się z użyciem i funkcjami usług ACR i Docker, ponieważ są one niezbędne do zarządzania obrazami kontenerów i tworzenia obrazu maszyny wirtualnej.

Wymagania dotyczące obrazu maszyny wirtualnej

  • Upewnij się, że obraz funkcji sieci wirtualnej (VNF) jest w formacie qcow2, który może być uruchamiany przy użyciu pakietu cloud-init.

  • Należy skonfigurować moduł ładujący rozruch, jądro i system inicjowania na obrazie, aby włączyć konsolę szeregową opartą na tekście. Ta konfiguracja jest wymagana do włączenia obsługi konsoli dla maszyny wirtualnej. Upewnij się, że ustawienia portu szeregowego w systemie i terminalu są zgodne, aby nawiązać właściwą komunikację.

  • Musisz upewnić się, że obraz maszyny wirtualnej obsługuje pakiet cloud-init w wersji 2, włączając zaawansowane opcje konfiguracji podczas procesu inicjowania maszyny wirtualnej.

  • Musisz upewnić się, że obraz maszyny wirtualnej zawiera plik cloud-init ze nocloud źródłem danych. nocloud źródło danych umożliwia początkową konfigurację i dostosowywanie podczas aprowizacji maszyny wirtualnej.

  • Dyski należy umieścić w /disk katalogu wewnątrz kontenera.

  • Obsługiwane są formaty raw i qcow2. Qcow2 zaleca się zmniejszenie rozmiaru obrazu kontenera.

  • Dyski kontenera powinny być oparte na obrazie scratch , który jest pustym obrazem podstawowym, który nie zawiera żadnych plików ani katalogów innych niż sam obraz. Użycie scratch jako obrazu podstawowego zapewnia, że obraz kontenera jest tak mały, jak to możliwe i zawiera tylko niezbędne pliki dla systemu plików VNF.

Kroki tworzenia obrazu dla maszyny wirtualnej Operator Nexus

Obraz dla systemu plików VNF można utworzyć przy użyciu podanego skryptu. Generuje plik Dockerfile, który kopiuje plik obrazu dysku VNF do katalogu kontenera /disk .

Uwaga

Poniższy skrypt jest dostarczany jako przykład. Jeśli wolisz, możesz utworzyć i wypchnąć obraz kontenera ręcznie zamiast obserwować skrypt.

Następujące zmienne środowiskowe służą do konfigurowania skryptu do tworzenia obrazu maszyny wirtualnej dla systemu plików VNF. Zmodyfikuj i wyeksportuj te zmienne przy użyciu własnych wartości przed wykonaniem skryptu:


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

Aby utworzyć obraz maszyny wirtualnej dla funkcji sieci wirtualnej (VNF), zapisz podany skrypt jako create-container-disk.sh, ustaw wymagane zmienne środowiskowe i wykonaj skrypt.

#!/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 wykonaniu skryptu będziesz mieć obraz maszyny wirtualnej dostosowany do funkcji sieci wirtualnej (VNF). Tego obrazu można użyć do wdrożenia systemu plików VNF.

Przykładowe użycie

  1. Ustaw wymagane zmienne środowiskowe.

    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. Zapisz podany skrypt jako create-container-disk.sh i utwórz go jako wykonywalny.

    chmod +x create-container-disk.sh
    
  3. Uruchom skrypt.

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

Następne kroki

Zapoznaj się z przewodnikiem Szybki start, aby wdrożyć system plików VNF przy użyciu utworzonego obrazu.