安裝 ExternalDNS 以用於服務探索

本主題說明如何將 ExternalDNS 部署到 Tanzu Kubernetes Grid 中的工作負載叢集。

ExternalDNS 服務使用宣告式 Kubernetes 原生介面,將應用程式的 DNS 記錄發佈到 DNS 伺服器。在 Tanzu Kubernetes Grid 中封裝為 CLI 管理的套件

在啟用負載平衡的共用服務叢集中部署 Harbor 的環境中 (AWS、Azure 和具有 NSX Advanced Load Balancer 的 vSphere),可以使用 ExternalDNS 為 Harbor 服務發佈 DNS 主機名稱。這樣可以從其他叢集存取 Harbor。如需詳細資訊,請參閱 Harbor 登錄和 ExternalDNS

必要條件

  • 安裝以下項目的啟動機器:
    • Tanzu CLI、Tanzu CLI 外掛程式和 kubectl
    • yq v4.5 或更新版本。
  • 您已在網際網路連線或網際網路受限的環境中在 vSphere、Amazon Web Services (AWS) 或 Azure 上部署管理叢集。如果您是在網際網路受限的環境中使用 Tanzu Kubernetes Grid,您已在部署管理叢集之前執行準備將管理叢集部署到網際網路受限的環境 中的程序。
  • 您已使用 tanzu context use 命令登入 Tanzu CLI。
  • 對於要以 ExternalDNS 向 DNS 伺服器公開的服務,您已確定完整網域名稱 (FQDN)。

準備叢集以部署 ExternalDNS

ExternalDNS 服務與要匯出 DNS 記錄的服務必須部署到相同的叢集。

  • 若要安裝 Harbor,請遵循安裝 Harbor 以用於服務登錄中的必要條件和程序。
  • ExternalDNS 支援為 Kubernetes 服務和 Contour HTTPProxy 資源建立記錄。如果您要為工作負載叢集中的 Contour HTTPProxy 資源建立記錄,則必須在叢集中安裝 Contour 套件。如需相關指示,請參閱安裝 Contour 以用於入口控制。Harbor 也需要 Contour 套件。

為 ExternalDNS 套件準備組態檔

ExternalDNS 套件已通過 AWS (Route 53)、Azure DNS 和 RFC2136 (BIND) 驗證。所提供的組態會同時匯出 LoadBalancer 類型的 Contour HTTPProxy 資源和 Kubernetes Services 的記錄。

外部 DNS 社群會以不同層級的穩定性來維持與許多 DNS 提供者的整合。除非另有說明,否則 VMware 不保證支援將 ExternalDNS 套件與特定提供者整合。

