Azure Kubernetes Service (AKS) ロード バランサーで静的パブリック IP アドレスと DNS ラベルを使用する
Azure Kubernetes Service (AKS) クラスターでロード バランサー リソースを作成する場合、割り当てられたパブリック IP アドレスは、そのリソースの有効期間中のみ有効です。 Kubernetes サービスを削除すると、関連付けられているロード バランサーと IP アドレスも削除されます。 デプロイし直された Kubernetes サービスに対して特定の IP アドレスを割り当てるか、あるいは IP アドレスを保持する場合は、静的パブリック IP アドレスを作成して、使用することができます。
この記事では、静的パブリック IP アドレスを作成して、Kubernetes サービスに割り当てる方法を示します。
開始する前に
- Azure CLI バージョン 2.0.59 以降がインストールされて構成されている必要があります。 バージョンを確認するには、
az --version
を実行します。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。 - この記事では、Standard SKU IP を Standard SKU ロード バランサーと共に使用する方法について説明します。 詳しくは、「Azure における IP アドレスの種類と割り当て方法」をご覧ください。
AKS クラスターを作成する
az group create
コマンドを使用して、Azure リソース グループを作成します。az group create --name myNetworkResourceGroup --location eastus
az 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 tsv
az network public ip create
コマンドを使って、ノード リソース グループに静的パブリック IP アドレスを作成します。az network public-ip create \ --resource-group <node resource group name> \ --name myAKSPublicIP \ --sku Standard \ --allocation-method static
Note
AKS クラスターで Basic SKU ロード バランサーを使用している場合は、パブリック IP を定義するときに パラメーターに Basic
--sku
を使用します。 Basic SKU IP のみが Basic SKU ロード バランサーで動作し、Standard SKU IP のみが Standard SKU ロード バランサーで動作します。az network public-ip list
コマンドを使用して静的パブリック IP アドレスを取得します。 ノードのリソース グループ名と作成したパブリック IP アドレスを指定して、ipAddress
に対するクエリを指定します。az network public-ip show --resource-group <node resource group name> --name myAKSPublicIP --query ipAddress --output tsv
静的 IP アドレスを使用してサービスを作成する
まず、AKS クラスターが使用しているマネージド ID の種類がシステム割り当てとユーザー割り当てのどちらであるかを確認します。 不明な場合は、az aks show コマンドを呼び出し、ID の type プロパティに対してクエリを実行します。
az aks show \ --name myAKSCluster \ --resource-group myResourceGroup \ --query identity.type \ --output tsv
クラスターがマネージド ID を使用している場合、type プロパティの値は、SystemAssigned または UserAssigned になります。
クラスターがサービス プリンシパルを使用している場合、type プロパティの値は null になります。 クラスターをアップグレードしてマネージド ID を使用することを検討してください。
AKS クラスターがシステム割り当てマネージド ID を使用している場合、次のようにマネージド ID のプリンシパル ID に対してクエリを実行します。
# Get the principal ID for a system-assigned managed identity. CLIENT_ID=$(az aks show \ --name myAKSCluster \ --resource-group myNetworkResourceGroup \ --query identity.principalId \ --output tsv)
AKS クラスターがユーザー割り当てマネージド ID を使用している場合、プリンシパル ID は null になります。 代わりにユーザー割り当てマネージド ID のクライアント ID に対してクエリを実行します。
# Get the client ID for a user-assigned managed identity. CLIENT_ID=$(az aks show \ --name myAKSCluster \ --resource-group myNetworkResourceGroup \ --query identity.userAssignedIdentities.*.clientId \ --output tsv
az role assignment create
コマンドを呼び出して、パブリック IP のリソース グループ用として AKS クラスターで使用されるマネージド ID に委任されたアクセス許可を割り当てます。# Get the resource ID for the node resource group. RG_SCOPE=$(az group show \ --name <node resource group> \ --query id \ --output tsv) # Assign the Network Contributor role to the managed identity, # scoped to the node resource group. az role assignment create \ --assignee ${CLIENT_ID} \ --role "Network Contributor" \ --scope ${RG_SCOPE}
重要
送信 IP をカスタマイズした場合は、クラスター ID に、送信パブリック IP と受信パブリック IP の両方に対するアクセス許可があることを確認します。
load-balancer-service.yaml
という名前のファイルを作成し、次の YAML ファイルの内容にコピーし、前の手順で作成した独自のパブリック IP アドレスとノード リソース グループ名を指定します。重要
ロード バランサー YAML マニフェストに
loadBalancerIP
プロパティを追加することは、アップストリームの Kubernetes に続いて非推奨となっています。 現在の使用方法は変わらず、既存のサービスは変更せずに動作することが期待されますが、代わりにサービス注釈を設定することを強くお勧めします。 サービス注釈を設定する場合、YAML 例のように、パブリック IP 名にservice.beta.kubernetes.io/azure-pip-name
を使うか、IPv4 アドレスにはservice.beta.kubernetes.io/azure-load-balancer-ipv4
、IPv6 アドレスにはservice.beta.kubernetes.io/azure-load-balancer-ipv6
を使うことができます。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
Note
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
kubectl apply
コマンドを使用してサービスとデプロイを作成します。kubectl apply -f load-balancer-service.yaml
ロード バランサーの DNS ラベルを表示するには、
kubectl describe service
コマンドを使用します。kubectl describe service azure-load-balancer
DNS ラベルは、次の要約された出力例に示すように、
Annotations
の下に一覧表示されます。Name: azure-load-balancer Namespace: default Labels: <none> Annotations: service.beta.kuberenetes.io/azure-dns-label-name: <unique-service-label>
トラブルシューティング
Kubernetes のサービス マニフェストの loadBalancerIP
プロパティに定義されている静的 IP アドレスが存在しないか、ノード リソース グループ内に作成されておらず、他の委任も構成されていない場合、ロード バランサーのサービスの作成は失敗します。 トラブルシューティングを行うには、kubectl describe
コマンドを使用してサービス作成イベントを確認します。 次の例に示すように、YAML マニフェストで指定されているサービス名を指定します。
kubectl describe service azure-load-balancer
出力には、Kubernetes サービス リソースに関する情報が表示されます。 次の出力例は、Events
: "user supplied IP address was not found
" 内の Warning
を示しています。このシナリオでは、ノード リソース グループに静的パブリック IP アドレスを作成し、Kubernetes サービス マニフェストで指定された IP アドレスが正しいことを確認します。
Name: azure-load-balancer
Namespace: default
Labels: <none>
Annotations: <none>
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: <none>
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 イングレス」をご覧ください。
Azure Kubernetes Service