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 クラスターを作成する

  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
    

    Note

    AKS クラスターで Basic SKU ロード バランサーを使用している場合は、パブリック IP を定義するときに パラメーターに Basic--sku を使用します。 Basic SKU IP のみが Basic SKU ロード バランサーで動作し、Standard SKU IP のみが Standard SKU ロード バランサーで動作します。

  3. 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 アドレスを使用してサービスを作成する

  1. az role assignment create コマンドを使用して、AKS クラスターで使用されるクラスター ID に、パブリック IP のリソース グループへの委任されたアクセス許可が含まれていることを確認してください。

    CLIENT_ID=$(az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query identity.principalId -o tsv)
    RG_SCOPE=$(az group show --name <node resource group> --query id -o tsv)
    az role assignment create \
        --assignee ${CLIENT_ID} \
        --role "Network Contributor" \
        --scope ${RG_SCOPE}
    

    重要

    送信 IP をカスタマイズした場合は、クラスター ID に、送信パブリック IP と受信パブリック IP の両方に対するアクセス許可があることを確認します。

  2. 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 が確実に作成されます。調整の可能性があるため、それを回避するために強く推奨されます。

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

    Note

    独自のドメインでサービスを発行する場合、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
    
  4. kubectl apply コマンドを使用してサービスとデプロイを作成します。

    kubectl apply -f load-balancer-service.yaml
    
  5. ロード バランサーの 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 イングレス」をご覧ください。