AWS (Route 53)
若要準備組態檔,以在 AWS 上部署 ExternalDNS 套件,請執行下列動作:
  1. 在 Route 53 中以服務將使用的網域建立託管區域。
  2. 記錄託管區域識別碼。稍後設定 ExternalDNS 時會使用此識別碼。
  3. 為 ExternalDNS 建立 IAM 原則,以允許 ExternalDNS 更新 Route 53。在 AWS 主控台,前往 IAM 儀表板,然後在存取管理 (Access Management) 下,導覽至原則 (Policies) 畫面。按一下建立原則 (Create Policy) 並切換到 [JSON] 索引標籤。貼上以下原則。如果需要,可以微調原則,以允許更新剛建立的託管區域。完成精靈。

    {
     "Version": "2012-10-17",
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "route53:ChangeResourceRecordSets"
         ],
         "Resource": [
           "arn:aws:route53:::hostedzone/*"
         ]
       },
       {
         "Effect": "Allow",
         "Action": [
           "route53:ListHostedZones",
           "route53:ListResourceRecordSets"
         ],
         "Resource": [
           "*"
         ]
       }
     ]
    }
    
  4. 使用上面建立的原則為 ExternalDNS 建立 IAM 使用者。在 AWS 主控台,前往使用者 (Users) 畫面,然後按一下新增使用者 (Add users)。提供 IAM 使用者的名稱,並確保已啟用程式設計存取 (Programmatic access)。在精靈的權限 (Permissions) 畫面上,按一下直接連結現有原則 (Attach existing policies directly),然後選取在上一步建立的原則。

  5. 繼續到精靈的最後一頁。記錄存取金鑰識別碼 (Access key ID)秘密存取金鑰 (Secret access key)。若要提供這些 Route 53 認證給 ExternalDNS 使用,請在將執行 ExternalDNS 的命名空間中建立 Kubernetes 密碼。

    1. kubectl 的內容設定為要部署 ExternalDNS 的叢集。例如:

      kubectl config use-context tkg-services-admin@tkg-services
      
    2. 建立 Kubernetes 密碼:

      kubectl -n tanzu-system-service-discovery create secret generic route53-credentials \
      --from-literal=aws_access_key_id=YOUR-ACCESS-KEY-ID \
      --from-literal=aws_secret_access_key=YOUR-SECRET-ACCESS-KEY
      

      其中,YOUR-ACCESS-KEY-IDYOUR-SECRET-ACCESS-KEY 是您在上面記錄的認證。

  6. 擷取 ExternalDNS 套件的預設組態,以便為該套件建立組態檔:

    tanzu package available get external-dns.tanzu.vmware.com/PACKAGE-VERSION --default-values-file-output FILE-PATH
    

    其中,PACKAGE-VERSION 是您要安裝的 ExternalDNS 套件版本,FILE-PATH 是用來儲存組態檔的位置,例如,external-dns-data-values.yaml

  7. external-dns-data-values.yaml 檔案中進行以下設定。此檔案設定 ExternalDNS 套件。

    ---
    
    # Namespace in which to deploy ExternalDNS pods.
    namespace: tanzu-system-service-discovery
    
    # Deployment-related configuration.
    deployment:
    args:
      - --source=service
      - --source=ingress
      - --source=contour-httpproxy # Provide this to enable Contour HTTPProxy support. Must have Contour installed or ExternalDNS will fail.
      - --domain-filter=DOMAIN # Makes ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones.
      - --policy=upsert-only # Prevents ExternalDNS from deleting any records, omit to enable full synchronization.
      - --registry=txt
      - --txt-owner-id=HOSTED-ZONE-ID
      - --txt-prefix=txt # Disambiguates TXT records from CNAME records.
      - --provider=aws
      - --aws-zone-type=public # Looks only at public hosted zones. Valid values are public, private, or no value for both.
      - --aws-prefer-cname
    env:
      - name: AWS_ACCESS_KEY_ID
         valueFrom:
         secretKeyRef:
            name: route53-credentials
            key: aws_access_key_id
      - name: AWS_SECRET_ACCESS_KEY
         valueFrom:
         secretKeyRef:
            name: route53-credentials
            key: aws_secret_access_key
    securityContext: {}
    volumeMounts: []
    volumes: []
    

    external-dns-data-values.yaml 檔案中的預留位置換成您的值。關於其他組態選項,請參閱 ExternalDNS 說明文件。

    external-dns-data-values.yaml 檔案中設定任何其他組態選項之前,請檢閱 ExternalDNS 套件的值結構描述。若要擷取值結構描述,請執行:

    tanzu package available get external-dns.tanzu.vmware.com/AVAILABLE-VERSION --values-schema
    

    其中,AVAILABLE-VERSION 是 ExternalDNS 套件的版本。--values-schema 旗標從 ExternalDNS 套件的 Package API 資源中擷取 valuesSchema 區段。您可以將值結構描述的輸出格式 --output 設定為 yamljsontable。如需詳細資訊,請參閱《安裝和管理套件》中的套件

