Azure Kubernetes Service (AKS) で内部ロード バランサーを使用する

内部ロード バランサーを作成して使用し、Azure Kubernetes Service (AKS) でアプリケーションへのアクセスを制限できます。 内部ロード バランサーにはパブリック IP がないため、プライベート IP に到達できるアプリケーションのみが Kubernetes サービスにアクセスできるようになります。 これらのアプリケーションは、同じ仮想ネットワーク内、または仮想ネットワーク ピアリングを介して別の仮想ネットワーク内に存在できます。 この記事では、AKS で内部ロード バランサーを作成して使用する方法を示します。

重要

2025 年 9 月 30 日から、Azure Kubernetes Service (AKS) は Basic Load Balancer をサポートしなくなりました。 潜在的なサービス中断を回避するために、新しいデプロイに Standard Load Balancer を使用し、 既存のデプロイを Standard Load Balancer にアップグレードすることをお勧めします。 この提供終了の詳細については、 廃止に関する GitHub の問題Azure 更新プログラムの提供終了に関する発表を参照してください。 お知らせや更新情報を常に把握するには、 AKS のリリース ノートに従ってください。

開始する前に

  • この記事は、AKS クラスターがすでに存在していることを前提としています。 AKS クラスターが必要な場合は、Azure CLIAzure PowerShell、または Azure portal を使用して作成できます。
  • Azure CLI バージョン 2.0.59 以降が必要です。 バージョンを確認するには、az --version を実行します。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。
  • 既存のサブネットまたはリソース グループを使用する場合は、AKS クラスター ID にネットワーク リソースを管理するためのアクセス許可が必要です。 詳細については、 AKS での Azure CNI ネットワークの構成に関するページを参照してください。 別のサブネット内の IP アドレスを使用するようにロード バランサーを構成している場合は、AKS クラスター ID にもそのサブネットへのReadアクセス権があることを確認します。

内部ロード バランサーを作成する

  1. サービスの種類が internal-lb.yamlLoadBalancer 注釈を持つ azure-load-balancer-internal という名前のサービス マニフェストを作成します。

    apiVersion: v1
    kind: Service
    metadata:
      name: internal-app
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: internal-app
    
  2. kubectl apply コマンドを使用して内部ロード バランサーをデプロイします。 このコマンドでは、AKS クラスターと同じ仮想ネットワークに接続される Azure ロード バランサーがノード リソース グループに作成されます。

    kubectl apply -f internal-lb.yaml
    
  3. kubectl get service コマンドを使用してサービスの詳細を表示します。

    kubectl get service internal-app
    

    次の出力例に示すように、内部ロード バランサーの IP アドレスが EXTERNAL-IP 列に表示されます。 このコンテキストでは、''外部'' はロード バランサーの外部インターフェイスを示します。 これは、パブリックな外部 IP アドレスを受信することを意味するものではありません。 この IP アドレスは、AKS クラスターと同じサブネットから動的に割り当てられます。

    NAME           TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    internal-app   LoadBalancer   10.0.248.59   10.240.0.7    80:30555/TCP   2m
    

IP アドレスを指定する

ロード バランサーの IP アドレスを指定する場合は、ロード バランサーによって使用されるサブネット内で IP アドレスを使用できる必要があります。 既定では、ロード バランサーは AKS クラスターと同じサブネットを使用します。 Azure予約済み IP アドレス、別のリソースに既に割り当てられている IP アドレス、または Kubernetes サービス CIDR の IP アドレスは使用しないでください。

az network vnet subnet list Azure CLI コマンドまたは Get-AzVirtualNetworkSubnetConfig PowerShell コマンドレットを使用して、仮想ネットワーク内のサブネットを取得できます。

サブネットの詳細については、「一意のサブネットを持つノード プールを追加する」を参照してください。

ロード バランサーで特定の IP アドレスを使用する場合は、サービス注釈を設定するか、ロード バランサー YAML マニフェストに LoadBalancerIP プロパティを追加するという 2 つの選択肢があります。

重要

LoadBalancerIP プロパティをロード バランサーの YAML マニフェストに追加することは、アップストリームの Kubernetes に続いて非推奨となります。 現在の使用方法は変わらず、既存のサービスは変更せずに動作することが期待されますが、代わりにサービス注釈を設定することを強くお勧めします。 サービス注釈の詳細については、「Azure Load Balancerサポートされている注釈を参照してください。

  1. IPv 4 アドレスの場合は service.beta.kubernetes.io/azure-load-balancer-ipv4、IPv 6 アドレスの場合は service.beta.kubernetes.io/azure-load-balancer-ipv6 を使用して、サービス注釈を設定します。

    apiVersion: v1
    kind: Service
    metadata:
      name: internal-app
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-ipv4: 10.240.0.25
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: internal-app
    
  2. kubectl get service コマンドを使用してサービスの詳細を表示します。

    kubectl get service internal-app
    

    次の出力例に示すように、EXTERNAL-IP 列の IP アドレスには、指定した IP アドレスが反映されている必要があります。

    NAME           TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
    internal-app   LoadBalancer   10.0.184.168   10.240.0.25   80:30225/TCP   4m
    

