仮想ノードを使用する Azure Kubernetes Service (AKS) クラスターを、Azure CLI を使用して作成および構成する

仮想ノードを使用すると、Azure Container Instances (ACI) および AKS クラスターで実行されるポッド間のネットワーク通信ができるようになります。 この通信を提供するには、仮想ネットワーク サブネットを作成し、委任されたアクセス許可を割り当てます。 仮想ノードは、"高度" ネットワーク (Azure CNI) を使用して作成された AKS クラスターに対してのみ機能します。 既定では、AKS クラスターは "基本" ネットワーク (kubenet) を使用して作成されます。 この記事では、仮想ネットワークとサブネットを作成した後、高度ネットワークを使用した AKS クラスターをデプロイする方法について説明します。

この記事では、仮想ネットワーク リソースと AKS クラスター (仮想ノードが有効になっている) を、Azure CLI を使用して作成および構成する方法を示します。

開始する前に

重要

AKS で仮想ノードを使用する前に、AKS 仮想ノードの制限事項ACI の仮想ネットワークの制限事項の両方をご確認ください。 これらの制限は、AKS クラスターと仮想ノードの両方の場所、ネットワーク構成、およびその他の構成の詳細に影響します。

  • サブスクリプションに登録されている ACI サービス プロバイダーが必要です。 az provider list コマンドを使用して、ACI プロバイダーの登録状態をチェックできます。

    az provider list --query "[?contains(namespace,'Microsoft.ContainerInstance')]" -o table
    

    Microsoft.ContainerInstance プロバイダーは、次の出力の例で示すように Registered としてレポートします。

    Namespace                    RegistrationState    RegistrationPolicy
    ---------------------------  -------------------  --------------------
    Microsoft.ContainerInstance  Registered           RegistrationRequired
    

    プロバイダーが NotRegistered と表示される場合は、az provider register を使用してプロバイダーを登録します。

    az provider register --namespace Microsoft.ContainerInstance
    
  • Azure CLI を使用している場合、この記事では Azure CLI バージョン 2.0.49 以降が必要です。 バージョンを確認するには、az --version を実行します。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。 Azure Cloud Shell を使用することもできます。

Azure Cloud Shell を起動する

Azure Cloud Shell は無料の対話型シェルで、これを使用してこの記事の手順を行うことができます。 一般的な Azure ツールがプレインストールおよび構成されています。

Cloud Shell を開くには、コード ブロックの右上隅にある [使ってみる] を選択します。 https://shell.azure.com/bash に移動して、別のブラウザー タブで Cloud Shell を起動することもできます。 [コピー] を選択してコードのブロックをコピーし、Cloud Shell に貼り付けてから、Enter キーを押して実行します。

リソース グループを作成する

Azure リソース グループは、Azure リソースが展開され管理される論理グループです。

  • az group create コマンドを使用して、リソース グループを作成します。

    az group create --name myResourceGroup --location eastus
    

仮想ネットワークの作成

重要

仮想ノードには、カスタム仮想ネットワークと関連付けられたサブネットが必要です。 AKS クラスターと同じ仮想ネットワークに関連付けることはできません。

  1. az network vnet create コマンドを使用して、仮想ネットワークを作成します。 次の例では、10.0.0.0/8 のアドレス プレフィックスを持つ myVnet という仮想ネットワーク、および myAKSSubnet というサブネットを作成します。 このサブネットのアドレス プレフィックスは、既定で 10.240.0.0/16 に設定されます。

    az network vnet create \
        --resource-group myResourceGroup \
        --name myVnet \
        --address-prefixes 10.0.0.0/8 \
        --subnet-name myAKSSubnet \
        --subnet-prefix 10.240.0.0/16
    
  2. az network vnet subnet create コマンドを使用して、仮想ノード用に追加のサブネットを作成します。 次の例では、10.241.0.0/16 のアドレス プレフィックスを持つ myVirtualNodeSubnet というサブネットを作成します。

    az network vnet subnet create \
        --resource-group myResourceGroup \
        --vnet-name myVnet \
        --name myVirtualNodeSubnet \
        --address-prefixes 10.241.0.0/16
    