RFC2136 (BIND) 伺服器
RFC2136 提供者可讓您使用任何 RFC2136 相容 DNS 伺服器作為 ExternalDNS 的提供者,例如 BIND。
  1. 要求或建立伺服器的 TSIG 金鑰。必須授權此金鑰來更新和傳輸您要更新的區域。此金鑰類似如下:

    key "externaldns-key" {
    algorithm hmac-sha256;
    secret "/2avn5M4ndEztbDqy66lfQ+PjRZta9UXLtToW6NV5nM=";
    };
    

    如果您管理自己的 DNS 伺服器,則可以使用 tsig-keygen -a hmac-sha256 externaldns 命令來建立 TSIG 金鑰。將輸出複製到 DNS 伺服器組態。例如,對於 BIND,您可以將金鑰新增至 named.conf 檔案,並設定區域的 allow-transferupdate-policy 欄位。例如:

    key "externaldns-key" {
    algorithm hmac-sha256;
    secret "/2avn5M4ndEztbDqy66lfQ+PjRZta9UXLtToW6NV5nM=";
    };
    zone "k8s.example.org" {
    type master;
    file "/etc/bind/zones/k8s.zone";
          allow-transfer {
          key "externaldns-key";
          };
          update-policy {
          grant externaldns-key zonesub ANY;
          };
    };
    

    上面假設您還有類似如下的區域檔:

    $TTL 60 ; 1 minute
    @         IN SOA  k8s.example.org.  root.k8s.example.org. (
                      16  ; serial
                      60  ; refresh (1 minute)
                      60  ; retry (1 minute)
                      60  ; expire (1 minute)
                      60  ; minimum (1 minute)
                      )
                NS   ns.k8s.example.org.
    ns           A    1.2.3.4
    
  2. 擷取 ExternalDNS 套件的預設組態,以便為該套件建立組態檔:

    tanzu package available get external-dns.tanzu.vmware.com/PACKAGE-VERSION --default-values-file-output FILE-PATH
    

    其中,PACKAGE-VERSION 是您要安裝的 ExternalDNS 套件版本,FILE-PATH 是用來儲存組態檔的位置,例如,external-dns-data-values.yaml

  3. external-dns-data-values.yaml 檔案中進行以下設定。此檔案設定 ExternalDNS 套件。

    ---
    
    # Namespace in which to deploy ExternalDNS pods.
    namespace: tanzu-system-service-discovery
    
    # Deployment-related configuration.
    deployment:
    args:
       - --source=service
       - --source=ingress
       - --source=contour-httpproxy # Provide this to enable Contour HTTPProxy support. Must have Contour installed or ExternalDNS will fail.
       - --domain-filter=DOMAIN # For example, k8s.example.org. Makes ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones.
       - --policy=upsert-only # Prevents ExternalDNS from deleting any records, omit to enable full synchronization.
       - --registry=txt
       - --txt-owner-id=k8s
       - --txt-prefix=external-dns- # Disambiguates TXT records from CNAME records.
       - --provider=rfc2136
       - --rfc2136-host=IP-ADDRESS-OF-RFC2136-DNS-SERVER
       - --rfc2136-port=53
       - --rfc2136-zone=DNS-ZONE # For example, k8s.example.org.
       - --rfc2136-tsig-secret=TSIG-SECRET-FROM-STEP-1
       - --rfc2136-tsig-secret-alg=hmac-sha256
       - --rfc2136-tsig-keyname=TSIG-KEY-NAME # For example, externaldns-key.
       - --rfc2136-tsig-axfr
    env: []
    securityContext: {}
    volumeMounts: []
    volumes: []
    

    external-dns-data-values.yaml 檔案中的預留位置換成您的值。關於其他組態選項,請參閱 ExternalDNS 說明文件。

    external-dns-data-values.yaml 檔案中設定任何其他組態選項之前,請檢閱 ExternalDNS 套件的值結構描述。若要擷取值結構描述,請執行:

    tanzu package available get external-dns.tanzu.vmware.com/AVAILABLE-VERSION --values-schema
    

    其中,AVAILABLE-VERSION 是 ExternalDNS 套件的版本。--values-schema 旗標從 ExternalDNS 套件的 Package API 資源中擷取 valuesSchema 區段。您可以將值結構描述的輸出格式 --output 設定為 yamljsontable。如需詳細資訊,請參閱《安裝和管理套件》中的套件

