Поделиться через


Создание образа для виртуальной машины Оператора Azure Nexus

В этой статье вы узнаете, как создать образ контейнера, который можно использовать для создания виртуальной машины в Операторе Nexus. В частности, вы узнаете, как добавить виртуальный диск в образ контейнера. После создания и отправки образа контейнера в реестр контейнеров Azure его можно использовать для создания виртуальной машины в Операторе Nexus.

Необходимые компоненты

Прежде чем приступить к созданию образа виртуальной машины, убедитесь, что у вас есть следующие предварительные требования:

  • Установите последнюю версию необходимых расширений Azure CLI.

  • Для этой статьи требуется версия 2.61.0 или более поздняя версия Azure CLI. Если вы используете Azure Cloud Shell, последняя версия уже установлена.

  • Реестр контейнеров Azure (ACR): настройте рабочую Реестр контейнеров Azure для хранения образов контейнеров и управления ими. ACR предоставляет безопасный и частный реестр для хранения образов Docker, используемых в процессе создания образа виртуальной машины. Вы можете создать ACR, следуя официальной документации по Реестр контейнеров Azure документации.

  • Docker: установите Docker на локальном компьютере. Docker — это платформа, которая позволяет создавать, упаковать и распространять приложения в виде упрощенных контейнеров. Вы используете Docker для сборки и упаковки образа виртуальной машины. Вы можете скачать Docker с официального веб-сайта Docker.

Примечание.

Вы можете использовать az login команду для проверки подлинности в Azure, и скрипт автоматически выполнит вход ACR с помощью предоставленного имени ACR и идентификатора подписки. Если на компьютере не установлен Azure CLI, вы можете указать имя пользователя и пароль для входа ACR.

Убедитесь, что на компьютере установлена операционная Реестр контейнеров Azure (ACR) и Docker, прежде чем продолжить создание образа виртуальной машины. Ознакомьтесь с использованием и функциональностью ACR и Docker, так как они необходимы для управления образами контейнеров и создания образа виртуальной машины.

Требования к образу виртуальной машины

  • Убедитесь, что образ функции виртуальная сеть (VNF) находится в формате qcow2, который может загружаться с cloud-init.

  • Необходимо настроить загрузчик, ядро и систему инициализации в образе, чтобы включить последовательную консоль на основе текста. Эта конфигурация необходима для включения поддержки консоли для виртуальной машины. Убедитесь, что параметры последовательного порта в системе и терминале соответствуют правильному взаимодействию.

  • Необходимо убедиться, что образ виртуальной машины поддерживает cloud-init версии 2, включив расширенные параметры конфигурации во время процесса инициализации виртуальной машины.

  • Необходимо убедиться, что образ виртуальной nocloud машины включает cloud-init с источником данных. nocloud Источник данных позволяет выполнять начальную настройку и настройку во время подготовки виртуальных машин.

  • Диски должны быть помещены в /disk каталог внутри контейнера.

  • Поддерживаются форматы raw и qcow2. Для уменьшения размера образа контейнера рекомендуется использовать Qcow2.

  • Диски контейнеров должны основываться на образе scratch , который является пустым базовым образом, который не содержит файлов или каталогов, отличных от самого образа. Использование scratch в качестве базового образа гарантирует, что образ контейнера максимально мал и включает только необходимые файлы для VNF.

Действия по созданию образа для виртуальной машины Operator Nexus

Образ для VNF можно создать с помощью предоставленного скрипта. Он создает Файл Dockerfile, который копирует файл образа диска VNF в каталог контейнера /disk .

Примечание.

Приведенный ниже сценарий представлен в качестве примера. Если вы предпочитаете, можно создать и отправить образ контейнера вручную, а не следовать скрипту.

Следующие переменные среды используются для настройки скрипта для создания образа виртуальной машины для виртуальной машины. Перед выполнением скрипта измените и экспортируйте эти переменные с собственными значениями:


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

Чтобы создать образ виртуальной машины для функции виртуальная сеть (VNF), сохраните предоставленный скрипт какcreate-container-disk.sh, задайте необходимые переменные среды и выполните скрипт.

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

После выполнения скрипта у вас будет образ виртуальной машины, адаптированный для функции виртуальная сеть (VNF). Этот образ можно использовать для развертывания VNF.

Примечание.

Чтобы убедиться, что образ VNF можно извлечь правильно, убедитесь, что URL-адрес ACR находится в списке исходящих разрешений сети облачных служб, которую вы будете использовать с виртуальной машиной Operator Nexus.

Пример использования

  1. Задайте необходимые переменные среды.

    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. Сохраните предоставленный скрипт как create-container-disk.sh и сделайте его исполняемым файлом.

    chmod +x create-container-disk.sh
    
  3. Выполните скрипт.

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

Следующие шаги

Ознакомьтесь с кратким руководством по развертыванию виртуальной сети с помощью созданного образа.