マネージド ID を指定して AKS クラスターを作成する

  1. az network vnet subnet show コマンドを使用してサブネット ID を取得します。

    az network vnet subnet show --resource-group myResourceGroup --vnet-name myVnet --name myAKSSubnet --query id -o tsv
    
  2. az aks create コマンドを使用して (<subnetId> は前の手順で取得した ID に置き換えて)、AKS クラスターを作成します。 次の例では、5 つのノードを備えた myAKSCluster というクラスターを作成します。

    az aks create \
        --resource-group myResourceGroup \
        --name myAKSCluster \
        --node-count 5 \
        --network-plugin azure \
        --vnet-subnet-id <subnetId>
    

    数分後、コマンドが完了すると、クラスターに関する JSON 形式の情報が返されます。

マネージド ID について詳しくは、「マネージド ID を使用する」をご覧ください。

仮想ノード アドオンを有効にする

  • az aks enable-addons コマンドを使用して仮想ノードを有効にします。 次の例では、前の手順で作成した myVirtualNodeSubnet というサブネットを使用します。

    az aks enable-addons \
        --resource-group myResourceGroup \
        --name myAKSCluster \
        --addons virtual-node \
        --subnet-name myVirtualNodeSubnet
    

クラスターに接続する

  1. az aks get-credentials コマンドを使用して、Kubernetes クラスターに接続するように kubectl を構成します。 この手順では、資格情報をダウンロードし、Kubernetes CLI を構成してそれらの資格情報を使用します。

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    
  2. クラスターへの接続を確認するには、クラスター ノードの一覧を返す kubectl get コマンドを使用します。

    kubectl get nodes
    

    次の出力例は、作成された単一の VM ノードと、Linux 用の仮想ノード virtual-node-aci-linux を示しています。

    NAME                          STATUS    ROLES     AGE       VERSION
    virtual-node-aci-linux        Ready     agent     28m       v1.11.2
    aks-agentpool-14693408-0      Ready     agent     32m       v1.11.2
    

サンプル アプリのデプロイ

  1. virtual-node.yaml という名前のファイルを作成し、そこに以下の YAML をコピーします。 YAML は、nodeSelectortoleration を定義することで、ノード上のコンテナーをスケジュールします。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: aci-helloworld
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: aci-helloworld
      template:
        metadata:
          labels:
            app: aci-helloworld
        spec:
          containers:
          - name: aci-helloworld
            image: mcr.microsoft.com/azuredocs/aci-helloworld
            ports:
            - containerPort: 80
          nodeSelector:
            kubernetes.io/role: agent
            beta.kubernetes.io/os: linux
            type: virtual-kubelet
          tolerations:
          - key: virtual-kubelet.io/provider
            operator: Exists
          - key: azure.com/aci
            effect: NoSchedule
    
  2. kubectl apply コマンドを使用して、アプリケーションを実行します。

    kubectl apply -f virtual-node.yaml
    
  3. kubectl get pods コマンドと -o wide 引数を使用して、ポッドとスケジュールされたノードの一覧を取得します。

    kubectl get pods -o wide
    

    次の出力例で示すように、ポッドは仮想ノード virtual-node-aci-linux でスケジュールされています。

    NAME                            READY     STATUS    RESTARTS   AGE       IP           NODE
    aci-helloworld-9b55975f-bnmfl   1/1       Running   0          4m        10.241.0.4   virtual-node-aci-linux
    

    ポッドには、仮想ノードで使用するために委任された Azure 仮想ネットワーク サブネットからの内部 IP アドレスが割り当てられます。

Note

