仮想ノードを使用する 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 クラスターと同じ仮想ネットワークに関連付けることはできません。
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
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 クラスターを作成する
az network vnet subnet show
コマンドを使用してサブネット ID を取得します。az network vnet subnet show --resource-group myResourceGroup --vnet-name myVnet --name myAKSSubnet --query id -o tsv
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> \ --generate-ssh-keys
数分後、コマンドが完了すると、クラスターに関する JSON 形式の情報が返されます。
マネージド ID について詳しくは、「マネージド ID を使用する」をご覧ください。
仮想ノード アドオンを有効にする
az aks enable-addons
コマンドを使用して仮想ノードを有効にします。 次の例では、前の手順で作成した myVirtualNodeSubnet というサブネットを使用します。az aks enable-addons \ --resource-group myResourceGroup \ --name myAKSCluster \ --addons virtual-node \ --subnet-name myVirtualNodeSubnet
クラスターに接続する
az aks get-credentials
コマンドを使用して、Kubernetes クラスターに接続するようにkubectl
を構成します。 この手順では、資格情報をダウンロードし、Kubernetes CLI を構成してそれらの資格情報を使用します。az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
クラスターへの接続を確認するには、クラスター ノードの一覧を返す
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
サンプル アプリのデプロイ
virtual-node.yaml
という名前のファイルを作成し、そこに以下の YAML をコピーします。 YAML は、nodeSelector と toleration を定義することで、ノード上のコンテナーをスケジュールします。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
kubectl apply
コマンドを使用して、アプリケーションを実行します。kubectl apply -f virtual-node.yaml
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"
が報告されます。
仮想ノード ポッドのテスト
Web クライアントを使用してデモ アプリケーションを参照することで、仮想ノードで実行されているポッドをテストします。 ポッドには内部 IP アドレスが割り当てられているため、AKS クラスターの別のポッドからこの接続をすばやくテストできます。
次の
kubectl run -it
コマンドを使用して、テスト ポッドを作成し、それにターミナル セッションをアタッチします。kubectl run -it --rm testvk --image=mcr.microsoft.com/dotnet/runtime-deps:6.0
apt-get
を使用して、curl
をポッドにインストールします。apt-get update && apt-get install -y curl
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> [...]
exit
を使用してテスト ポッドへのターミナル セッションを閉じます。 セッションが終了すると、ポッドは削除されます。
仮想ノードを削除する
kubectl delete
コマンドを使用して、仮想ノードで実行されているaci-helloworld
ポッドを削除します。kubectl delete -f virtual-node.yaml
az aks disable-addons
コマンドを使用して仮想ノードを無効にします。az aks disable-addons --resource-group myResourceGroup --name myAKSCluster --addons virtual-node
次のコマンドを使用して、仮想ネットワーク リソースおよびリソース グループを削除します。
# 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 つのコンポーネントです。 スケーリング ソリューションの詳細については、次の記事を参照してください。
Azure Kubernetes Service