Azure
若要準備組態檔,以在 Azure 上部署 ExternalDNS 套件,請執行下列動作:
  1. 登入 az CLI:

    az login
    
  2. 設定訂閱:

    az account set -s SUBSCRIPTION-ID-GUID
    
  3. 建立服務主體:

    az ad sp create-for-rbac -n SERVICE-PRINCIPAL-NAME
    

    命令的 JSON 輸出類似如下:

    {
      "appId": "a72a7cfd-7cb0-4b02-b130-03ee87e6ca89",
      "displayName": "foo",
      "name": "http://foo",
      "password": "515c55da-f909-4e17-9f52-236ffe1d3033",
      "tenant": "b35138ca-3ced-4b4a-14d6-cd83d9ea62f0"
    }
    
  4. 指派權限給服務主體:

    1. 擷取資源群組的識別碼:

      az group show --name RESOURCE-GROUP --query id
      
    2. 將讀者角色指派給資源群組範圍的服務主體。您需要上述 az ad sp create-for-rbac 命令輸出中的 appId

      az role assignment create --role "Reader" --assignee APP-ID-GUID --scope RESOURCE-GROUP-RESOURCE-ID
      
    3. 擷取 DNS 區域的識別碼:

      az network dns zone show --name DNS-ZONE-NAME -g RESOURCE-GROUP-NAME --query id
      
    4. 將參與者角色指派給 DNS 區域範圍的服務主體:

      az role assignment create --role "Contributor" --assignee APP-ID-GUID --scope DNS-ZONE-RESOURCE-ID
      
  5. 若要將 ExternalDNS 服務連線到 Azure DNS 服務,請在本機機器上以如下內容建立名為 azure.json 的組態檔:

    {
     "tenantId": "01234abc-de56-ff78-abc1-234567890def",
     "subscriptionId": "01234abc-de56-ff78-abc1-234567890def",
     "resourceGroup": "MyDnsResourceGroup",
     "aadClientId": "01234abc-de56-ff78-abc1-234567890def",
     "aadClientSecret": "uKiuXeiwui4jo9quae9o"
    }
    

    將上述範例中的值換成您自己的值,如下所示:

    • 若要擷取 tenantId,您可以執行 az account show --query "tenantId" 命令。
    • 若要擷取 subscriptionId,您可以執行 az account show --query "id" 命令。
    • resourceGroup 是 DNS 區域所在的資源群組名稱。
    • aadClientId 是服務主體輸出中的 appId
    • aadClientSecret 是服務主體輸出中的密碼。
  6. 若要提供 Azure 認證給 ExternalDNS 使用,請在將執行 ExternalDNS 的命名空間中建立 Kubernetes 密碼:

    1. kubectl 的內容設定為要部署 ExternalDNS 的叢集。例如:

      kubectl config use-context tkg-services-admin@tkg-services
      
    2. 使用上一個步驟中的 azure.json 組態檔來建立密碼:

      kubectl -n tanzu-system-service-discovery create secret generic azure-config-file --from-file=azure.json
      
  7. 擷取 ExternalDNS 套件的預設組態,以便為該套件建立組態檔:

    tanzu package available get external-dns.tanzu.vmware.com/PACKAGE-VERSION --default-values-file-output FILE-PATH
    

    其中,PACKAGE-VERSION 是您要安裝的 ExternalDNS 套件版本,FILE-PATH 是用來儲存組態檔的位置,例如,external-dns-data-values.yaml

  8. external-dns-data-values.yaml 檔案中進行以下設定。此檔案設定 ExternalDNS 套件。

    ---
    
    # Namespace in which to deploy ExternalDNS.
    namespace: tanzu-system-service-discovery
    
    # Deployment-related configuration.
    deployment:
     args:
       - --source=service
       - --source=ingress
       - --source=contour-httpproxy # Provide this to enable Contour HTTPProxy support. Must have Contour installed or ExternalDNS will fail.
       - --domain-filter=DOMAIN # For example, k8s.example.org. Makes ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones.
       - --policy=upsert-only # Prevents ExternalDNS from deleting any records, omit to enable full synchronization.
       - --registry=txt
       - --txt-prefix=externaldns- # Disambiguates TXT records from CNAME records.
       - --provider=azure
       - --azure-resource-group=RESOURCE-GROUP # Azure resource group.
     env: []
     securityContext: {}
     volumeMounts:
       - name: azure-config-file
         mountPath: /etc/kubernetes
         readOnly: true
     volumes:
       - name: azure-config-file
         secret:
           secretName: azure-config-file
    

    external-dns-data-values.yaml 檔案中的預留位置換成您的值。關於其他組態選項,請參閱 ExternalDNS 說明文件。

    external-dns-data-values.yaml 檔案中設定任何其他組態選項之前,請檢閱 ExternalDNS 套件的值結構描述。若要擷取值結構描述,請執行:

    tanzu package available get external-dns.tanzu.vmware.com/AVAILABLE-VERSION --values-schema
    

    其中,AVAILABLE-VERSION 是 ExternalDNS 套件的版本。--values-schema 旗標從 ExternalDNS 套件的 Package API 資源中擷取 valuesSchema 區段。您可以將值結構描述的輸出格式 --output 設定為 yamljsontable。如需詳細資訊,請參閱《安裝和管理套件》中的套件