異なるサブネットでのロード バランサーの構成について詳しくは、「別のサブネットを指定する」をご覧ください。

重要

Private Link サービスには、次の制限があります。

  • Private Link サービスは IPv4 トラフィックのみをサポートし、TCP および UDP トランスポート プロトコルのみをサポートします。
  • サービスがexternalTrafficPolicy: Localを使用する場合、Private Link サービス サブネットはポッド サブネットとは異なる必要があります。 同じサブネットを使用するには、 externalTrafficPolicyCluster に設定します。
  • PROXY プロトコルを有効にし、 externalTrafficPolicy: Localを使用する場合は、既定の正常性プローブが失敗するため、カスタム正常性プローブを構成する必要があります。

詳細については、「Private Link サービスの制限事項サービス統合の制限Azure Private Link」を参照してください。

  1. サービスの種類が internal-lb-pls.yamlLoadBalancerazure-load-balancer-internal の注釈を持つ azure-pls-create という名前のサービス マニフェストを作成します。 その他のオプションについては、「Azure Private Link サービス統合」設計ドキュメントを参照してください。

    apiVersion: v1
    kind: Service
    metadata:
      name: internal-app
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
        service.beta.kubernetes.io/azure-pls-create: "true"
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: internal-app
    
  2. kubectl apply コマンドを使用して内部ロード バランサーをデプロイします。 このコマンドでは、AKS クラスターと同じ仮想ネットワークに接続される Azure ロード バランサーがノード リソース グループに作成されます。 また、Kubernetes サービス オブジェクトに関連付けられている内部ロード バランサーのフロントエンド IP 構成に接続する Private Link Service オブジェクトも作成します。

    kubectl apply -f internal-lb-pls.yaml
    
  3. kubectl get service コマンドを使用してサービスの詳細を表示します。

    kubectl get service internal-app
    

    次の出力例に示すように、内部ロード バランサーの IP アドレスが EXTERNAL-IP 列に表示されます。 このコンテキストでは、''外部'' はロード バランサーの外部インターフェイスを示します。 これは、パブリックな外部 IP アドレスを受信することを意味するものではありません。

    NAME           TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    internal-app   LoadBalancer   10.125.17.53  10.125.0.66   80:30430/TCP   64m
    
  4. az network private-link-service list コマンドを使用して、Private Link サービス オブジェクトの詳細を表示します。

    # Create a variable for the node resource group
    
    AKS_MC_RG=$(az aks show -g myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv)
    
    # View the details of the Private Link Service object
    
    az network private-link-service list -g $AKS_MC_RG --query "[].{Name:name,Alias:alias}" -o table
    

    出力は次の出力例のようになります。

    Name      Alias
    --------  -------------------------------------------------------------------------
    pls-xyz   pls-xyz.abc123-defg-4hij-56kl-789mnop.eastus2.azure.privatelinkservice
    

プライベート エンドポイントを使うと、作成した Private Link Service を介して Kubernetes サービス オブジェクトにプライベートに接続できます。

az network private-endpoint create コマンドを使用してプライベート エンドポイントを作成します。 pls-xyzを、前の手順で返された Private Link サービス名に置き換えます。

--resource-groupプライベート エンドポイントを作成するターゲット リソース グループに設定します。 --vnet-name--subnetを、プライベート エンドポイントを含む仮想ネットワークとサブネットに設定します。 --private-connection-resource-idを、AKS_PLS_IDで取得した Private Link サービス リソース ID に設定します。

# Create variables for the Private Link Service

AKS_PLS_NAME=pls-xyz
AKS_PLS_ID=$(az network private-link-service show -g $AKS_MC_RG --name $AKS_PLS_NAME --query id -o tsv)

# Create the private endpoint

az network private-endpoint create \
    -g myOtherResourceGroup \
    --name myAKSServicePE \
    --vnet-name myOtherVNET \
    --subnet pe-subnet \
    --private-connection-resource-id $AKS_PLS_ID \
    --connection-name connectToMyK8sService

PLS リソースをカスタマイズするには、次の注釈を使用できます。

