Aracılığıyla paylaş


Azure Operatör Nexus sanal makinesi için görüntü oluşturma

Bu makalede, Operatör Nexus'ta sanal makine oluşturmak için kullanılabilecek bir kapsayıcı görüntüsü oluşturmayı öğreneceksiniz. Özellikle, kapsayıcı görüntüsüne sanal disk eklemeyi öğrenirsiniz. Kapsayıcı görüntüsü derlenip bir Azure kapsayıcı kayıt defterine gönderildikten sonra Operatör Nexus'ta bir sanal makine oluşturmak için kullanılabilir.

Önkoşullar

Sanal makine (VM) görüntüsü oluşturmaya başlamadan önce aşağıdaki önkoşullara sahip olduğunuzdan emin olun:

  • Gerekli Azure CLI uzantılarının en son sürümünü yükleyin.

  • Bu makale, Azure CLI'nın 2.49.0 veya sonraki bir sürümünü gerektirir. Azure Cloud Shell kullanılıyorsa en son sürüm zaten yüklüdür.

  • Azure Container Registry (ACR): Kapsayıcı görüntülerinizi depolamak ve yönetmek için çalışan bir Azure Container Registry ayarlayın. ACR, VM görüntü oluşturma işleminizde kullanılan Docker görüntülerini depolamak için güvenli ve özel bir kayıt defteri sağlar. Azure Container Registry belgelerindeki resmi belgeleri izleyerek bir ACR oluşturabilirsiniz.

  • Docker: Docker'ı yerel makinenize yükleyin. Docker, uygulamaları basit kapsayıcılar olarak derlemenizi, paketlemenizi ve dağıtmanızı sağlayan bir platformdur. Sanal makine görüntünüzü derlemek ve paketlemek için Docker kullanırsınız. Docker'ı Docker'ın resmi web sitesinden indirebilirsiniz.

Not

Azure'da kimlik doğrulaması yapmak için komutunu kullanabilirsiniz az login ve betik, sağlanan ACR adını ve abonelik kimliğini kullanarak ACR oturum açma işlemini otomatik olarak gerçekleştirir. Makinenizde Azure CLI yüklü değilse bunun yerine ACR oturum açma bilgileri için kullanıcı adınızı ve parolanızı sağlayabilirsiniz.

VM görüntüsü oluşturmaya devam etmeden önce makinenizde çalışır durumda bir Azure Container Registry (ACR) ve Docker yüklü olduğundan emin olun. Kapsayıcı görüntülerinizi yönetmek ve VM görüntüsünü oluşturmak için gerekli olduğundan ACR ve Docker'ın kullanımı ve işlevselliği hakkında bilgi sahibi olun.

Sanal makine görüntüsü gereksinimleri

  • Sanal Ağ İşlevi (VNF) görüntünüzün cloud-init ile önyüklenebilir qcow2 biçiminde olduğundan emin olun.

  • Metin tabanlı seri konsolu etkinleştirmek için görüntünüzde önyükleme yükleyicisi, çekirdek ve init sistemini yapılandırmanız gerekir. Bu yapılandırma, sanal makineniz (VM) için konsol desteğini etkinleştirmek için gereklidir. Düzgün iletişim kurmak için sisteminizdeki ve terminaldeki seri bağlantı noktası ayarlarının eşleştiğinden emin olun.

  • VM görüntünüzün cloud-init sürüm 2'yi desteklediğinden emin olmanız ve VM başlatma işlemi sırasında gelişmiş yapılandırma seçeneklerini etkinleştirmeniz gerekir.

  • VM görüntünüzün veri kaynağıyla birlikte cloud-init içerdiğinden nocloud emin olmanız gerekir. nocloud veri kaynağı, VM sağlama sırasında ilk yapılandırmaya ve özelleştirmeye olanak tanır.

  • Diskler kapsayıcının /disk içindeki dizine yerleştirilmelidir.

  • Ham ve qcow2 biçimleri desteklenir. Kapsayıcı görüntüsünün boyutunu küçültmek için Qcow2 önerilir.

  • Kapsayıcı diskleri, görüntünün kendisi dışında hiçbir dosya veya dizin içermeyen boş bir temel görüntü olan görüntüyü temel almalıdır scratch . scratch Temel görüntü olarak kullanmak, kapsayıcı görüntüsünün mümkün olduğunca küçük olmasını ve yalnızca VNF için gerekli dosyaları içermesini sağlar.

Operatör Nexus sanal makinesi için görüntü oluşturma adımları

Sağlanan betiği kullanarak VNF'niz için bir görüntü oluşturabilirsiniz. VNF disk görüntüsü dosyasını kapsayıcının /disk dizinine kopyalayan bir Dockerfile oluşturur.

Not

Örnek olarak aşağıdaki betik sağlanmıştır. İsterseniz, betiği takip edip yerine kapsayıcı görüntüsünü el ile oluşturabilir ve gönderebilirsiniz.

Aşağıdaki ortam değişkenleri, VNF'niz için bir sanal makine (VM) görüntüsü oluşturmaya yönelik betiği yapılandırmak için kullanılır. Betiği yürütmeden önce bu değişkenleri kendi değerlerinizle değiştirin ve dışarı aktarın:


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

Sanal Ağ İşleviniz (VNF) için bir VM görüntüsü oluşturmak için, sağlanan betiği olarak create-container-disk.shkaydedin, gerekli ortam değişkenlerini ayarlayın ve betiği yürütür.

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

Betiği yürütürken, Sanal Ağ İşleviniz (VNF) için uyarlanmış bir VM görüntünüz olur. VNF'nizi dağıtmak için bu görüntüyü kullanabilirsiniz.

Not

VNF görüntüsünün doğru bir şekilde çekildiğinden emin olmak için ACR URL'sinin, Operatör Nexus sanal makinenizle kullanacağınız bulut hizmetleri ağının çıkış izin verme listesinde olduğundan emin olun.

Örnek kullanım

  1. Gerekli ortam değişkenlerini ayarlayın.

    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. Sağlanan betiği olarak create-container-disk.sh kaydedin ve yürütülebilir hale getirin.

    chmod +x create-container-disk.sh
    
  3. Betiği yürütün.

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

Sonraki adımlar

Oluşturduğunuz görüntüyü kullanarak bir VNF dağıtmak için Hızlı Başlangıç kılavuzuna bakın.