使用應用程式路由附加元件設定自訂網域名稱和 SSL 憑證

輸入是一種用於定義規則的 API 物件,可藉此針對 Azure Kubernetes Service (AKS) 叢集進行外部存取。 利用應用程式路由附加元件 Nginx 輸入類別建立輸入物件時,附加元件會在 AKS 叢集內建立、設定並管理一或多個輸入控制器。

本文說明如何設定進階輸入設定,以使用儲存在 Azure Key Vault 中的 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 叢集,應使用 Kubernetes 命令列用戶端 kubectl。 您可以使用 az aks install-cli 命令將其安裝於本機。 如果您使用 Azure Cloud Shell,則 kubectl 已安裝。

使用 az aks get-credentials 命令設定 kubectl,以連線到您的 Kubernetes 叢集。

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

使用來自 Azure Key Vault 的憑證終止 HTTPS 流量

如果要啟用 HTTPS 流量支援,請參閱以下先決條件:

  • SSL 憑證。 如果您沒有憑證,可以建立憑證

建立 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 簽署的數位憑證。 自我簽署憑證是由負責簽署網站或軟體的公司或開發人員所建立、發行和簽署。 這就是為什麼自我簽署憑證在公開網站和應用程式中被視為不安全的原因。 Azure Key Vault 與部分憑證授權單位有信任的合作關係

  1. 利用 openssl req 命令,建立搭配輸入使用的自我簽署的 SSL 憑證。 請務必以您使用的 DNS 名稱取代 <Hostname>

    openssl req -new -x509 -nodes -out aks-ingress-tls.crt -keyout aks-ingress-tls.key -subj "/CN=<Hostname>" -addext "subjectAltName=DNS:<Hostname>"
    
  2. 使用 openssl pkcs12 -export 命令匯出 SSL 憑證,並略過密碼提示。

    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 命令將 SSL 憑證匯入 Azure Key Vault。 如果您的憑證受密碼保護,可利用 --password 旗標傳遞密碼。

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

重要

若要讓附加元件在憑證變更時從 Azure Key Vault 重新載入憑證,您應該透過 --enable-secret-rotation 引數,啟用祕密存放區 CSI 驅動程式的秘密自動輪替功能。 啟用自動輪替時,驅動程式會根據您定義的輪替輪詢間隔,藉由定期輪詢變更來更新 Pod 掛接和 Kubernetes 祕密。 預設的輪替輪詢間隔是 2 分鐘。

啟用 Azure Key Vault 整合

在已啟用應用程式路由附加元件的叢集上,使用利用 --enable-kv--attach-kv 自變數的 az aks approuting update 命令,啟用適用於秘密存放區 CSI 驅動程式的 Azure Key Vault 提供者,並套用必要的角色指派。

Azure Key Vault 提供兩種授權系統:執行於管理平面的 Azure 角色型存取控制 (Azure RBAC),以及執行於管理平面和資料平面的存取原則模型--attach-kv 作業會選擇要使用的適當存取模型。

注意

az aks approuting update --attach-kv 命令會使用執行命令的使用者權限來建立 Azure Key Vault 角色指派。 此角色會指派給附加元件受控識別。 如需 AKS 受控識別的詳細資訊,請參閱受控識別的摘要

擷取 Azure Key Vault 資源識別碼。

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 區域支援,請檢閱以下先決條件:

  • 可將應用程式路由附加元件設定,以便在一或多個 Azure 全域和私人 DNS 區域,針對輸入資源上定義的主機自動建立記錄。 所有全域 Azure DNS 區域應建立於同一個資源群組,而所有私人 Azure DNS 區域應建立於同一個資源群組。 如果您沒有區域,可以建立 Azure DNS 區域

建立公用 Azure DNS 區域

注意

如果您已經擁有 Azure DNS 區域,則可以略過此步驟。

  1. 使用 az network dns zone create 命令建立 Azure DNS 區域。

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

將 Azure DNS 區域附加至應用程式路由附加元件

注意

az aks approuting zone add 命令會使用執行命令的使用者權限來建立 Azure DNS 區域角色指派。 此角色會指派給附加元件受控識別。 如需 AKS 受控識別的詳細資訊,請參閱受控識別的摘要

  1. 使用 az network dns zone show 命令擷取 DNS 區域的資源識別碼,並將輸出設定為名為 ZONEID 的變數。

    ZONEID=$(az network dns zone show -g <ResourceGroupName> -n <ZoneName> --query "id" --output tsv)
    
  2. 使用 az aks approuting zone 命令更新附加元件以啟用與 Azure DNS 的整合。 您可以傳遞以逗號分隔的 DNS 區域資源識別碼清單。

    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 的新檔案中,並儲存於本機電腦。

    使用 DNS 主機的名稱更新 <Hostname> ,並使用從命令傳回的 URI 更新 <KeyVaultCertificateUri> ,以在上述步驟 1 中查詢 Azure Key Vault。 *<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>
    
  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 控制器計量,協助分析應用程式的效能和使用。