Azure Kubernetes Service (AKS) で内部ロード バランサーを使用する
内部ロード バランサーを作成して使用し、Azure Kubernetes Service (AKS) でアプリケーションへのアクセスを制限できます。 内部ロード バランサーは、Kubernetes サービスを Kubernetes クラスターと同じ仮想ネットワークで実行されているアプリケーションからのみアクセス可能にします。 この記事では、AKS で内部ロード バランサーを作成して使用する方法を示します。
注意
Azure Load Balancer は、Basic と Standard の 2 つの SKU で使用できます。 Standard SKU は、既定では AKS クラスターを作成するときに使用されます。 LoadBalancer という種類のサービスを作成すると、クラスターをプロビジョニングするときと同じ種類のロード バランサーが得られます。 詳細については、Azure Load Balancer SKU の比較に関するページを参照してください。
開始する前に
この記事は、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
を使用して内部ロード バランサーをデプロイし、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 サービスを内部ロード バランサーに接続する (プレビュー)
開始する前に
次のリソースが必要です。
- Azure CLI バージョン 2.0.59 以降。
- Kubernetes バージョン 1.22.x 以降。
- VNet とサブネットを持つ既存のリソース グループ。 このリソース グループで、プライベート エンドポイントを作成することになります。 これらのリソースがない場合は、「仮想ネットワークとサブネットを作成する」を参照してください。
Private Link サービス接続を作成する
Azure 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
を使用して内部ロード バランサーをデプロイし、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 サービスに対するプライベート エンドポイントを作成する
プライベート エンドポイントを使うと、作成した 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 サービスについてさらに学習する。