Criar uma imagem para a máquina virtual do Nexus do Operador do Azure

Neste artigo, você vai aprender a criar uma imagem de contêiner que pode ser usada para criar uma máquina virtual no Nexus do Operador. Especificamente, você vai aprender a adicionar um disco virtual à imagem de contêiner. Após ser criada e enviada por push para um registro de contêiner do Azure, a imagem de contêiner poderá ser usada para criar uma máquina virtual no Nexus do Operador.

Pré-requisitos

Antes de começar a criar uma imagem de máquina virtual (VM), verifique se você tem os seguintes pré-requisitos implementados:

  • Instale a última versão das extensões da CLI do Azure necessárias.

  • Este artigo requer a versão 2.49.0 ou posterior da CLI do Azure. Se você está usando o Azure Cloud Shell, a versão mais recente já está instalada.

  • Registro de Contêiner do Azure (ACR): configure um Registro de Contêiner do Azure funcional para armazenar e gerenciar suas imagens de contêiner. O ACR fornece um registro seguro e privado para armazenar as imagens do Docker usadas no processo de criação da sua imagem de VM. Você pode criar um ACR seguindo a documentação oficial do Registro de Contêiner do Azure.

  • Docker: instale o Docker no seu computador local. O Docker é uma plataforma que lhe permite criar, empacotar e distribuir aplicativos na forma de contêineres leves. Você vai usar o Docker para criar e empacotar sua imagem de VM. Você pode baixar o Docker no site oficial do Docker.

Observação

Você pode usar o comando az login para se autenticar no Azure e o script fará o login no ACR automaticamente usando o nome do ACR e a ID de assinatura fornecidos. Se não tiver a CLI do Azure instalada no seu computador, você poderá fornecer seu nome de usuário e senha para o login no ACR.

Certifique-se de ter um Registro de Contêiner do Azure (ACR) operacional e o Docker instalado no seu computador antes de prosseguir com a criação de uma imagem de VM. Familiarize-se com o uso e a funcionalidade do ACR e do Docker, já que esses recursos são essenciais para gerenciar suas imagens de contêiner e criar sua imagem de VM.

Requisitos da imagem de máquina virtual

  • Certifique-se de que sua imagem da Função Virtualizada de Rede (VNF) esteja no formato qcow2, que pode ser inicializado com o cloud-init.

  • Você precisa configurar o carregador de inicialização, o kernel e o sistema de init na sua imagem para habilitar um console serial baseado em texto. Essa configuração é necessária para habilitar o suporte ao console para a sua máquina virtual (VM). Certifique-se de que as configurações de porta serial no seu sistema e no seu terminal se equiparem para estabelecer uma comunicação adequada.

  • Você precisa se certificar de que sua imagem de VM dê suporte à versão 2 do cloud-init, habilitando opções de configuração avançadas durante o processo de inicialização da VM.

  • Você precisa se certificar de que sua imagem de VM inclua o cloud-init com a fonte de dados nocloud. A fonte de dados nocloud permite a configuração e personalização iniciais durante o provisionamento da VM.

  • Os discos devem ser colocados no diretório /disk dentro do contêiner.

  • Os formatos raw e qcow2 têm suporte. O qcow2 é recomendado para reduzir o tamanho da imagem do contêiner.

  • Os discos de contêiner devem ser baseados na imagem scratch, que é uma imagem de base vazia que não contém nenhum arquivo nem diretório além da imagem propriamente dita. Usar a scratch como imagem de base garante que a imagem de contêiner seja a menor possível e inclua apenas os arquivos necessários para a VNF.

Etapas para criar uma imagem para a máquina virtual do Nexus do Operador

Você pode criar uma imagem para a sua VNF usando o script fornecido. Esse script gera um Dockerfile que copia o arquivo de imagem do disco da VNF para o diretório /disk do contêiner.

Observação

O script a seguir é fornecido como exemplo. Se preferir, você pode criar e efetuar push da imagem de contêiner manualmente, em vez de seguir o script.

As variáveis de ambiente a seguir são usadas para configurar o script para criar uma imagem de máquina virtual ( VM) para a sua VNF. Modifique e exporte essas variáveis com seus próprios valores antes de executar o script:


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

Para criar uma imagem de VM para a sua Função Virtualizada de Rede (VNF), salve o script fornecido como create-container-disk.sh, defina as variáveis de ambiente necessárias e execute o script.

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

Após executar o script, você terá uma imagem de VM sob medida para a sua Função Virtualizada de Rede (VNF). Você pode usar essa imagem para implantar sua VNF.

Observação

Para garantir que a imagem da VNF possa ser recuperada corretamente, verifique se a URL do ACR está na lista de permissões de saída da rede de serviços de nuvem que você usará com sua máquina virtual do Operator Nexus.

Exemplo de uso

  1. Defina as variáveis de ambiente necessárias.

    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. Salve o script fornecido como create-container-disk.sh e torne-o executável.

    chmod +x create-container-disk.sh
    
  3. Execute o script.

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

Próximas etapas

Confira o Guia de Início Rápido para implantar uma VNF usando a imagem que você criou.