Azure Operator Nexus 仮想マシンのイメージを作成する

この記事では、Operator Nexus で仮想マシンを作成するために使用できるコンテナー イメージを作成する方法について説明します。 具体的には、コンテナー イメージに仮想ディスクを追加する方法について説明します。 コンテナー イメージを構築して Azure コンテナー レジストリにプッシュすると、それを使用して Operator Nexus で仮想マシンを作成できます。

前提条件

仮想マシン (VM) イメージの作成を開始する前に、以下の前提条件を満たしていることを確認してください。

  • 必要な Azure CLI 拡張機能の最新バージョンをインストールします。

  • この記事では、Azure CLI のバージョン 2.49.0 以降が必要です。 Azure Cloud Shell を使用している場合は、最新バージョンが既にインストールされています。

  • Azure Container Registry (ACR): コンテナー イメージを格納および管理するために、動作する Azure Container Registry を設定します。 ACR は、VM イメージ作成プロセスで使用される Docker イメージを格納するためのセキュリティで保護されたプライベート レジストリを提供します。 ACR は、Azure Container Registry の公式ドキュメントに従って作成できます。

  • Docker: ローカル コンピューターに Docker をインストールします。 Docker は、軽量コンテナーとしてアプリケーションをビルド、パッケージ化、配布できるプラットフォームです。 Docker を使用して VM イメージをビルドしてパッケージ化します。 Docker の公式 Web サイトから Docker をダウンロードできます。

Note

az login コマンドを使用して Azure で認証できます。スクリプトによって、指定された ACR 名とサブスクリプション ID を使用して ACR ログインが自動的に実行されます。 マシンに Azure CLI がインストールされていない場合は、代わりに ACR ログインのユーザー名とパスワードを指定できます。

VM イメージの作成に進む前に、運用可能な Azure Container Registry (ACR) と Docker がマシンにインストールされていることを確認します。 コンテナー イメージの管理と VM イメージの構築に不可欠であるため、ACR と Docker の使用方法と機能について十分に理解しておいてください。

仮想マシン イメージの要件

  • 仮想ネットワーク機能 (VNF) イメージが、cloud-init で起動できる qcow2 形式であることを確認します。

  • テキスト ベースのシリアル コンソールを有効にするには、イメージでブートローダー、カーネル、init システムを構成する必要があります。 この構成は、仮想マシン (VM) のコンソール サポートを有効にするために必要です。 システムと端末のシリアル ポート設定が一致していることを確認して、適切な通信を確立してください。

  • VM イメージで cloud-init バージョン 2 がサポートされていることを確認し、VM 初期化プロセス中に高度な構成オプションを有効にする必要があります。

  • VM イメージに、nocloud データソースを持つ cloud-init が含まれていることを確認する必要があります。 nocloud データソースを使用すると、VM のプロビジョニング中に初期構成とカスタマイズを行うことができます。

  • ディスクは、コンテナー内の /disk ディレクトリに配置する必要があります。

  • Raw 形式と qcow2 形式がサポートされています。 コンテナー イメージのサイズを小さくするために、Qcow2 をお勧めします。

  • コンテナー ディスクは、scratch イメージに基づいている必要があります。これは、イメージ自体以外のファイルやディレクトリを含まない空の基本イメージです。 基本イメージとして scratch を使用すると、コンテナー イメージは可能な限り小さくなり、VNF に必要なファイルのみが含まれます。

Operator Nexus 仮想マシンのイメージを作成する手順

指定されたスクリプトを使用して、VNF のイメージを作成できます。 VNF ディスク イメージ ファイルをコンテナーの /disk ディレクトリにコピーする Dockerfile が生成されます。

Note

次のスクリプトを例として示します。 必要に応じて、スクリプトに従う代わりに、コンテナー イメージを手動で作成してプッシュできます。

次の環境変数は、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 をデプロイするには、クイックスタート ガイドを参照してください。