Azure Container Registry に格納されているイメージを使用する場合、Kubernetes シークレットを構成して使用します。 現在、仮想ノードには、Microsoft Entra サービス プリンシパル統合認証を使用できないという制限があります。 シークレットを使用しない場合、仮想ノードでスケジュールされたポッドの開始に失敗し、エラー HTTP response status code 400 error code "InaccessibleImage" が報告されます。

仮想ノード ポッドのテスト

  1. Web クライアントを使用してデモ アプリケーションを参照することで、仮想ノードで実行されているポッドをテストします。 ポッドには内部 IP アドレスが割り当てられているため、AKS クラスターの別のポッドからこの接続をすばやくテストできます。

  2. 次の kubectl run -it コマンドを使用して、テスト ポッドを作成し、それにターミナル セッションをアタッチします。

    kubectl run -it --rm testvk --image=mcr.microsoft.com/dotnet/runtime-deps:6.0
    
  3. apt-get を使用して、curl をポッドにインストールします。

    apt-get update && apt-get install -y curl
    
  4. curl を使用して、ポッドのアドレス (http://10.241.0.4 など) にアクセスします。 前の kubectl get pods コマンドで表示された内部 IP アドレスを入力します。

    curl -L http://10.241.0.4
    

    次の簡約された出力例に示されているように、デモ アプリケーションが表示されます。

    <html>
    <head>
      <title>Welcome to Azure Container Instances!</title>
    </head>
    [...]
    
  5. exit を使用してテスト ポッドへのターミナル セッションを閉じます。 セッションが終了すると、ポッドは削除されます。

仮想ノードを削除する

  1. kubectl delete コマンドを使用して、仮想ノードで実行されている aci-helloworld ポッドを削除します。

    kubectl delete -f virtual-node.yaml
    
  2. az aks disable-addons コマンドを使用して仮想ノードを無効にします。

    az aks disable-addons --resource-group myResourceGroup --name myAKSCluster --addons virtual-node
    
  3. 次のコマンドを使用して、仮想ネットワーク リソースおよびリソース グループを削除します。

    # Change the name of your resource group, cluster and network resources as needed
    RES_GROUP=myResourceGroup
    AKS_CLUSTER=myAKScluster
    AKS_VNET=myVnet
    AKS_SUBNET=myVirtualNodeSubnet
    
    # Get AKS node resource group
    NODE_RES_GROUP=$(az aks show --resource-group $RES_GROUP --name $AKS_CLUSTER --query nodeResourceGroup --output tsv)
    
    # Get network profile ID
    NETWORK_PROFILE_ID=$(az network profile list --resource-group $NODE_RES_GROUP --query "[0].id" --output tsv)
    
    # Delete the network profile
    az network profile delete --id $NETWORK_PROFILE_ID -y
    
    # Grab the service association link ID
    SAL_ID=$(az network vnet subnet show --resource-group $RES_GROUP --vnet-name $AKS_VNET --name $AKS_SUBNET --query id --output tsv)/providers/Microsoft.ContainerInstance/serviceAssociationLinks/default
    
    # Delete the service association link for the subnet
    az resource delete --ids $SAL_ID --api-version 2021-10-01
    
    # Delete the subnet delegation to Azure Container Instances
    az network vnet subnet update --resource-group $RES_GROUP --vnet-name $AKS_VNET --name $AKS_SUBNET --remove delegations
    

次のステップ

この記事では、仮想ノード上でポッドをスケジュールし、プライベート内部 IP アドレスを割り当てました。 代わりに、サービスのデプロイを作成して、ロード バランサーまたはイングレス コントローラーを使用してトラフィックを自分のポッドにルーティングすることもできます。 詳細は、AKS での基本的なイングレス コント ローラーの作成を参照してください。

多くの場合、仮想ノードは AKS のスケーリング ソリューションの 1 つのコンポーネントです。 スケーリング ソリューションの詳細については、次の記事を参照してください。