Share via


アプリケーション ルーティング アドオンで Azure プライベート DNS ゾーンをサポートするように NGINX イングレス コントローラーを構成する

この記事では、Azure 内部ロード バランサーと連携するように NGINX イングレス コントローラーを構成し、プライベート エンドポイントの DNS 解決を有効にして特定のドメインを解決できるようにプライベート Azure DNS ゾーンを構成する方法について説明します。

開始する前に

ご利用の AKS クラスターに接続する

お使いのローカル コンピューターから Kubernetes クラスターに接続するには、kubectl (Kubernetes コマンドライン クライアント) を使用します。 az aks install-cli コマンドを使用してローカルにインストールできます。 Azure Cloud Shell を使用している場合、kubectl は既にインストールされています。

次の例では、az aks get-credentials コマンド 使用して、myResourceGroupmyAKSCluster という名前のクラスターへの接続を構成します。

az aks get-credentials --resource-group myResourceGroup --name myAKSCluster

仮想ネットワークの作成

仮想ネットワークにプライベート DNS ゾーンを発行するには、そのゾーン内のレコードを解決することが認められた仮想ネットワークの一覧を指定する必要があります。 これらを 仮想ネットワーク リンク と呼びます。

次の例では、myResourceGroup リソース グループに myAzureVNet という名前の仮想ネットワークを作成し、特定のアドレス プレフィックスを持つ VNet 内に作成 mySubnet という名前のサブネットを 1 つ作成します。

az network vnet create \
  --name myAzureVNet \
  --resource-group myResourceGroup \
  --location eastus \
  --address-prefix 10.2.0.0/16 \
  --subnet-name mysubnet \
  --subnet-prefixes 10.2.0.0/24

Azure プライベート DNS ゾーンを作成する

Note

イングレス リソースで定義されているホストの 1 つ以上の Azure グローバル DNS ゾーンとプライベート DNS ゾーンにレコードを自動的に作成するように、アプリケーション ルーティング アドオンを構成できます。 すべてのグローバル Azure DNS ゾーンおよびすべてのプライベート Azure DNS ゾーンは同じリソース グループに存在する必要があります。

DNS ゾーンを作成するには、az network private-dns zone create コマンドを使用して、ゾーンの名前と作成するリソース グループを指定します。 次の例では、myResourceGroup リソース グループに private.contoso.com という名前の DNS ゾーンを作成します。

az network private-dns zone create --resource-group myResourceGoup --name private.contoso.com

az network private-dns link vnet create コマンドを使用して、先ほど作成した DNS ゾーンへの仮想ネットワーク リンクを作成します。 次の例では、myAzureVNet 仮想ネットワークのゾーン private.contoso.commyDNSLink という名前のリンクを作成します。 リンクの登録が有効になっていないことを指定する --registration-enabled パラメーターを含めます。

az network private-dns link vnet create --resource-group myResourceGroup \
  --name myDNSLink \
  --zone-name private.contoso.com \
  --virtual-network myAzureVNet \
  --registration-enabled false

Azure DNS プライベート ゾーンの自動登録機能では、仮想ネットワークにデプロイされている仮想マシンの DNS レコードが管理されます。 この設定が有効になっているプライベート DNS ゾーンを持つ仮想ネットワークをリンクすると、仮想ネットワークにデプロイされた AKS ノードの Azure 仮想マシンごとに DNS レコードが作成されます。

アプリケーション ルーティング アドオンに Azure プライベート DNS ゾーンをアタッチする

Note

az aks approuting zone add コマンドでは、コマンドを実行しているユーザーのアクセス許可を使って、Azure DNS ゾーンのロール割り当てが作成されます。 プライベート DNS ゾーン共同作成者 ロールは、プライベート DNS リソースを管理するための組み込みロールであり、アドオンのマネージド ID に割り当てられます。 AKS マネージド ID について詳しくは、「マネージド ID の概要」をご覧ください。

  1. az network dns zone show コマンドを使用して DNS ゾーンのリソース ID を取得し、出力を ZONEID という名前の変数に設定します。 次の例では、myResourceGroup リソース グループ内のゾーン private.contoso.com に対してクエリを実行します。

    ZONEID=$(az network private-dns zone show --resource-group myResourceGroup --name private.contoso.com --query "id" --output tsv)
    
  2. アドオンを更新して、az aks approuting zone コマンドを使用する Azure DNS との統合を有効にします。 DNS ゾーン リソース ID をカンマ区切りで渡すことができます。 次の例では、myResourceGroup リソース グループ内の myAKSCluster AKS クラスターを更新します。

    az aks approuting zone add --resource-group myResourceGroup --name myAKSCluster --ids=${ZONEID} --attach-zones
    

プライベート IP アドレスと内部ロード バランサーを使用して NGINX イングレス コントローラーを作成する

アプリケーション ルーティング アドオンは、NginxIngressController と呼ばれる Kubernetes カスタム リソース定義 (CRD) を使用して、NGINX イングレス コントローラーを構成します。 より多くのイングレス コントローラーを作成することも、既存の構成を変更することもできます。

NginxIngressController CRD には、ロード バランサーの注釈を設定することで NGINX イングレス コントローラーのサービスの動作を制御する loadBalancerAnnotations フィールドがあります。