安裝 ExternalDNS 套件

  1. kubectl 的內容設定為要部署 ExternalDNS 的叢集。例如:

    kubectl config use-context tkg-services-admin@tkg-services
    
  2. 如果叢集無已安裝 ExternalDNS 軟體套件的套件存放庫 (例如 tanzu-standard 存放庫),請安裝一個:

    tanzu package repository add PACKAGE-REPO-NAME --url PACKAGE-REPO-ENDPOINT --namespace tkg-system
    

    其中:

    • PACKAGE-REPO-NAME 是軟體套件存放庫的名稱,例如 tanzu-standard 或使用 ADDITIONAL_IMAGE_REGISTRY 變數設定的私人映像登錄名稱。
    • PACKAGE-REPO-ENDPOINT 是套件存放庫的 URL。

      • 對於此版本,tanzu-standard URL 為 projects.registry.vmware.com/tkg/packages/standard/repo:v2023.10.16。若要從 Tanzu CLI 取得此值,請參閱列出套件存放庫,或在 Tanzu Mission Control 中查看叢集 (Cluster) 窗格中的附加元件 (Addons) > 存放庫 (Repositories) 清單。
  3. 擷取 ExternalDNS 套件的名稱:

    tanzu package available list -A
    
  4. 擷取 ExternalDNS 套件的版本:

    tanzu package available list external-dns.tanzu.vmware.com -A
    
  5. 如果您的 external-dns-data-values.yaml 檔案包含註解,請在安裝套件之前將之移除:

    yq -i eval '... comments=""' external-dns-data-values.yaml
    
  6. 安裝套件:

    tanzu package install external-dns \
    --package external-dns.tanzu.vmware.com \
    --version AVAILABLE-PACKAGE-VERSION \
    --values-file external-dns-data-values.yaml \
    --namespace TARGET-NAMESPACE
    

    其中:

    • TARGET-NAMESPACE 是要在其中安裝 ExternalDNS 軟體套件的命名空間。例如,my-packagestanzu-cli-managed-packages 命名空間。

      • 如果未指定 --namespace 旗標,則 Tanzu CLI 會在 default 命名空間中安裝套件。ExternalDNS Pod 及與 ExternalDNS 元件相關聯的任何其他資源是在 tanzu-system-service-discovery 命名空間中建立,請勿將 ExternalDNS 套件安裝到此命名空間。
      • 指定的命名空間必須已存在,例如,從執行 kubectl create namespace my-packages
    • AVAILABLE-PACKAGE-VERSION 是上面擷取到的版本。

    例如:

    tanzu package install external-dns \
    --package external-dns.tanzu.vmware.com \
    --version 0.10.0+vmware.1-tkg.1 \
    --values-file external-dns-data-values.yaml \
    --namespace my-packages
    
  7. 確認已安裝 external-dns 套件:

    tanzu package installed list -A
    

    若要查看有關套件的更多詳細資料,也可以執行:

    tanzu package installed get external-dns --namespace PACKAGE-NAMESPACE
    

    其中,PACKAGE-NAMESPACE 是安裝 external-dns 套件的命名空間。

  8. 確認 external-dns 應用程式已在 PACKAGE-NAMESPACE 中成功協調:

    kubectl get apps -A
    

    如果狀態不是 Reconcile Succeeded,請檢視 external-dns 應用程式的完整狀態詳細資料。檢視完整狀態可協助您對問題進行疑難排解。

    kubectl get app external-dns --namespace PACKAGE-NAMESPACE -o yaml
    

    其中,PACKAGE-NAMESPACE 是安裝套件的命名空間。如果疑難排解無法協助您解決問題,則必須先解除安裝套件,然後再重新安裝:

    tanzu package installed delete external-dns --namespace PACKAGE-NAMESPACE
    
  9. 確認 ExternalDNS Pod 正在 tanzu-system-service-discovery 命名空間中執行:

    kubectl get pods -A
    

