ExternalDNS 是一個第三方的開源工具,專為 Kubernetes 集群的 DNS 記錄管理自動化而設計。它與 Kubernetes 無縫集成,能根據集群的變更動態更新 DNS 記錄,從而實現服務、API 和應用的自動化公開。最初,ExternalDNS 是為支持 AWS Route53 和 Google CloudDNS 開發的,現已擴展支持眾多 DNS 提供商,使其成為雲原生環境中多功能的選擇。

ExternalDNS 的關鍵概念

ExternalDNS 通過監控 Kubernetes 資源(如 Service、Ingress 和 Istio Gateway)作為“來源”,這些資源代表網絡端點。它使用 Kubernetes 的控制器模式將這些來源與 DNS 記錄進行匹配,確保記錄與基礎設施變更保持同步。

資源類型

ExternalDNS 的主要資源類型包括:

  • Service (LoadBalancer 類型):常用於高可用性應用。
  • Ingress:根據路由規則管理對服務的訪問。
  • 自定義資源 (CRD):擴展 ExternalDNS 與其他 Kubernetes 配置的兼容性。

每種資源都與一個 ExternalDNS 實例相關聯,該實例會根據配置在 DNS 提供商處對這些資源進行同步。

- name: external-dns
  image: //third_party/docker:external_dns
  args:
    - --source=ingress
    - --source=service

主機名註解

ExternalDNS 探測到資源後,需透過主機名(hostname)來識別指向該資源的 DNS 記錄。主機名註解通過指定記錄名稱來實現此功能。

metadata:
  annotations:
    external-dns.alpha.kubernetes.io/hostname: api.example.io

此註解指示 ExternalDNS 創建或更新 api.example.io 為主機名的 DNS 記錄。

DNS 提供商與整合

ExternalDNS 支援多種 DNS 提供商,這使其成為多雲設置中的靈活選擇。DNS 提供商或“整合”允許它在平台(如 AWS Route53、Google CloudDNS 和 Azure DNS)上更新記錄。提供商配置作為 ExternalDNS 容器的參數進行指定:

- name: external-dns
  image: //third_party/docker:external_dns
  args:
    - --provider=aws

ExternalDNS 的策略與註冊表

策略模式

ExternalDNS 的策略定義了它如何與 DNS 提供商交互。可用的策略包括:

  • 同步 (Sync):支持創建、更新和刪除操作。
  • 僅新增或更新 (Upsert-only):僅允許創建和更新,防止意外刪除。
  • 僅創建 (Create-only):限制操作僅限於創建新記錄。

使用 upsert-only 策略可確保根據需要創建或更新 DNS 記錄,而不會發生意外刪除:

- name: external-dns
  image: //third_party/docker:external_dns
  args:
    - --policy=upsert-only

註冊表選項

為了維持特定記錄的所有權與控制,ExternalDNS 使用註冊表記錄其所有權。TXT 註冊表 是一個常用選項,會在 ExternalDNS 管理的 DNS 記錄旁邊添加一條 TXT 記錄。該 TXT 記錄可識別所有權,幫助區分手動創建或由其他工具(如 Terraform)創建的記錄。

- name: external-dns
  image: //third_party/docker:external_dns
  args:
    - --registry=txt

ExternalDNS 的控制迴路

ExternalDNS 定期調整 DNS 記錄以匹配資源所定義的目標狀態。此調整通過控制迴路進行,可設置為定期執行或響應特定事件:

  • 間隔 (Interval):按設定的週期執行,將 DNS 記錄更新為 Kubernetes 物件的當前狀態。
  • 事件 (Events):響應特定來源變更觸發更新,提供更快的響應速度。

以下配置設置了 10 分鐘的調整間隔,並啟用了基於事件的更新:

- name: external-dns
  image: //third_party/docker:external_dns
  args:
    - --interval=10m
    - --events

結論

ExternalDNS 是一種強大的工具,可在 Kubernetes 環境中實現 DNS 記錄管理自動化。透過與多個 DNS 提供商的集成以及靈活的策略和註冊表選項,它減少了 DNS 管理的手動負擔,確保記錄與服務端點同步。ExternalDNS 在雲原生設置中是一個寶貴的工具,能自動公開核心服務和 API,並維持運營效率。