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 を実行します。 インストールまたはアップグレードするには、「Install Azure CLIを参照してください。
  • この記事では、Standard SKU IP を Standard SKU ロード バランサーと共に使用する方法について説明します。 詳しくは、「Azure における IP アドレスの種類と割り当て方法」をご覧ください。

AKS クラスターを作成する

  1. az group create コマンドを使用して、Azure リソース グループを作成します。

    az group create --name myNetworkResourceGroup --location eastus
    
  2. az aks create コマンドを使用して AKS クラスターを作成します。

    az aks create --name myAKSCluster --resource-group myNetworkResourceGroup --generate-ssh-keys
    

静的 IP アドレスを作成する

  1. az aks show コマンドと nodeResourceGroup プロパティのクエリを使用し、ノード リソース グループの名前を取得します。

    az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query nodeResourceGroup -o tsv
    
  2. az 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にアップグレードします。

  3. 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 サービスを作成する

  1. 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-ipv4 IPv4 アドレスを指定します。
    service.beta.kubernetes.io/azure-load-balancer-ipv6 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
    

    注記

    service.beta.kubernetes.io/azure-pip-name 注釈を追加すると、最も効率的な LoadBalancer の作成が可能になり、潜在的なスロットリングを回避するために強く推奨されます。

  2. service.beta.kubernetes.io/azure-dns-label-name サービス注釈を使用し、公開 DNS ラベルをサービスに設定します。 これにより、Azure のパブリック DNS サーバーとトップ レベル ドメインを使用して、サービスの完全修飾ドメイン名 (FQDN) が発行されます。 注釈の値は Azure の場所内で一意である必要があるため、十分に修飾されたラベルを使用することをお勧めします。 指定した名前に、選択した場所 (<location>.cloudapp.azure.com など) の既定のサフィックスが自動的に追加され、FQDN が作成されます。

    注記

    独自のドメインでサービスを発行する場合、Azure DNS外部 DNS プロジェクトをご参照ください。

    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
    
  3. サービスを作成する前に、クラスターに、 app: azure-load-balancer ラベルを使用するポッドを含むワークロードがあることを確認します。 サービス マニフェストは、このラベルを持つポッドを選択しますが、デプロイは作成しません。

  4. kubectl apply コマンドを使用してサービスを作成します。

    kubectl apply -f load-balancer-service.yaml
    
  5. サービスが、実行中で準備完了の Pod を少なくとも 1 つ選択していることを確認します。

    kubectl get pods -l app=azure-load-balancer
    
  6. ロード バランサーの DNS ラベルを表示するには、kubectl describe コマンドを使用します。

    kubectl describe service azure-load-balancer
    

    DNS ラベルは、次の要約された出力例に示すように、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 サービス リソースに関する情報が表示されます。 次の出力例は、EventsWarning "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 イングレス」を参照してください。