Azure Kubernetes Service (AKS) クラスターでロード バランサー リソースを作成する場合、割り当てられたパブリック IP アドレスは、そのリソースの有効期間中のみ有効です。 Kubernetes サービスを削除すると、関連付けられているロード バランサーと IP アドレスも削除されます。 デプロイし直された Kubernetes サービスに対して特定の IP アドレスを割り当てるか、あるいは IP アドレスを保持する場合は、静的パブリック IP アドレスを作成して、使用することができます。
この記事では、静的パブリック IP アドレスを作成して、Kubernetes サービスに割り当てる方法を示します。
開始する前に
- Azure CLI バージョン 2.0.59 以降がインストールされて構成されている必要があります。 バージョンを確認するには、
az --versionを実行します。 インストールまたはアップグレードするには、「Install Azure CLIを参照してください。 - この記事では、Standard SKU IP を Standard SKU ロード バランサーと共に使用する方法について説明します。 詳しくは、「Azure における IP アドレスの種類と割り当て方法」をご覧ください。
AKS クラスターを作成する
az group createコマンドを使用して、Azure リソース グループを作成します。az group create --name myNetworkResourceGroup --location eastusaz aks createコマンドを使用して AKS クラスターを作成します。az aks create --name myAKSCluster --resource-group myNetworkResourceGroup --generate-ssh-keys
静的 IP アドレスを作成する
az aks showコマンドとnodeResourceGroupプロパティのクエリを使用し、ノード リソース グループの名前を取得します。az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query nodeResourceGroup -o tsvaz network public-ip createコマンドを使用して、ノード リソース グループに静的パブリック IP アドレスを作成します。az network public-ip create \ --resource-group <node resource group name> \ --name myAKSPublicIP \ --sku Standard \ --allocation-method static重要
AKS は Basic Load Balancerをサポートしなくなりました。 クラスターで Basic Load Balancerを使用している場合は、静的パブリック IP アドレスを構成する前に、Standard Load Balancerにアップグレードします。
az network public-ip showコマンドを使用して静的パブリック IP アドレスを取得します。 ノード リソース グループの名前と、作成したパブリック IP アドレスを指定し、ipAddressのクエリを実行します。az network public-ip show --resource-group <node resource group name> --name myAKSPublicIP --query ipAddress --output tsv
静的 IP アドレスを使用して Kubernetes サービスを作成する
load-balancer-service.yamlという名前のファイルを作成し、次の YAML ファイルの内容をコピーします。 「静的 IP アドレスの作成」セクションで作成したパブリック IP リソース名 (myAKSPublicIP) とノード リソース グループ名を指定します。AKS コントロール プレーン ID には、既定でノード リソース グループに対する共同作成者アクセス許可があるため、この記事で作成するパブリック IP には別のロールの割り当てが必要ありません。 別のリソース グループで受信または送信パブリック IP を使用する場合は、コントロール プレーン ID にそのリソース グループに必要なアクセス許可を付与します。 詳細については、「 AKS のマネージド ID」を参照してください。
重要
Kubernetes サービス マニフェストの
loadBalancerIPプロパティは、 アップストリームの Kubernetes に続いて非推奨となります。 既存のサービスは変更なしで動作し続けますが、代わりにサービス注釈を使用します。Annotation Purpose service.beta.kubernetes.io/azure-pip-nameパブリック IP リソース名を指定します。 service.beta.kubernetes.io/azure-load-balancer-ipv4IPv4 アドレスを指定します。 service.beta.kubernetes.io/azure-load-balancer-ipv6IPv6 アドレスを指定します。 apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/azure-load-balancer-resource-group: <node resource group name> service.beta.kubernetes.io/azure-pip-name: myAKSPublicIP name: azure-load-balancer spec: type: LoadBalancer ports: - port: 80 selector: app: azure-load-balancer注記
service.beta.kubernetes.io/azure-pip-name注釈を追加すると、最も効率的な LoadBalancer の作成が可能になり、潜在的なスロットリングを回避するために強く推奨されます。service.beta.kubernetes.io/azure-dns-label-nameサービス注釈を使用し、公開 DNS ラベルをサービスに設定します。 これにより、Azure のパブリック DNS サーバーとトップ レベル ドメインを使用して、サービスの完全修飾ドメイン名 (FQDN) が発行されます。 注釈の値は Azure の場所内で一意である必要があるため、十分に修飾されたラベルを使用することをお勧めします。 指定した名前に、選択した場所 (<location>.cloudapp.azure.comなど) の既定のサフィックスが自動的に追加され、FQDN が作成されます。apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/azure-load-balancer-resource-group: <node resource group name> service.beta.kubernetes.io/azure-pip-name: myAKSPublicIP service.beta.kubernetes.io/azure-dns-label-name: <unique-service-label> name: azure-load-balancer spec: type: LoadBalancer ports: - port: 80 selector: app: azure-load-balancerサービスを作成する前に、クラスターに、
app: azure-load-balancerラベルを使用するポッドを含むワークロードがあることを確認します。 サービス マニフェストは、このラベルを持つポッドを選択しますが、デプロイは作成しません。kubectl applyコマンドを使用してサービスを作成します。kubectl apply -f load-balancer-service.yamlサービスが、実行中で準備完了の Pod を少なくとも 1 つ選択していることを確認します。
kubectl get pods -l app=azure-load-balancerロード バランサーの DNS ラベルを表示するには、
kubectl describeコマンドを使用します。kubectl describe service azure-load-balancerDNS ラベルは、次の要約された出力例に示すように、
Annotationsの下に一覧表示されます。Name: azure-load-balancer Namespace: default Labels: <none> Annotations: service.beta.kubernetes.io/azure-dns-label-name: <unique-service-label>
トラブルシューティング
このセクションでは、「 静的 IP アドレスの作成」を完了し、「静的 IP アドレスを 使用して Kubernetes サービスを作成する」の手順を試み、実行中の AKS クラスターがあることを前提としています。 ノード リソース グループ名を取得するには、 az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query nodeResourceGroup -o tsvを使用します。
service.beta.kubernetes.io/azure-pip-name注釈で指定されたパブリック IP リソースがservice.beta.kubernetes.io/azure-load-balancer-resource-groupで指定されたリソース グループに存在しない場合、または AKS コントロール プレーン ID がそのリソース グループにアクセスできない場合、ロード バランサー サービスの作成は失敗します。 トラブルシューティングを行うには、 kubectl describe コマンドを使用して、サービス注釈と作成イベントを確認します。 次の例に示すように、YAML マニフェストで指定されているサービス名を指定します。
kubectl describe service azure-load-balancer
出力には、Kubernetes サービス リソースに関する情報が表示されます。 次の出力例は、EventsのWarning "user supplied IP address was not found" を示しています。このシナリオでは、azure-pip-name注釈が静的パブリック IP リソースの名前と一致し、azure-load-balancer-resource-group注釈が、それを含むリソース グループと一致していることを確認します。
Name: azure-load-balancer
Namespace: default
Labels: <none>
Annotations: service.beta.kubernetes.io/azure-load-balancer-resource-group: <node resource group name>
service.beta.kubernetes.io/azure-pip-name: myAKSPublicIP
Selector: app=azure-load-balancer
Type: LoadBalancer
IP: 10.0.18.125
IP: 40.121.183.52
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 32582/TCP
Endpoints: <pod-ip>:80
Session Affinity: None
External Traffic Policy: Cluster
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal CreatingLoadBalancer 7s (x2 over 22s) service-controller Creating load balancer
Warning CreatingLoadBalancerFailed 6s (x2 over 12s) service-controller Error creating load balancer (will retry): Failed to create load balancer for service default/azure-load-balancer: user supplied IP Address 40.121.183.52 was not found
次のステップ
アプリケーションへのネットワーク トラフィックをより詳細に制御するには、AKS のアプリケーション ルーティング アドオンを使用します。 アプリ ルーティング アドオンの詳細については、「 アプリケーション ルーティング アドオンを使用したマネージド NGINX イングレス」を参照してください。