アプリケーション ルーティング アドオンで Azure プライベート DNS ゾーンをサポートするように NGINX イングレス コントローラーを構成する
この記事では、Azure 内部ロード バランサーと連携するように NGINX イングレス コントローラーを構成し、プライベート エンドポイントの DNS 解決を有効にして特定のドメインを解決できるようにプライベート Azure DNS ゾーンを構成する方法について説明します。
開始する前に
- アプリケーション ルーティング アドオンでの AKS クラスター。
- Azure プライベート DNS ゾーンをアタッチするには、Azure サブスクリプションで所有者、Azure アカウント管理者、または Azure 共同管理者のロールが必要です。
ご利用の AKS クラスターに接続する
お使いのローカル コンピューターから Kubernetes クラスターに接続するには、kubectl
(Kubernetes コマンドライン クライアント) を使用します。 az aks install-cli コマンドを使用してローカルにインストールできます。 Azure Cloud Shell を使用している場合、kubectl
は既にインストールされています。
次の例では、az aks get-credentials
コマンド 使用して、myResourceGroup の myAKSCluster という名前のクラスターへの接続を構成します。
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 myResourceGroup --name private.contoso.com
az network private-dns link vnet create コマンドを使用して、先ほど作成した DNS ゾーンへの仮想ネットワーク リンクを作成します。 次の例では、myAzureVNet 仮想ネットワークのゾーン private.contoso.com に myDNSLink という名前のリンクを作成します。 リンクの登録が有効になっていないことを指定する --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 の概要」をご覧ください。
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)
アドオンを更新して、
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 イングレス コントローラーを作成するには、以下の手順を実行します。
次の 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"
kubectl apply
コマンドを使用して NGINX イングレス コントローラー リソースを作成します。kubectl apply -f nginx-internal-controller.yaml
次の出力例では、作成されたリソースが示されています。
nginxingresscontroller.approuting.kubernetes.azure.com/nginx-internal created
イングレス コントローラーが作成されたことを確認する
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 イングレス オブジェクトの注釈を使って適切なリソースを作成します。
kubectl create namespace
コマンドを使って、ポッドの例を実行するためのhello-web-app-routing
という名前のアプリケーション名前空間を作成します。kubectl create namespace hello-web-app-routing
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)"
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
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 アドレスを使用するイングレス リソースを作成する
次の YAML マニフェストを ingress.yaml という名前の新しいファイルにコピーし、ファイルをローカル コンピューターに保存します。
helloworld.private.contoso.com
など、DNS ホストの名前を使用して<Hostname>
を更新します。ingressClassName
のnginx-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
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 の構成と、アプリケーション ルーティング アドオンの構成を確認します。
Azure Kubernetes Service