驗證 ExternalDNS

如果使用 Contour 設定,ExternalDNS 會自動監視 HTTPProxy 資源的指定命名空間,並為主機名稱符合所設定網域篩選器的服務建立 DNS 記錄。

ExternalDNS 還會自動監視含有註解 external-dns.alpha.kubernetes.io/hostname 的 Kubernetes 服務,並為註解符合所設定網域篩選器的服務建立 DNS 記錄。

例如,對於含有註解 external-dns.alpha.kubernetes.io/hostname: foo.k8s.example.org 的服務,ExternalDNS 會為 foo.k8s.example.org 建立 DNS 記錄。可以檢查您建立的區域來驗證記錄是否存在。

更新正在執行的 ExternalDNS 部署

如果需要在部署後變更 ExternalDNS 套件的組態,請遵循以下步驟更新已部署的 ExternalDNS 套件。

  1. external-dns-data-values.yaml 中更新 ExternalDNS 組態。

  2. 更新已安裝的套件組態:

    tanzu package installed update external-dns \
    --version INSTALLED-PACKAGE-VERSION \
    --values-file external-dns-data-values.yaml \
    --namespace INSTALLED-PACKAGE-NAMESPACE
    

    其中:

    • INSTALLED-PACKAGE-VERSION 是已安裝 ExternalDNS 套件版本。
    • INSTALLED-PACKAGE-NAMESPACE 是安裝 ExternalDNS 套件的命名空間。

    例如:

    tanzu package installed update external-dns \
    --version 0.10.0+vmware.1-tkg.1 \
    --values-file external-dns-data-values.yaml \
    --namespace my-packages
    

將使用您新增的值協調 ExternalDNS 套件。kapp-controller 套用變更可能需要長達五分鐘的時間。

如需 tanzu package installed update 命令的詳細資訊,請參閱安裝和管理套件中的更新套件。您可以使用此命令更新已安裝的套件版本或組態。

check-circle-line exclamation-circle-line close-line
Scroll to top icon