アプリケーション ルーティング アドオンを使用してカスタム ドメイン名と 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 共同管理者のロールが必要です。
- すべてのパブリック DNS ゾーンは、同じサブスクリプションとリソース グループに存在する必要があります。
ご利用の AKS クラスターに接続する
お使いのローカル コンピューターから Kubernetes クラスターに接続するには、kubectl
(Kubernetes コマンドライン クライアント) を使用します。 az aks install-cli コマンドを使用してローカルにインストールできます。 Azure Cloud Shell を使用している場合、kubectl
は既にインストールされています。
az aks get-credentials
コマンドを使って Kubernetes クラスターに接続するように、kubectl を構成します。
az aks get-credentials --resource-group <ResourceGroupName> --name <ClusterName>
Azure Key Vault からの証明書を使用した HTTPS トラフィックの終端
HTTPS トラフィックのサポートを有効にするには、次の前提条件を参照してください。
- SSL 証明書。 持っていない場合は、証明書を作成できます。
証明書を格納する Azure Key Vault を作成する
注意
Azure Key Vault が既にある場合は、この手順をスキップしてください。
az keyvault create
コマンドを使用して、Azure Key Vault を作成します。
az keyvault create --resource-group <ResourceGroupName> --location <Location> --name <KeyVaultName> --enable-rbac-authorization true
自己署名 SSL 証明書を作成してエクスポートする
テストでは、証明機関 (CA) で署名された証明書ではなく、自己署名公開証明書を使用できます。 証明書が既にある場合は、この手順をスキップしてください。
注意
自己署名証明書は、信頼できるサード パーティの CA によって署名されていないデジタル証明書です。 自己署名証明書は、Web サイトまたはソフトウェアの署名を担当する企業または開発者によって作成、発行、署名されます。 このため、自己署名証明書は、公開 Web サイトやアプリケーションでは安全でないと見なされます。 Azure Key Vault には、いくつかの証明機関との間に信頼できるパートナーシップがあります。
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>"
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> --name <KeyVaultCertificateName> --file 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 --resource-group <ResourceGroupName> --name <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 ゾーンが既にある場合は、この手順をスキップしてください。
az network dns zone create
コマンドを使用して Azure DNS ゾーンを作成します。az network dns zone create --resource-group <ResourceGroupName> --name <ZoneName>
アプリケーション ルーティング アドオンに Azure DNS ゾーンをアタッチする
Note
az aks approuting zone add
コマンドでは、コマンドを実行しているユーザーのアクセス許可を使って、Azure DNS ゾーンのロール割り当てが作成されます。 このロールは、アドオンのマネージド ID に割り当てられます。 AKS マネージド ID について詳しくは、「マネージド ID の概要」をご覧ください。
az network dns zone show
コマンドを使用して DNS ゾーンのリソース ID を取得し、出力を ZONEID という名前の変数に設定します。ZONEID=$(az network dns zone show --resource-group <ResourceGroupName> --name <ZoneName> --query "id" --output tsv)
アドオンを更新して、
az aks approuting zone
コマンドを使用する Azure DNS との統合を有効にします。 DNS ゾーン リソース ID をカンマ区切りで渡すことができます。az aks approuting zone add --resource-group <ResourceGroupName> --name <ClusterName> --ids=${ZONEID} --attach-zones
Azure Key Vault からホスト名と証明書を使用するイングレスを作成します。
アプリケーション ルーティング アドオンにより、webapprouting.kubernetes.azure.com という名前のクラスターにイングレス クラスが作成されます。 このクラスを使ってイングレス オブジェクトを作成すると、アドオンがアクティブになります。
az keyvault certificate show
コマンドを使用して、Azure Key Vault からイングレスで使用する証明書 URI を取得します。az keyvault certificate show --vault-name <KeyVaultName> --name <KeyVaultCertificateName> --query "id" --output tsv
次の出力例は、コマンドから返される証明書の URI を示しています。
https://KeyVaultName.vault.azure.net/certificates/KeyVaultCertificateName/ea62e42260f04f17a9309d6b87aceb44
次の 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 では、secretName
はkeyvault-<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>
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 コントローラー メトリックを監視する方法について理解します。
Azure Kubernetes Service