プライベート IP アドレスを持つ内部接続の Azure Load Balancer を使用して NGINX イングレス コントローラーを作成するには、以下の手順を実行します。

  1. 次の YAML マニフェストを nginx-internal-controller.yaml という名前の新しいファイルにコピーし、ファイルをローカル コンピューターに保存します。

    apiVersion: approuting.kubernetes.azure.com/v1alpha1
    kind: NginxIngressController
    metadata:
      name: nginx-internal
    spec:
      ingressClassName: nginx-internal
      controllerNamePrefix: nginx-internal
      loadBalancerAnnotations: 
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
    
  2. kubectl apply コマンドを使用して NGINX イングレス コントローラー リソースを作成します。

    kubectl apply -f nginx-internal-controller.yaml
    

    次の出力例では、作成されたリソースが示されています。

    nginxingresscontroller.approuting.kubernetes.azure.com/nginx-internal created
    
  3. イングレス コントローラーが作成されたことを確認する

    kubectl get nginxingresscontroller コマンドを使用して、NGINX イングレス コントローラーの状態を検証できます。

    kubectl get nginxingresscontroller
    

    次の出力例では、作成されたリソースが示されています。 コントローラーが使用可能になるまでに数分かかる場合があります。

    NAME             INGRESSCLASS                         CONTROLLERNAMEPREFIX   AVAILABLE
    default          webapprouting.kubernetes.azure.com   nginx                  True
    nginx-internal   nginx-internal                       nginx-internal         True
    

アプリケーションをデプロイする

アプリケーション ルーティング アドオンは、Kubernetes イングレス オブジェクトの注釈を使って適切なリソースを作成します。

  1. kubectl create namespace コマンドを使って、ポッドの例を実行するための hello-web-app-routing という名前のアプリケーション名前空間を作成します。

    kubectl create namespace hello-web-app-routing
    
  2. deployment.yaml という名前の新しいファイルに次の YAML マニフェストをコピーしてデプロイを作成し、ローカル コンピューターにファイルを保存します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: aks-helloworld  
      namespace: hello-web-app-routing
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: aks-helloworld
      template:
        metadata:
          labels:
            app: aks-helloworld
        spec:
          containers:
          - name: aks-helloworld
            image: mcr.microsoft.com/azuredocs/aks-helloworld:v1
            ports:
            - containerPort: 80
            env:
            - name: TITLE
              value: "Welcome to Azure Kubernetes Service (AKS)"
    
  3. service.yaml という名前の新しいファイルに次の YAML マニフェストをコピーしてサービスを作成し、ローカル コンピューターにファイルを保存します。

    apiVersion: v1
    kind: Service
    metadata:
      name: aks-helloworld
      namespace: hello-web-app-routing
    spec:
      type: ClusterIP
      ports:
      - port: 80
      selector:
        app: aks-helloworld
    
  4. kubectl apply コマンドを使ってクラスター リソースを作成します。

    kubectl apply -f deployment.yaml -n hello-web-app-routing
    

    次の出力例では、作成されたリソースが示されています。

    deployment.apps/aks-helloworld created created
    
    kubectl apply -f service.yaml -n hello-web-app-routing
    

    次の出力例では、作成されたリソースが示されています。

    service/aks-helloworld created created
    

Azure プライベート DNS ゾーンのホスト名とプライベート IP アドレスを使用するイングレス リソースを作成する

  1. 次の YAML マニフェストを ingress.yaml という名前の新しいファイルにコピーし、ファイルをローカル コンピューターに保存します。

    helloworld.private.contoso.com など、DNS ホストの名前を使用して <Hostname> を更新します。 ingressClassNamenginx-internal を指定していることを確認します。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: aks-helloworld
      namespace: hello-web-app-routing
    spec:
      ingressClassName: nginx-internal
      rules:
      - host: <Hostname>
        http:
          paths:
          - backend:
              service:
                name: aks-helloworld
                port:
                  number: 80
            path: /
            pathType: Prefix
    
  2. kubectl apply コマンドを使ってクラスター リソースを作成します。

    kubectl apply -f ingress.yaml -n hello-web-app-routing
    

    次の出力例では、作成されたリソースが示されています。

    ingress.networking.k8s.io/aks-helloworld created
    

マネージド イングレスが作成されたことを確認する

マネージド イングレスが作成されたことは、kubectl get ingress コマンドを使って確認できます。

kubectl get ingress -n hello-web-app-routing

次の出力例では、作成されたマネージド イングレスが示されています。

NAME             CLASS            HOSTS                            ADDRESS      PORTS   AGE
aks-helloworld   nginx-internal   helloworld.private.contoso.com   10.224.0.7   80      98s

Azure プライベート DNS ゾーンが更新されたことを確認する

数分後に、az network private-dns record-set a list コマンドを実行して、Azure プライベート DNS ゾーンの A レコードを表示します。 リソース グループの名前と DNS ゾーンの名前を指定します。 この例では、リソース グループが myResourceGroup で、DNS ゾーンが private.contoso.com です。

az network private-dns record-set a list --resource-group myResourceGroup --zone-name private.contoso.com

次の出力例では、作成されたレコードが示されています:

[
  {
    "aRecords": [
      {
        "ipv4Address": "10.224.0.7"
      }
    ],
    "etag": "188f0ce5-90e3-49e6-a479-9e4053f21965",
    "fqdn": "helloworld.private.contoso.com.",
    "id": "/subscriptions/xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx/resourceGroups/foo/providers/Microsoft.Network/privateDnsZones/private.contoso.com/A/helloworld",
    "isAutoRegistered": false,
    "name": "helloworld",
    "resourceGroup": "foo",
    "ttl": 300,
    "type": "Microsoft.Network/privateDnsZones/A"
  }
]

次のステップ

SSL 暗号化に関連するその他の高度な NGINX イングレス コントローラーとイングレス リソース構成に関連するその他の構成情報については、DNS と SSL の構成と、アプリケーション ルーティング アドオンの構成を確認します。