本主題說明如何將 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。
kubectl
,如安裝 Tanzu CLI 和其他工具以用於 vSphere with Tanzu 主管或安裝 Tanzu CLI 和其他工具以用於獨立管理叢集中所述。tanzu login
命令登入 Tanzu CLI。ExternalDNS 服務與要匯出 DNS 記錄的服務必須部署到相同的叢集。
ExternalDNS 套件已通過 AWS (Route 53)、Azure DNS 和 RFC2136 (BIND) 驗證。所提供的組態會同時匯出 LoadBalancer
類型的 Contour HTTPProxy 資源和 Kubernetes Services
的記錄。
外部 DNS 社群會以不同層級的穩定性來維持與許多 DNS 提供者的整合。除非另有說明,否則 VMware 不保證支援將 ExternalDNS 套件與特定提供者整合。
為 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": [
"*"
]
}
]
}
使用上面建立的原則為 ExternalDNS 建立 IAM 使用者。在 AWS 主控台,前往使用者 (Users) 畫面,然後按一下新增使用者 (Add users)。提供 IAM 使用者的名稱,並確保已啟用程式設計存取 (Programmatic access)。在精靈的權限 (Permissions) 畫面上,按一下直接連結現有原則 (Attach existing policies directly),然後選取在上一步建立的原則。
繼續到精靈的最後一頁。記錄存取金鑰識別碼 (Access key ID) 和秘密存取金鑰 (Secret access key)。若要提供這些 Route 53 認證給 ExternalDNS 使用,請在將執行 ExternalDNS 的命名空間中建立 Kubernetes 密碼。
將 kubectl
的內容設定為要部署 ExternalDNS 的叢集。例如:
kubectl config use-context tkg-services-admin@tkg-services
建立 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-ID
和 YOUR-SECRET-ACCESS-KEY
是您在上面記錄的認證。
擷取 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
。
在 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
設定為 yaml
、json
或 table
。如需詳細資訊,請參閱《安裝和管理套件》中的套件。
要求或建立伺服器的 TSIG 金鑰。必須授權此金鑰來更新和傳輸您要更新的區域。此金鑰類似如下:
key "externaldns-key" {
algorithm hmac-sha256;
secret "/2avn5M4ndEztbDqy66lfQ+PjRZta9UXLtToW6NV5nM=";
};
如果您管理自己的 DNS 伺服器,則可以使用 tsig-keygen -a hmac-sha256 externaldns
命令來建立 TSIG 金鑰。將輸出複製到 DNS 伺服器組態。例如,對於 BIND,您可以將金鑰新增至 named.conf
檔案,並設定區域的 allow-transfer
和 update-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
擷取 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
。
在 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
設定為 yaml
、json
或 table
。如需詳細資訊,請參閱《安裝和管理套件》中的套件。
登入 az
CLI:
az login
設定訂閱:
az account set -s SUBSCRIPTION-ID-GUID
建立服務主體:
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"
}
指派權限給服務主體:
擷取資源群組的識別碼:
az group show --name RESOURCE-GROUP --query id
將讀者角色指派給資源群組範圍的服務主體。您需要上述 az ad sp create-for-rbac
命令輸出中的 appId
。
az role assignment create --role "Reader" --assignee APP-ID-GUID --scope RESOURCE-GROUP-RESOURCE-ID
擷取 DNS 區域的識別碼:
az network dns zone show --name DNS-ZONE-NAME -g RESOURCE-GROUP-NAME --query id
將參與者角色指派給 DNS 區域範圍的服務主體:
az role assignment create --role "Contributor" --assignee APP-ID-GUID --scope DNS-ZONE-RESOURCE-ID
若要將 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
是服務主體輸出中的密碼。若要提供 Azure 認證給 ExternalDNS 使用,請在將執行 ExternalDNS 的命名空間中建立 Kubernetes 密碼:
將 kubectl
的內容設定為要部署 ExternalDNS 的叢集。例如:
kubectl config use-context tkg-services-admin@tkg-services
使用上一個步驟中的 azure.json
組態檔來建立密碼:
kubectl -n tanzu-system-service-discovery create secret generic azure-config-file --from-file=azure.json
擷取 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
。
在 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
設定為 yaml
、json
或 table
。如需詳細資訊,請參閱《安裝和管理套件》中的套件。
將 kubectl
的內容設定為要部署 ExternalDNS 的叢集。例如:
kubectl config use-context tkg-services-admin@tkg-services
如果叢集無已安裝 ExternalDNS 軟體套件的套件存放庫 (例如 tanzu-standard
存放庫),請安裝一個:
附註如果要將以計劃為基礎的叢集 (舊版) 為目標,請跳過此步驟。對於以計劃為基礎的叢集,會在
tanzu-package-repo-global
命名空間中的每個叢集中,自動啟用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:v2.2.0
。若要從 Tanzu CLI 取得此值,請參閱列出套件存放庫,或在 Tanzu Mission Control 中查看叢集 (Cluster) 窗格中的附加元件 (Addons) > 存放庫 (Repositories) 清單。擷取 ExternalDNS 套件的名稱:
tanzu package available list -A
擷取 ExternalDNS 套件的版本:
tanzu package available list external-dns.tanzu.vmware.com -A
如果您的 external-dns-data-values.yaml
檔案包含註解,請在安裝套件之前將之移除:
yq -i eval '... comments=""' external-dns-data-values.yaml
安裝套件:
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-packages
或 tanzu-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.8.0+vmware.1-tkg.1 \
--values-file external-dns-data-values.yaml \
--namespace my-packages
確認已安裝 external-dns
套件:
tanzu package installed list -A
若要查看有關套件的更多詳細資料,也可以執行:
tanzu package installed get external-dns --namespace PACKAGE-NAMESPACE
其中,PACKAGE-NAMESPACE
是安裝 external-dns
套件的命名空間。
確認 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
確認 ExternalDNS Pod 正在 tanzu-system-service-discovery
命名空間中執行:
kubectl get pods -A
如果使用 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 套件。
在 external-dns-data-values.yaml
中更新 ExternalDNS 組態。
更新已安裝的套件組態:
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.8.0+vmware.1-tkg.1 \
--values-file external-dns-data-values.yaml \
--namespace my-packages
將使用您新增的值協調 ExternalDNS 套件。kapp-controller
套用變更可能需要長達五分鐘的時間。
如需 tanzu package installed update
命令的詳細資訊,請參閱安裝和管理套件中的更新套件。您可以使用此命令更新已安裝的套件版本或組態。