透過外部 DNS,可以根據 Kubernetes 負載平衡服務動態設定 DNS 記錄。可以部署適用於外部 DNS 的 TKG 延伸,為叢集提供動態服務探索。

延伸必要條件

部署適用於外部 DNS 的 TKG 延伸 v1.3.1 之前,請遵循下列需求。

其他要求

隨外部 DNS 延伸提供的範例組態包含帶有和不帶有 Contour 入口控制器的範例。如果要使用 Contour,請先進行安裝,然後再安裝外部 DNS 延伸。請參閱〈部署和管理適用於 Contour 入口的 TKG 延伸〉

外部 DNS 延伸支援動態服務探索。一個常見使用案例是使用 Harbor 登錄。Harbor 需要在符合 RFC 2136 的動態 DNS 提供者 (如 AWS Route53、Azure DNS、Google Cloud DNS) 或本機 DNS 伺服器 (如 BIND) 上設定 DNS 區域。請參閱〈部署和管理適用於 Harbor 登錄的 TKG 延伸〉

部署外部 DNS 延伸

完成以下步驟,安裝用於外部 DNS 的 TKG 延伸 v1.3.1。

  1. 將目錄變更為外部 DNS 延伸檔案的下載位置。
    cd /tkg-extensions-v1.3.1+vmware.1/extensions/service-discovery/external-dns
  2. 建立命名空間和數個角色型存取控制物件,以與外部 DNS 延伸搭配使用。
    kubectl apply -f namespace-role.yaml

    此命令會建立命名空間 tanzu-system-service-discovery 和相關聯的 RBAC 物件。執行 kubect get ns 以進行驗證。

  3. 建立資料值檔案。範例資料值檔案將提供所需的最低組態。

    提供了針對 AWS、Azure 和符合 RFC 2136 標準的動態 DNS 提供者的範例資料值檔案 (均含有和不含 Contour 入口)。選擇適當的範例檔案並加以複製。

    例如,如果要將 AWS Route 53 與 Contour 搭配使用,請執行下列命令。
    cp external-dns-data-values-aws-with-contour.yaml.example external-dns-data-values-aws-with-contour.yaml
    或者,如果要將 Azure 與 Contour 搭配使用,請執行下列命令。
    cp external-dns-data-values-azure-with-contour.yaml.example external-dns-data-values-azure-with-contour.yaml
  4. 設定外部 DNS 資料值。

    例如,以下是 Azure DNS 的組態。提供 domain-filterazure-resource-group 值。

    #@data/values
    #@overlay/match-child-defaults missing_ok=True
    ---
    externalDns:
      image:
        repository: projects.registry.vmware.com/tkg
      deployment:
        #@overlay/replace
        args:
        - --provider=azure
        - --source=service
        - --source=ingress
        - --domain-filter=my-zone.example.org #! zone where services are deployed
        - --azure-resource-group=my-resource-group #! Azure resource group
        #@overlay/replace
        volumeMounts:
        - name: azure-config-file
          mountPath: /etc/kubernetes
          readOnly: true
        #@overlay/replace
        volumes:
        - name: azure-config-file
          secret:
            secretName: azure-config-file
  5. 使用已填入的資料值檔案建立一般密碼。

    例如,下列命令會使用 Azure DNS 資料值檔案建立密碼。

    kubectl create secret generic external-dns-data-values --from-file=values.yaml=external-dns-data-values-azure-with-contour.yaml -n tanzu-system-service-discovery

    您應該會看到在 tanzu-system-service-discovery 命名空間中建立了 secret/external-dns-data-values created。可以使用 kubectl get secrets -n tanzu-system-service-discovery 命令對此進行驗證。

  6. 部署外部 DNS 延伸。
    kubectl apply -f external-dns-extension.yaml

    成功後,您應該會看到 app.kappctrl.k14s.io/external-dns created

  7. 檢查延伸部署的狀態。
    kubectl get app external-dns -n tanzu-system-service-discovery
    成功部署外部 DNS 後,應用程式狀態應從 Reconciling 變更為 Reconcile succeeded。如果狀態為 Reconcile failed,請參閱疑難排解部署
  8. 檢視詳細狀態。
    kubectl get app external-dns -n tanzu-system-service-discovery -o yaml

疑難排解部署

