アプリケーション ルーティング アドオンを使用してカスタム ドメイン名と SSL 証明書を設定する

イングレスは、Azure Kubernetes Service (AKS) クラスター内のサービスへの外部アクセスを許可するルールを定義する API オブジェクトです。 アプリケーション ルーティング アドオンの nginx イングレス クラスを使うイングレス オブジェクトを作成すると、アドオンによって AKS クラスター内の 1 つ以上のイングレス コントローラーが作成、構成、管理されます。

この記事では、Azure キー コンテナーに保存されている SSL/TLS 証明書を使ってトラフィックを暗号化し、Azure DNS を使って DNS ゾーンを管理するように高度なイングレス構成を設定する方法について説明します。

nginx を使用するアプリケーション ルーティング アドオンの機能

nginx を使用するアプリケーション ルーティング アドオンでは、次の機能が提供されます。

  • マネージド nginx イングレス コントローラーを簡単に構成できます。
  • グローバル ゾーンとプライベート ゾーンの管理のための Azure DNS などの外部 DNS との統合
  • Azure Key Vault などのキー コンテナーに格納されている証明書での SSL 終端。

前提条件

  • アプリケーション ルーティング アドオンでの AKS クラスター。
  • SSL 終端を構成し、Azure でホストされているコンテナーに証明書を格納する場合は、Azure Key Vault を使用します。
  • グローバル ゾーンとプライベート ゾーンの管理を構成し、Azure でホストする場合は、Azure DNS。
  • Azure Key Vault または Azure DNS ゾーンをアタッチするには、Azure サブスクリプションで所有者Azure アカウント管理者、または Azure 共同管理者のロールが必要です。

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

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

az aks get-credentials コマンドを使って Kubernetes クラスターに接続するように、kubectl を構成します。

az aks get-credentials -g <ResourceGroupName> -n <ClusterName>

Azure Key Vault からの証明書を使用した HTTPS トラフィックの終端

HTTPS トラフィックのサポートを有効にするには、次の前提条件を参照してください。

証明書を格納する Azure Key Vault を作成する

注意

Azure Key Vault が既にある場合は、この手順をスキップしてください。

az keyvault create コマンドを使用して、Azure Key Vault を作成します。

az keyvault create -g <ResourceGroupName> -l <Location> -n <KeyVaultName> --enable-rbac-authorization true

自己署名 SSL 証明書を作成してエクスポートする

テストでは、証明機関 (CA) で署名された証明書ではなく、自己署名公開証明書を使用できます。 証明書が既にある場合は、この手順をスキップしてください。

注意

自己署名証明書は、信頼できるサード パーティの CA によって署名されていないデジタル証明書です。 自己署名証明書は、Web サイトまたはソフトウェアの署名を担当する企業または開発者によって作成、発行、署名されます。 このため、自己署名証明書は、公開 Web サイトやアプリケーションでは安全でないと見なされます。 Azure Key Vault には、いくつかの証明機関との間に信頼できるパートナーシップがあります。

  1. openssl req コマンドを使用して、イングレスで使用する自己署名 SSL 証明書を作成します。 <Hostname> を使用している DNS 名に置き換えてください。

    openssl req -new -x509 -nodes -out aks-ingress-tls.crt -keyout aks-ingress-tls.key -subj "/CN=<Hostname>" -addext "subjectAltName=DNS:<Hostname>"
    
  2. SSL 証明書をエクスポートし、openssl pkcs12 -export コマンドを使用してパスワード プロンプトをスキップします。

    openssl pkcs12 -export -in aks-ingress-tls.crt -inkey aks-ingress-tls.key -out aks-ingress-tls.pfx
    

Azure Key Vault に証明書をインポートする

az keyvault certificate import コマンドを使用して Azure Key Vault に SSL 証明書をインポートします。 証明書がパスワードで保護されている場合は、フラグを使用してパスワードを--password渡すことができます。

az keyvault certificate import --vault-name <KeyVaultName> -n <KeyVaultCertificateName> -f aks-ingress-tls.pfx [--password <certificate password if specified>]

重要

証明書が変更されたときに、アドオンが Azure Key Vault から証明書を再読み込みできるようにするには、 引数を使用してシークレット ストア CSI ドライバーのシークレット自動ローテーション機能--enable-secret-rotationを有効にする必要があります。 自動ローテーションが有効な場合、ドライバーは、定義するローテーション ポーリング間隔に基づいて、定期的に変更をポーリングすることでポッド マウントと Kubernetes シークレットを更新します。 既定のローテーション ポーリング間隔は 2 分です。

Azure Key Vault 統合を有効にする

アプリケーション ルーティング アドオンが有効になっているクラスターで、--enable-kv--attach-kv の引数を使用する az aks approuting update コマンドを使用し、Secrets Store CSI Driver 用の Azure Key Vault プロバイダーを有効にして、必要なロールの割り当てを適用します。