注釈 説明 必須 既定
service.beta.kubernetes.io/azure-pls-create "true" PLS を作成する必要があるかどうかを示すブール値。 必須
service.beta.kubernetes.io/azure-pls-name <PLS name> 作成する PLS リソースの名前を指定する文字列。 任意 "pls-<LB frontend config name>"
service.beta.kubernetes.io/azure-pls-resource-group Resource Group name PLS リソースが作成されるリソース グループの名前を指定する文字列 任意 MC_resource
service.beta.kubernetes.io/azure-pls-ip-configuration-subnet <Subnet name> PLS がデプロイされるサブネットを示す文字列。 このサブネットは、バックエンド プールと同じ仮想ネットワークに存在する必要があります。 PLS NAT IP はこのサブネット内に割り当てられます。 任意 service.beta.kubernetes.io/azure-load-balancer-internal-subnet の場合、この ILB サブネットが使われます。 それ以外の場合は、構成ファイルの既定のサブネットが使われます。
service.beta.kubernetes.io/azure-pls-ip-configuration-ip-address-count [1-8] 割り当てるプライベート NAT IP の合計数。 任意 1
service.beta.kubernetes.io/azure-pls-ip-configuration-ip-address "10.0.0.7 ... 10.0.0.10" 割り当てられる静的 IPv4 IP のスペース区切りのリスト (IPv6 は現在サポートされていません)。IP の合計数は、 service.beta.kubernetes.io/azure-pls-ip-configuration-ip-address-countで指定された IP 数を超えてはなりません。 指定された IP が少ない場合、残りは動的に割り当てられます。 リストの最初の IP は、Primary として設定されます。 任意 すべての IP は動的に割り当てられます。
service.beta.kubernetes.io/azure-pls-fqdns "fqdn1 fqdn2" PLS に関連付けられている完全修飾ドメイン名のスペース区切りリスト。 任意 []
service.beta.kubernetes.io/azure-pls-proxy-protocol "true" または "false" リンク ID やソース IP アドレスなどの接続情報を渡すために、PLS 上で TCP PROXY プロトコルを有効にするかどうかを示すブール値。 バックエンドサービスは PROXY プロトコルをサポートしている必要があり、そうでない場合は接続は失敗します。 任意 false
service.beta.kubernetes.io/azure-pls-visibility "sub1 sub2 sub3 … subN" または "*" Private Link Service を表示できる Azure サブスクリプション ID のスペース区切りの一覧。 PLS をすべてのサブスクリプションに公開するには、"*" を使います (最も制限が少ない)。 任意 ロールベースのアクセス制御のみを示す空のリスト[]: このPrivate Link サービスは、テナント間で承認されたユーザーを含む、必要なAzure RBAC アクセス許可を持つユーザーのみが使用できます。 (最も制限が厳しい)
service.beta.kubernetes.io/azure-pls-auto-approval "sub1 sub2 sub3 … subN" PLS への PE 接続要求が自動的に承認される Azure サブスクリプション ID のスペース区切りの一覧。 自動承認リストは、可視性リストのサブセットである必要があります。 任意 []

プライベート ネットワークで内部ロード バランサーを使用する

AKS クラスターを作成するときに、高度なネットワーク設定を指定できます。 これらの設定を使うと、既存の Azure 仮想ネットワークとサブネットにクラスターをデプロイできます。 たとえば、オンプレミス環境に接続されたプライベート ネットワークに AKS クラスターをデプロイし、内部的にのみアクセスできるサービスを実行できます。

詳細については、Azure CNI または Kubenet での仮想ネットワーク サブネットの構成に関するページを参照してください。

AKS クラスターにプライベート ネットワークを使用する内部ロード バランサーをデプロイする場合、前の手順を変更する必要はありません。 ロード バランサーは、次の例に示すように、AKS クラスターのノード リソース グループに作成され、プライベート仮想ネットワークとサブネットに接続されます。

kubectl get service internal-app

NAME           TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
internal-app   LoadBalancer   10.1.15.188   10.0.0.35     80:31669/TCP   1m

AKS クラスターで使用されるクラスター ID には、少なくとも、仮想ネットワークのリソースに対するネットワーク共同作成者のロールが必要です。 クラスター ID は、az aks show などの az aks show --resource-group <resource-group-name> --name <cluster-name> --query "identity" コマンドを使って表示できます。 ネットワーク共同作成者ロールは、az role assignment create などの az role assignment create --assignee <identity-resource-id> --scope <virtual-network-resource-id> --role "Network Contributor" コマンドを使って割り当てることができます。

代わりに、カスタム ロールを定義する場合は、次のアクセス許可が必要です。

  • Microsoft.Network/virtualNetworks/subnets/join/action
  • Microsoft.Network/virtualNetworks/subnets/read

詳細については、「仮想ネットワーク サブネットの追加、変更、削除」を参照してください。

別のサブネットを指定する

azure-load-balancer-internal-subnet 注釈をサービスに追加して、ロード バランサーのサブネットを指定します。 指定されたサブネットは、AKS クラスターと同じ仮想ネットワーク内に存在する必要があります。 デプロイされると、ロード バランサーの EXTERNAL-IP アドレスが、指定されたサブネットの一部になります。

apiVersion: v1
kind: Service
metadata:
  name: internal-app
  annotations:
    service.beta.kubernetes.io/azure-load-balancer-internal: "true"
    service.beta.kubernetes.io/azure-load-balancer-internal-subnet: "apps-subnet"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: internal-app

service.beta.kubernetes.io/azure-load-balancer-internal-subnet注釈値をサブネット名の文字列 ("apps-subnet" など) に設定します。

ロード バランサーを削除する

ロード バランサーは、そのすべての Kubernetes サービスを削除すると削除されます。

すべての Kubernetes リソースと同様に、kubectl delete service internal-app など、サービスを直接削除することができます。それにより、基礎となる Azure ロード バランサーも削除されます。

次のステップ

Kubernetes サービスについて学習するには、Kubernetes サービスのドキュメントを参照してください。