如果協調失敗,請執行命令 kubectl get pods -A 以檢視網繭的狀態。在一般情況下,您應該會看到 external-dns-XXXXX 網繭狀態為 Running。如果協調失敗或網繭狀態為 ImagePullBackOffImagecRashLoopBackOff,則表示無法從存放庫提取容器映像。檢查資料值和延伸 YAML 檔案中的存放庫 URL,並確保其正確無誤。

若要檢查容器記錄,請執行下列命令,其中 name-XXXX 是您在執行 kubectl get pods -A 時可以看到的唯一網繭名稱:
kubectl logs pod/external-dns-XXXXX -c external-dns -n tanzu-system-service-discovery

更新外部 DNS 延伸

更新部署到 Tanzu Kubernetes 叢集的外部 DNS 延伸。

  1. 從密碼取得 Contour 資料值。
    kubectl get secret external-dns-data-values -n tanzu-system-service-discovery -o 'go-template={{ index .data "values.yaml" }}' | base64 -d > external-dns-data-values.yaml
  2. 更新 external-dns-data-values.yaml 中的外部 DNS 資料值。請參閱設定外部 DNS 延伸
  3. 更新 Contour 資料值密碼。
    kubectl create secret generic external-dns-data-values --from-file=values.yaml=external-dns-data-values.yaml -n tanzu-system-service-discovery -o yaml --dry-run | kubectl replace -f-
    將使用新的資料值來協調外部 DNS 延伸。
    備註: 依預設,kapp-controller 將每 5 分鐘同步一次應用程式。更新應在 5 分鐘內生效。如果您想讓更新立即生效,請變更 external-dns-extension 中的 syncPeriod 為較小值,然後使用 kubectl apply -f external-dns-extension 來套用 Contour 延伸。
  4. 檢查該延伸的狀態。
    kubectl get app external-dns -n tanzu-system-service-disovery

    更新後,應用程式狀態應變更為 Reconcile Succeeded

  5. 檢視詳細狀態和疑難排解。
    kubectl get app external-dns -n tanzu-system-service-disovery -o yaml

刪除外部 DNS 延伸

Tanzu Kubernetes 叢集中刪除外部 DNS 延伸。

備註: 按順序完成步驟。請不要在刪除延伸及應用程式之前,先刪除目標命名空間和角色物件。刪除命名空間和角色物件會刪除 kapp-controller 所使用的服務帳戶。如果在刪除應用程式和延伸之前刪除了此服務帳戶,則可能會導致系統錯誤。
  1. 將目錄變更為延伸檔案的下載位置。
    cd /tkg-extensions-v1.3.1+vmware.1/extensions/service-discovery/external-dns
  2. 刪除外部 DNS 延伸。
    kubectl delete -f external-dns-extension.yaml
  3. 確認延伸是否已刪除。
    kubectl get app contour -n tanzu-system-ingress

    預期的結果:應用程式為 Not Found

  4. 刪除命名空間。
    僅在您確認 Contour 延伸及應用程式已完全刪除後,才能安全地刪除命名空間和角色物件。
    kubectl delete -f namespace-role.yaml
    預期的結果:刪除部署了延伸的命名空間以及相關聯的角色型存取控制物件。

設定外部 DNS 延伸

您可以使用自訂設定來設定外部 DNS 延伸。

設定外部 DNS 提供者的部署參數。如需其他指引,請參閱 Kubernetes 站台 https://github.com/kubernetes-sigs/external-dns#running-externaldns
表 1. Harbor 延伸組態參數
參數 說明 類型 預設值
externalDns.namespace 將部署 external-dns 的命名空間 string tanzu-system-service-discovery
externalDns.image.repository 包含 external-dns 映像的登錄 string projects.registry.vmware.com/tkg
externalDns.image.name external-dns 的名稱 string external-dns
externalDns.image.tag ExternalDNS 映像標籤 string v0.7.4_vmware.1
externalDns.image.pullPolicy ExternalDNS 映像提取原則 string IfNotPresent
externalDns.deployment.annotations external-dns 部署上的註解 map<string,string> {}
externalDns.deployment.args 透過命令列傳遞至 external-dns 的引數 list<string> [] (必要參數)
externalDns.deployment.env 要傳遞至 external-dns 的環境變數 list<string> []
externalDns.deployment.securityContext external-dns 容器的安全性內容 SecurityContext {}
externalDns.deployment.volumeMounts external-dns 容器的磁碟區掛接 list<VolumeMount> []
externalDns.deployment.volumes external-dns 網繭的磁碟區 list<Volume> []