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

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

注意

Azure Load Balancer は、BasicStandard の 2 つの SKU で使用できます。 Standard SKU は、既定では AKS クラスターを作成するときに使用されます。 LoadBalancer という種類のサービスを作成すると、クラスターをプロビジョニングするときと同じ種類のロード バランサーが得られます。 詳細については、Azure Load Balancer SKU の比較に関するページを参照してください。

開始する前に

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

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

    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 クラスターと同じ仮想ネットワークに存在する必要がありますが、仮想ネットワーク内の別のリソースに既に割り当てられていてはなりません。 たとえば、AKS クラスター内の Kubernetes サブネットに指定された範囲の IP アドレスは使用できません。 同じ仮想ネットワーク内の別のリソースに既に割り当てられている IP アドレスを使うと、ロード バランサーで問題が発生する可能性があります。

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

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

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

重要

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

  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
    
  1. 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
    

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

開始する前に

  1. サービスの種類が LoadBalancerazure-load-balancer-internalazure-pls-create の注釈を持つ internal-lb-pls.yaml という名前のサービス マニフェストを作成します。 その他のオプションについては、「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 サービス オブジェクトも作成されます。

    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 コマンドを使用してプライベート エンドポイントを作成します。

    # Create a variable for the private link service
    
    AKS_PLS_ID=$(az network private-link-service list -g $AKS_MC_RG --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 のカスタマイズ

以下は、PLS リソースをカスタマイズするために使用できる注釈です。

Annotation 説明 必要 Default
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 がデプロイされるサブネットを示す文字列。 このサブネットは、バックエンド プールと同じ VNET に存在する必要があります。 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 に関連付けられている FQDN のスペース区切りのリスト。 省略可能 []
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" または "*" プライベート リンク サービスが表示される Azure サブスクリプション ID のスペース区切りのリスト。 PLS をすべてのサブスクリプションに公開するには、"*" を使います (最も制限が少ない)。 省略可能 ロールベースのアクセス制御のみを示す空のリスト []: このプライベート リンク サービスは、ディレクトリ内でロールベースのアクセス制御のアクセス許可を持つ個人のみが利用できます。 (最も制限が厳しい)
service.beta.kubernetes.io/azure-pls-auto-approval "sub1 sub2 sub3 … subN" Azure サブスクリプション ID のスペース区切りのリスト。 これにより、リストされたサブスクリプションから PLS への PE 接続要求が自動的に承認されるようになります。 これは、可視性が "*" に設定されている場合にのみ機能します。 省略可能 []

プライベート ネットワークを使用する

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

Note

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

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

  • 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
    

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

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

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

次のステップ

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