Azure Kubernetes Service (AKS) で内部ロード バランサーを使用する
内部ロード バランサーを作成して使用し、Azure Kubernetes Service (AKS) でアプリケーションへのアクセスを制限できます。 内部ロード バランサーにはパブリック IP がないため、プライベート IP に到達できるアプリケーションのみが Kubernetes サービスにアクセスできるようになります。 これらのアプリケーションは、同じ VNET 内に存在するか、または VNET ピアリングを介して別の VNET 内に存在できます。 この記事では、AKS で内部ロード バランサーを作成して使用する方法を示します。
重要
Basic Load Balancer は 2025 年 9 月 30 日に廃止されます。 詳細については、公式告知を参照してください。 現在 Basic Load Balancer をお使いの場合は、廃止日前に必ず Standard Load Balancer にアップグレードしてください。 アップグレードのガイダンスについては、「Basic Load Balancer からのアップグレード - ガイダンス」を参照してください。
開始する前に
- この記事は、AKS クラスターがすでに存在していることを前提としています。 AKS クラスターが必要な場合は、Azure CLI、Azure 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 アクセスの委任に関する記事を参照してください。
内部ロード バランサーを作成する
サービスの種類が
LoadBalancer
でazure-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
コマンドを使用して内部ロード バランサーをデプロイします。 このコマンドでは、AKS クラスターと同じ仮想ネットワークに接続される Azure ロード バランサーがノード リソース グループに作成されます。kubectl apply -f internal-lb.yaml
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 に続いて非推奨となっています。 現在の使用方法は変わらず、既存のサービスは変更せずに動作することが期待されますが、代わりにサービス注釈を設定することを強くお勧めします。 サービス注釈について詳しくは、Azure LoadBalancer でサポートされている注釈に関する記事をご覧ください。
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
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
異なるサブネットでのロード バランサーの構成について詳しくは、「別のサブネットを指定する」をご覧ください。
Azure Private Link サービスを内部ロード バランサーに接続する
開始する前に
- Kubernetes バージョン 1.22.x 以降が必要です。
- VNet とサブネットを持つ既存のリソース グループが必要です。 このリソース グループで、プライベート エンドポイントを作成します。 これらのリソースがない場合は、「仮想ネットワークとサブネットを作成する」を参照してください。
Private Link サービス接続を作成する
サービスの種類が
LoadBalancer
でazure-load-balancer-internal
とazure-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
kubectl apply
コマンドを使用して内部ロード バランサーをデプロイします。 このコマンドでは、AKS クラスターと同じ仮想ネットワークに接続される Azure ロード バランサーがノード リソース グループに作成されます。 また、Kubernetes サービスに関連付けられたロード バランサーのフロントエンド IP 構成に接続する Private Link サービス オブジェクトも作成されます。kubectl apply -f internal-lb-pls.yaml
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
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 サービスに対するプライベート エンドポイントを作成する
プライベート エンドポイントを使うと、作成した 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 リソースをカスタマイズするには、次の注釈を使用できます。
注釈 | 値 | 説明 | 必要 | 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 サービスのドキュメントを参照してください。
Azure Kubernetes Service