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

内部ロード バランサーを作成して使用し、Azure Kubernetes Service (AKS) でアプリケーションへのアクセスを制限できます。 内部ロード バランサーは、Kubernetes サービスを Kubernetes クラスターと同じ仮想ネットワークで実行されているアプリケーションからのみアクセス可能にします。 この記事では、AKS で内部ロード バランサーを作成して使用する方法を示します。

注意

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

開始する前に

この記事は、AKS クラスターがすでに存在していることを前提としています。 AKS クラスターが必要な場合は、Azure CLIAzure PowerShell、または Azure portal を使用して作成できます。

Azure CLI バージョン 2.0.59 以降も必要です。 バージョンを確認するには、az --version を実行します。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。

既存のサブネットまたはリソース グループを使用する場合は、AKS クラスター ID にネットワーク リソースを管理するためのアクセス許可が必要です。 詳細については、AKS の独自の IP アドレス範囲での kubenet ネットワークの使用または AKS での Azure CNI ネットワークの構成に関するページを参照してください。 別のサブネット内の IP アドレスを使用するようにロード バランサーを構成している場合は、AKS クラスターの ID にもそのサブネットへの読み取りアクセスがあることを確かめます。

アクセス許可の詳細については、他の Azure リソースへの AKS アクセスの委任に関する記事を参照してください。

内部ロード バランサーを作成します。

内部ロード バランサーを作成するには、次の例に示すように、サービスの種類 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

kubectl apply を使用して内部ロード バランサーをデプロイし、YAML マニフェストの名前を指定します。

kubectl apply -f internal-lb.yaml

このコマンドでは、AKS クラスターと同じ仮想ネットワークに接続される Azure ロード バランサーがノード リソース グループに作成されます。

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

次の例に示すように、IP アドレスが <[保留中]> から実際の内部 IP アドレスに変わるには 1 ~ 2 分かかることがあります。

kubectl get service internal-app

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 アドレスを使用する場合は、ロード バランサーの YAML マニフェストに loadBalancerIP プロパティを追加します。 このシナリオでは、指定された IP アドレスは AKS クラスターと同じサブネットに存在する必要がありますが、まだリソースに割り当てることはできません。 たとえば、AKS クラスター内の Kubernetes サブネットに指定された範囲の IP アドレスは使用できません。

注意

最初は IP アドレスを指定せずにサービスをデプロイし、後で loadBalancerIP プロパティを使って動的に割り当てられた IP アドレスを使うように構成を更新した場合でも、IP アドレスは動的に割り当てられたものと表示されます。

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

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

サービスの詳細を表示すると、EXTERNAL-IP 列の IP アドレスに、指定された IP アドレスが反映されているはずです。

kubectl get service internal-app

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

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

開始する前に

次のリソースが必要です。

Azure Private Link サービスを内部ロード バランサーにアタッチするには、次の例に示すように、サービスの種類が LoadBalancer、注釈が azure-load-balancer-internalazure-pls-createinternal-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

kubectl apply を使用して内部ロード バランサーをデプロイし、YAML マニフェストの名前を指定します。

kubectl apply -f internal-lb-pls.yaml

このコマンドでは、AKS クラスターと同じ仮想ネットワークに接続される Azure ロード バランサーがノード リソース グループに作成されます。

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

次の例に示すように、IP アドレスが <[保留中]> から実際の内部 IP アドレスに変わるには 1 ~ 2 分かかることがあります。

kubectl get service internal-app

NAME           TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
internal-app   LoadBalancer   10.125.17.53  10.125.0.66   80:30430/TCP   64m

Private Link Service オブジェクトも作成されます。 この Private Link Service オブジェクトは、Kubernetes サービスに関連付けられたロード バランサーのフロント エンド IP 構成に接続されます。 次のサンプル コマンドを使用して、Private Link Service オブジェクトの詳細を取得できます。

# Create a variable for the resource group

AKS_MC_RG=$(az aks show -g myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv)

# List the private link service

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 サービス オブジェクトにプライベートに接続できます。 これを行うには、サンプル コマンドに従います。

# 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

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

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

注意

Azure 仮想ネットワーク リソースがデプロイされるリソース グループへの "ネットワーク共同作成者" ロールを付与しなければならない場合があります。 az aks show を使用して、クラスター ID を表示できます (例: az aks show --resource-group myResourceGroup --name myAKSCluster --query "identity")。 ロールの割り当てを作成するには、az role assignment create コマンドを使用します。

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

サービスに 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 サービスについてさらに学習する。