Создание образа для виртуальной машины Оператора 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.
Пример использования
Задайте необходимые переменные среды.
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"
Сохраните предоставленный скрипт как
create-container-disk.sh
и сделайте его исполняемым файлом.chmod +x create-container-disk.sh
Выполните скрипт.
$ ./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!
Следующие шаги
Ознакомьтесь с кратким руководством по развертыванию виртуальной сети с помощью созданного образа.