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