Compartir a través de


Creación de una imagen para la máquina virtual Nexus del operador de Azure

En este artículo, aprenderá a crear una imagen de contenedor que se pueda usar para crear una máquina virtual en Operator Nexus. En concreto, aprenderá a agregar un disco virtual a la imagen de contenedor. Una vez creada e insertada la imagen de contenedor en un registro de contenedor de Azure, se puede usar para crear una máquina virtual en Operator Nexus.

Prerrequisitos

Antes de empezar a crear una imagen de máquina virtual (VM), asegúrese de que tiene los siguientes requisitos previos:

  • Instale la versión más reciente de las extensiones de la CLI de Azure necesarias.

  • En este artículo se requiere la versión 2.61.0 o posterior de la CLI de Azure. Si usa Azure Cloud Shell, ya está instalada la versión más reciente.

  • Azure Container Registry (ACR): configure una instancia de Azure Container Registry en funcionamiento para almacenar y administrar las imágenes de contenedor. ACR proporciona un registro seguro y privado para almacenar imágenes de Docker usadas en el proceso de creación de imágenes de máquina virtual. Puede crear un ACR siguiendo la documentación oficial de Azure Container Registry.

  • Docker: instale Docker en la máquina local. Docker es una plataforma que permite compilar, empaquetar y distribuir aplicaciones como contenedores ligeros. Use Docker para compilar y empaquetar la imagen de máquina virtual. Puede descargar Docker desde el sitio web oficial de Docker.

Nota:

Puede usar el az login comando para autenticarse con Azure y el script realizará automáticamente el inicio de sesión de ACR mediante el nombre de ACR y el identificador de suscripción proporcionados. Si no tiene instalada la CLI de Azure en el equipo, puede proporcionar su nombre de usuario y contraseña para el inicio de sesión de ACR en su lugar.

Asegúrese de que tiene una instancia operativa de Azure Container Registry (ACR) y Docker instalada en la máquina antes de continuar con la creación de una imagen de máquina virtual. Familiarícese con el uso y la funcionalidad de ACR y Docker, ya que son esenciales para administrar las imágenes de contenedor y compilar la imagen de máquina virtual.

Requisitos de imagen de máquina virtual

  • Asegúrese de que la imagen de función de red virtual (VNF) está en formato qcow2 que puede arrancar con cloud-init.

  • Debe configurar el bootloader, el kernel y el sistema init en su imagen para permitir la conectividad serial y la consola basada en texto. Utilice tanto los valores de GRUB_TERMINAL="console serial" como la configuración de la línea de comandos del kernel. Esta configuración es necesaria para habilitar el acceso serie para solucionar problemas de implementación y compatibilidad con la consola para la máquina virtual (VM) después de la implementación. Asegúrese de que la configuración del puerto serie en el sistema y el terminal coincidan para establecer una comunicación adecuada.

  • Debe asegurarse de que la imagen de máquina virtual admite cloud-init versión 2, lo que permite opciones de configuración avanzadas durante el proceso de inicialización de la máquina virtual.

  • Debe asegurarse de que la imagen de máquina virtual incluya cloud-init con la nocloud fuente de datos. nocloud datasource permite la configuración inicial y la personalización durante el aprovisionamiento de máquinas virtuales.

  • Los discos deben colocarse en el /disk directorio dentro del contenedor.

  • Se admiten formatos raw y qcow2. Se recomienda Qcow2 para reducir el tamaño de la imagen de contenedor.

  • Los discos de contenedor deben basarse en la scratch imagen, que es una imagen base vacía que no contiene archivos ni directorios distintos de la propia imagen. El uso scratch de como imagen base garantiza que la imagen de contenedor sea lo más pequeña posible y que solo incluya los archivos necesarios para VNF.

Pasos para crear una imagen para la máquina virtual Nexus del operador

Puede crear una imagen para VNF mediante el script proporcionado. Genera un Dockerfile que copia el archivo de imagen de disco VNF en el directorio del /disk contenedor.

Nota:

El siguiente script se proporciona como ejemplo. Si lo prefiere, puede crear e insertar la imagen de contenedor manualmente en lugar de seguir el script.

Las siguientes variables de entorno se usan para configurar el script para crear una imagen de máquina virtual (VM) para VNF. Modifique y exporte estas variables con sus propios valores antes de ejecutar el 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 crear una imagen de máquina virtual para la función de red virtual (VNF), guarde el script proporcionado como create-container-disk.sh, establezca las variables de entorno necesarias y ejecute el 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!"

Después de ejecutar el script, tendrá una imagen de máquina virtual adaptada para la función de red virtual (VNF). Puede usar esta imagen para implementar VNF.

Nota:

Para asegurarse de que la imagen de VNF se puede extraer correctamente, asegúrese de que la URL de ACR está en la lista de permitidos de egreso de la red de servicios en la nube que usará con la máquina virtual Operator Nexus.

Ejemplo de uso

  1. Establezca las variables de entorno necesarias.

    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. Guarde el script proporcionado como create-container-disk.sh y consítelo.

    chmod +x create-container-disk.sh
    
  3. Ejecute el 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!
    

Pasos siguientes

Consulte la guía de inicio rápido para implementar un VNF mediante la imagen que creó.