Azure Key Vault には 2 つの認可システムが用意されています。管理プレーンで動作する Azure ロールベースのアクセス制御 (Azure RBAC) と、管理プレーンとデータ プレーンの両方で動作するアクセス ポリシー モデルです。 --attach-kv 操作で、使用する適切なアクセス モデルを選択します。

Note

az aks approuting update --attach-kv コマンドでは、コマンドを実行しているユーザーのアクセス許可を使って、Azure Key Vault ロール割り当てが作成されます。 このロールは、アドオンのマネージド ID に割り当てられます。 AKS マネージド ID について詳しくは、「マネージド ID の概要」をご覧ください。

Azure Key Vault リソース ID を取得します。

KEYVAULTID=$(az keyvault show --name <KeyVaultName> --query "id" --output tsv)

次に、アプリ ルーティング アドオンを更新して、Azure Key Vault シークレット ストア CSI ドライバを有効にし、ロール割り当てを適用します。

az aks approuting update -g <ResourceGroupName> -n <ClusterName> --enable-kv --attach-kv ${KEYVAULTID}

Azure DNS 統合を有効にする

DNS ゾーンのサポートを有効にするには、次の前提条件を確認してください。

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

パブリック Azure DNS ゾーンを作成する

Note

Azure DNS ゾーンが既にある場合は、この手順をスキップしてください。

  1. az network dns zone create コマンドを使用して Azure DNS ゾーンを作成します。

    az network dns zone create -g <ResourceGroupName> -n <ZoneName>
    

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

Note

az aks approuting zone add コマンドでは、コマンドを実行しているユーザーのアクセス許可を使って、Azure DNS ゾーンのロール割り当てが作成されます。 このロールは、アドオンのマネージド ID に割り当てられます。 AKS マネージド ID について詳しくは、「マネージド ID の概要」をご覧ください。

  1. az network dns zone show コマンドを使用して DNS ゾーンのリソース ID を取得し、出力を ZONEID という名前の変数に設定します。

    ZONEID=$(az network dns zone show -g <ResourceGroupName> -n <ZoneName> --query "id" --output tsv)
    
  2. アドオンを更新して、az aks approuting zone コマンドを使用する Azure DNS との統合を有効にします。 DNS ゾーン リソース ID をカンマ区切りで渡すことができます。

    az aks approuting zone add -g <ResourceGroupName> -n <ClusterName> --ids=${ZONEID} --attach-zones
    

Azure Key Vault からホスト名と証明書を使用するイングレスを作成します。

アプリケーション ルーティング アドオンにより、webapprouting.kubernetes.azure.com という名前のクラスターにイングレス クラスが作成されます。 このクラスを使ってイングレス オブジェクトを作成すると、アドオンがアクティブになります。

  1. az keyvault certificate show コマンドを使用して、Azure Key Vault からイングレスで使用する証明書 URI を取得します。

    az keyvault certificate show --vault-name <KeyVaultName> -n <KeyVaultCertificateName> --query "id" --output tsv
    

    次の出力例は、コマンドから返される証明書の URI を示しています。

    https://KeyVaultName.vault.azure.net/certificates/KeyVaultCertificateName/ea62e42260f04f17a9309d6b87aceb44
    
  2. 次の YAML マニフェストを ingress.yaml という名前の新しいファイルにコピーし、ファイルをローカル コンピューターに保存します。

    上記の手順 1 で Azure Key Vault にクエリを実行するために、DNS ホストの名前で <Hostname> を更新し、コマンドから返された URI で <KeyVaultCertificateUri> を更新します。 *<KeyVaultCertificateUri>* の文字列値には、https://yourkeyvault.vault.azure.net/certificates/certname のみを含める必要があります。 現在のバージョンを取得するには、URI 文字列の末尾にある証明書のバージョンを省略する必要があります。

    tls セクションの secretName キーは、このイングレス リソースの証明書が含まれるシークレットの名前を定義します。 クライアントが <Hostname> キーで指定されている URL を参照すると、この証明書がブラウザーに表示されます。 secretName の値が keyvault- と同じであり、イングレス リソース名 (metadata.name から) の値が後に続いていることを確認します。 この例の YAML では、secretNamekeyvault-<your Ingress name> と等しい必要があります。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        kubernetes.azure.com/tls-cert-keyvault-uri: <KeyVaultCertificateUri>
      name: aks-helloworld
      namespace: hello-web-app-routing
    spec:
      ingressClassName: webapprouting.kubernetes.azure.com
      rules:
      - host: <Hostname>
        http:
          paths:
          - backend:
              service:
                name: aks-helloworld
                port:
                  number: 80
            path: /
            pathType: Prefix
      tls:
      - hosts:
        - <Hostname>
        secretName: keyvault-<your ingress name>
    
  3. 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   webapprouting.kubernetes.azure.com   myapp.contoso.com   20.51.92.19   80, 443   4m

次のステップ

アプリケーションのパフォーマンスと使用状況の分析の一環として、Grafana で Prometheus を使用して、アプリケーション ルーティング アドオンに含まれる ingress-nginx コントローラー メトリックを監視する方法について理解します。