다음을 통해 공유


Azure Operator Nexus 가상 머신용 이미지 만들기

이 문서에서는 Operator Nexus에서 가상 머신을 만드는 데 사용할 수 있는 컨테이너 이미지를 만드는 방법을 알아봅니다. 특히 컨테이너 이미지에 가상 디스크를 추가하는 방법을 알아봅니다. 컨테이너 이미지가 빌드되어 Azure Container Registry에 푸시되면 Operator Nexus에서 가상 머신을 만드는 데 사용할 수 있습니다.

필수 조건

VM(가상 머신) 이미지 만들기를 시작하기 전에 다음 필수 구성 요소가 갖추어져 있는지 확인합니다.

  • 필요한 Azure CLI 확장의 최신 버전을 설치합니다.

  • 이 문서대로 하려면 Azure CLI 버전 2.49.0 이상이 필요합니다. Azure Cloud Shell을 사용하는 경우 최신 버전이 이미 설치되어 있습니다.

  • ACR(Azure Container Registry): 작동 중인 Azure Container Registry를 설정하여 컨테이너 이미지를 저장하고 관리합니다. ACR은 VM 이미지 만들기 프로세스에 사용되는 Docker 이미지를 저장하기 위한 안전한 프라이빗 레지스트리를 제공합니다. Azure Container Registry 설명서의 공식 설명서에 따라 ACR을 만들 수 있습니다.

  • Docker: 로컬 컴퓨터에 Docker를 설치합니다. Docker는 애플리케이션을 경량 컨테이너로 빌드, 패키지 및 배포할 수 있는 플랫폼입니다. Docker를 사용하여 VM 이미지를 빌드하고 패키지합니다. Docker의 공식 웹 사이트에서 Docker를 다운로드할 수 있습니다.

참고 항목

az login 명령을 사용하여 Azure에 인증할 수 있으며, 스크립트는 제공된 ACR 이름과 구독 ID를 사용하여 자동으로 ACR 로그인을 수행합니다. 컴퓨터에 Azure CLI가 설치되어 있지 않은 경우 대신 ACR 로그인을 위한 사용자 이름과 암호를 제공할 수 있습니다.

VM 이미지 만들기를 진행하기 전에 작동 중인 ACR(Azure Container Registry) 및 Docker가 컴퓨터에 설치되어 있는지 확인합니다. 컨테이너 이미지를 관리하고 VM 이미지를 빌드하는 데 필수적인 ACR 및 Docker의 사용법과 기능을 숙지합니다.

가상 머신 이미지 요구 사항

  • VNF(가상화된 네트워크 기능) 이미지가 cloud-init로 부팅할 수 있는 qcow2 형식인지 확인합니다.

  • 텍스트 기반 직렬 콘솔을 사용하도록 설정하려면 이미지에서 부트로더, 커널 및 초기화 시스템을 구성해야 합니다. 이 구성은 VM(가상 머신)에 대한 콘솔 지원을 사용하도록 설정하는 데 필요합니다. 적절한 통신을 설정하려면 시스템과 터미널의 직렬 포트 설정이 일치하는지 확인합니다.

  • VM 이미지가 cloud-init 버전 2를 지원하는지 확인하여 VM 초기화 프로세스 중에 고급 구성 옵션을 사용하도록 설정해야 합니다.

  • VM 이미지에 nocloud 데이터 원본이 포함된 cloud-init가 포함되어 있는지 확인해야 합니다. nocloud 데이터 원본은 VM 프로비전 중에 초기 구성 및 사용자 지정을 허용합니다.

  • 디스크는 컨테이너 내부의 /disk 디렉터리에 배치되어야 합니다.

  • 원시 및 qcow2 형식이 지원됩니다. 컨테이너 이미지의 크기를 줄이려면 Qcow2를 권장합니다.

  • 컨테이너 디스크는 이미지 자체 외에 파일이나 디렉터리가 포함되지 않은 빈 기본 이미지인 scratch 이미지를 기반으로 해야 합니다. scratch를 기본 이미지로 사용하면 컨테이너 이미지가 최대한 작아지고 VNF에 필요한 파일만 포함됩니다.

Operator Nexus 가상 머신용 이미지를 만드는 단계

제공된 스크립트를 사용하여 VNF용 이미지를 만들 수 있습니다. VNF 디스크 이미지 파일을 컨테이너의 /disk 디렉터리에 복사하는 Dockerfile을 생성합니다.

참고 항목

다음 스크립트는 예로 제공됩니다. 원하는 경우 스크립트를 따르는 대신 수동으로 컨테이너 이미지를 만들고 푸시할 수 있습니다.

다음 환경 변수는 VNF용 VM(가상 머신) 이미지를 만들기 위한 스크립트를 구성하는 데 사용됩니다. 스크립트를 실행하기 전에 다음 변수를 사용자 고유의 값으로 수정하고 내보냅니다.


# 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(가상화된 네트워크 기능)에 대한 VM 이미지를 만들려면 제공된 스크립트를 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(가상화된 네트워크 기능)에 맞게 조정된 VM 이미지가 생성됩니다. 이 이미지를 사용하여 VNF를 배포할 수 있습니다.

예제 사용

  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!
    

다음 단계

만든 이미지를 사용하여 VNF를 배포하려면 빠른 시작 가이드를 참조하세요.