In diesem Thema wird die Bereitstellung von ExternalDNS in einem Arbeitslastcluster in Tanzu Kubernetes Grid erläutert.
Der ExternalDNS-Dienst veröffentlicht DNS-Datensätze für Anwendungen auf DNS-Servern unter Verwendung einer deklarativen, nativen Kubernetes-Schnittstelle. Er befindet sich als CLI-verwaltetes Paket im Lieferumfang von Tanzu Kubernetes Grid.
In Umgebungen, in denen Harbor in einem Shared Services-Cluster mit Lastausgleich (AWS, Azure und vSphere mit NSX Advanced Load Balancer) bereitgestellt wird, kann ExternalDNS zum Veröffentlichen eines DNS-Hostnamens für den Harbor-Dienst verwendet werden. Auf diese Weise kann über andere Cluster auf Harbor zugegriffen werden. Weitere Informationen finden Sie unter Harbor-Registrierung und ExternalDNS.
kubectl
.tanzu context use
angemeldet.Der ExternalDNS-Dienst muss im selben Cluster wie die Dienste bereitgestellt werden, für die DNS-Datensätze exportiert werden.
Das ExternalDNS-Paket wurde mit AWS (Route 53), Azure DNS und RFC2136 (BIND) validiert. Mit der angegebenen Konfiguration werden Datensätze für Contour HTTPProxy-Ressourcen und Kubernetes-Services
vom Typ LoadBalancer
exportiert.
Die externe DNS-Community verwaltet Integrationen mit vielen DNS-Anbietern auf mit unterschiedlichen Stabilitätsstufen. Sofern nicht anders angegeben, garantiert VMware keine Unterstützung für die Integration des ExternalDNS-Pakets mit bestimmten Anbietern.
Erstellen Sie eine IAM-Richtlinie für ExternalDNS zur Aktualisierung von Route 53. Wechseln Sie in der AWS-Konsole zum IAM-Dashboard und navigieren Sie unter Zugriffsverwaltung (Access Management) zum Bildschirm Richtlinien (Policies). Klicken Sie auf Richtlinie erstellen (Create Policy) und wechseln Sie zur Registerkarte „JSON“. Fügen Sie die folgende Richtlinie ein. Bei Bedarf können Sie die Richtlinie optimieren, um Updates für die soeben erstellte gehostete Zone zuzulassen. Schließen Sie den Assistenten ab.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"route53:ChangeResourceRecordSets"
],
"Resource": [
"arn:aws:route53:::hostedzone/*"
]
},
{
"Effect": "Allow",
"Action": [
"route53:ListHostedZones",
"route53:ListResourceRecordSets"
],
"Resource": [
"*"
]
}
]
}
Erstellen Sie anhand der oben erstellten Richtlinie einen IAM-Benutzer für ExternalDNS. Wechseln Sie in der AWS-Konsole zum Bildschirm Benutzer (Users) und klicken Sie auf Benutzer hinzufügen (Add users). Geben Sie einen Namen für den IAM-Benutzer an und stellen Sie sicher, dass Programmgesteuerter Zugriff (Programmatic access) aktiviert ist. Klicken Sie auf dem Bildschirm Berechtigungen (Permissions) des Assistenten auf Vorhandene Richtlinien direkt anhängen (Attach existing policies directly) und wählen Sie die Richtlinie aus, die Sie im vorherigen Schritt erstellt haben.
Fahren Sie mit der letzten Seite des Assistenten fort. Notieren Sie sich die Zugriffsschlüssel-ID (Access key ID) und den geheimen Zugriffsschlüssel (Secret access key). Um diese Route 53-Anmeldedaten für ExternalDNS zur Verfügung zu stellen, erstellen Sie einen geheimen Kubernetes-Schlüssel in dem Namespace, in dem ExternalDNS ausgeführt wird.
Legen Sie den Kontext von kubectl
auf den Cluster fest, in dem Sie ExternalDNS bereitstellen. Beispiel:
kubectl config use-context tkg-services-admin@tkg-services
Erstellen Sie den geheimen Kubernetes-Schlüssel:
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
Dabei gilt: YOUR-ACCESS-KEY-ID
und YOUR-SECRET-ACCESS-KEY
sind die oben aufgezeichneten Anmeldedaten.
Erstellen Sie eine Konfigurationsdatei für das ExternalDNS-Paket, indem Sie die Standardkonfiguration des Pakets abrufen:
tanzu package available get external-dns.tanzu.vmware.com/PACKAGE-VERSION --default-values-file-output FILE-PATH
Dabei ist PACKAGE-VERSION
die Version des ExternalDNS-Pakets, das Sie installieren möchten, und FILE-PATH
der Speicherort, an dem Sie die Konfigurationsdatei speichern möchten, z. B. external-dns-data-values.yaml
.
Konfigurieren Sie die folgenden Einstellungen in der Datei external-dns-data-values.yaml
. Anhand dieser Datei wird das ExternalDNS-Paket konfiguriert.
---
# 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: []
Ersetzen Sie die Platzhalter in der Datei external-dns-data-values.yaml
durch Ihre Werte. Weitere Konfigurationsoptionen finden Sie in der ExternalDNS-Dokumentation.
Bevor Sie zusätzliche Konfigurationsoptionen in der Datei external-dns-data-values.yaml
festlegen, überprüfen Sie das Werteschema des ExternalDNS-Pakets. Führen Sie zum Abrufen des Werteschemas folgenden Befehl aus:
tanzu package available get external-dns.tanzu.vmware.com/AVAILABLE-VERSION --values-schema
Dabei gilt: AVAILABLE-VERSION
ist die Version des ExternalDNS-Pakets. Mit dem Flag --values-schema
wird der Abschnitt valuesSchema
aus der API-Ressource Package
für das ExternalDNS-Paket abgerufen. Sie können das Ausgabeformat --output
für das Werteschema auf yaml
, json
oder table
festlegen. Weitere Informationen finden Sie unter Pakete in Installieren und Verwalten von Paketen.
Fordern Sie einen TSIG-Schlüssel für Ihren Server an oder erstellen Sie ihn. Dieser Schlüssel muss zur Aktualisierung und Übertragung der zu aktualisierenden Zone berechtigt sein. Der Schlüssel ähnelt Folgendem:
key "externaldns-key" {
algorithm hmac-sha256;
secret "/2avn5M4ndEztbDqy66lfQ+PjRZta9UXLtToW6NV5nM=";
};
Wenn Sie Ihren eigenen DNS-Server verwalten, können Sie mithilfe des Befehls tsig-keygen -a hmac-sha256 externaldns
einen TSIG-Schlüssel erstellen. Kopieren Sie die Ausgabe in die Konfiguration der DNS-Server. Beispiel: Fügen Sie für BIND den Schlüssel zur Datei named.conf
hinzu und konfigurieren Sie die Zone mit den Feldern allow-transfer
und update-policy
. Beispiel:
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;
};
};
Die obigen Ausführungen setzen voraus, dass Sie auch über eine Zonendatei verfügen, die Folgendem ähnelt:
$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
Erstellen Sie eine Konfigurationsdatei für das ExternalDNS-Paket, indem Sie die Standardkonfiguration des Pakets abrufen:
tanzu package available get external-dns.tanzu.vmware.com/PACKAGE-VERSION --default-values-file-output FILE-PATH
Dabei ist PACKAGE-VERSION
die Version des ExternalDNS-Pakets, das Sie installieren möchten, und FILE-PATH
der Speicherort, an dem Sie die Konfigurationsdatei speichern möchten, z. B. external-dns-data-values.yaml
.
Konfigurieren Sie die folgenden Einstellungen in der Datei external-dns-data-values.yaml
. Anhand dieser Datei wird das ExternalDNS-Paket konfiguriert.
---
# 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: []
Ersetzen Sie die Platzhalter in der Datei external-dns-data-values.yaml
durch Ihre Werte. Weitere Konfigurationsoptionen finden Sie in der ExternalDNS-Dokumentation.
Bevor Sie zusätzliche Konfigurationsoptionen in der Datei external-dns-data-values.yaml
festlegen, überprüfen Sie das Werteschema des ExternalDNS-Pakets. Führen Sie zum Abrufen des Werteschemas folgenden Befehl aus:
tanzu package available get external-dns.tanzu.vmware.com/AVAILABLE-VERSION --values-schema
Dabei gilt: AVAILABLE-VERSION
ist die Version des ExternalDNS-Pakets. Mit dem Flag --values-schema
wird der Abschnitt valuesSchema
aus der API-Ressource Package
für das ExternalDNS-Paket abgerufen. Sie können das Ausgabeformat --output
für das Werteschema auf yaml
, json
oder table
festlegen. Weitere Informationen finden Sie unter Pakete in Installieren und Verwalten von Paketen.
Melden Sie sich bei der az
-CLI an:
az login
Legen Sie Ihr Abonnement fest:
az account set -s SUBSCRIPTION-ID-GUID
Erstellen Sie einen Dienstprinzipal:
az ad sp create-for-rbac -n SERVICE-PRINCIPAL-NAME
Die JSON-Ausgabe des Befehls ähnelt Folgendem:
{
"appId": "a72a7cfd-7cb0-4b02-b130-03ee87e6ca89",
"displayName": "foo",
"name": "http://foo",
"password": "515c55da-f909-4e17-9f52-236ffe1d3033",
"tenant": "b35138ca-3ced-4b4a-14d6-cd83d9ea62f0"
}
Weisen Sie dem Dienstprinzipal Berechtigungen zu:
Rufen Sie die ID der Ressourcengruppe ab:
az group show --name RESOURCE-GROUP --query id
Weisen Sie dem Dienstprinzipal im Geltungsbereich der Ressourcengruppe die Rolle „Leser (Reader)“ zu. Sie benötigen die appId
aus der Ausgabe des Befehls az ad sp create-for-rbac
(siehe oben).
az role assignment create --role "Reader" --assignee APP-ID-GUID --scope RESOURCE-GROUP-RESOURCE-ID
Rufen Sie die ID der DNS-Zone ab:
az network dns zone show --name DNS-ZONE-NAME -g RESOURCE-GROUP-NAME --query id
Weisen Sie dem Dienstprinzipal im Geltungsbereich der DNS-Zone die Rolle „Mitwirkender (Contributor)“ zu:
az role assignment create --role "Contributor" --assignee APP-ID-GUID --scope DNS-ZONE-RESOURCE-ID
Zum Herstellen einer Verbindung zwischen dem ExternalDNS-Dienst und dem Azure-DNS-Dienst erstellen Sie eine Konfigurationsdatei mit dem Namen azure.json
auf Ihrem lokalen Computer mit Inhalten, die Folgendem ähneln:
{
"tenantId": "01234abc-de56-ff78-abc1-234567890def",
"subscriptionId": "01234abc-de56-ff78-abc1-234567890def",
"resourceGroup": "MyDnsResourceGroup",
"aadClientId": "01234abc-de56-ff78-abc1-234567890def",
"aadClientSecret": "uKiuXeiwui4jo9quae9o"
}
Ersetzen Sie die Werte im obigen Beispiel folgendermaßen durch eigene Werte:
tenantId
können Sie den Befehl az account show --query "tenantId"
ausführen.subscriptionId
können Sie den Befehl az account show --query "id"
ausführen.resourceGroup
ist der Name der Ressourcengruppe, in der sich die DNS-Zone befindet.aadClientId
ist die appId
aus der Ausgabe des Dienstprinzipals.aadClientSecret
ist das Kennwort aus der Ausgabe des Dienstprinzipals.Um diese Azure-Anmeldedaten für ExternalDNS zur Verfügung zu stellen, erstellen Sie einen geheimen Kubernetes-Schlüssel in dem Namespace, in dem ExternalDNS ausgeführt wird:
Legen Sie den Kontext von kubectl
auf den Cluster fest, in dem Sie ExternalDNS bereitstellen. Beispiel:
kubectl config use-context tkg-services-admin@tkg-services
Erstellen Sie den geheimen Schlüssel mithilfe der Konfigurationsdatei azure.json
aus dem vorherigen Schritt:
kubectl -n tanzu-system-service-discovery create secret generic azure-config-file --from-file=azure.json
Erstellen Sie eine Konfigurationsdatei für das ExternalDNS-Paket, indem Sie die Standardkonfiguration des Pakets abrufen:
tanzu package available get external-dns.tanzu.vmware.com/PACKAGE-VERSION --default-values-file-output FILE-PATH
Dabei ist PACKAGE-VERSION
die Version des ExternalDNS-Pakets, das Sie installieren möchten, und FILE-PATH
der Speicherort, an dem Sie die Konfigurationsdatei speichern möchten, z. B. external-dns-data-values.yaml
.
Konfigurieren Sie die folgenden Einstellungen in der Datei external-dns-data-values.yaml
. Anhand dieser Datei wird das ExternalDNS-Paket konfiguriert.
---
# 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
Ersetzen Sie die Platzhalter in der Datei external-dns-data-values.yaml
durch Ihre Werte. Weitere Konfigurationsoptionen finden Sie in der ExternalDNS-Dokumentation.
Bevor Sie zusätzliche Konfigurationsoptionen in der Datei external-dns-data-values.yaml
festlegen, überprüfen Sie das Werteschema des ExternalDNS-Pakets. Führen Sie zum Abrufen des Werteschemas folgenden Befehl aus:
tanzu package available get external-dns.tanzu.vmware.com/AVAILABLE-VERSION --values-schema
Dabei gilt: AVAILABLE-VERSION
ist die Version des ExternalDNS-Pakets. Mit dem Flag --values-schema
wird der Abschnitt valuesSchema
aus der API-Ressource Package
für das ExternalDNS-Paket abgerufen. Sie können das Ausgabeformat --output
für das Werteschema auf yaml
, json
oder table
festlegen. Weitere Informationen finden Sie unter Pakete in Installieren und Verwalten von Paketen.
Legen Sie den Kontext von kubectl
auf den Cluster fest, in dem Sie ExternalDNS bereitstellen. Beispiel:
kubectl config use-context tkg-services-admin@tkg-services
Wenn der Cluster nicht über ein Paket-Repository mit installiertem ExternalDNS-Paket verfügt, wie z. B. das tanzu-standard
-Repository, installieren Sie es:
tanzu package repository add PACKAGE-REPO-NAME --url PACKAGE-REPO-ENDPOINT --namespace tkg-system
Dabei gilt:
PACKAGE-REPO-NAME
ist der Name des Paket-Repositorys, wie z. B. tanzu-standard
, oder der Name einer privaten Image-Registrierung, die mit ADDITIONAL_IMAGE_REGISTRY
-Variablen konfiguriert ist.PACKAGE-REPO-ENDPOINT
ist die URL des Paket-Repositorys.
tanzu-standard
-URL projects.registry.vmware.com/tkg/packages/standard/repo:v2023.10.16
. Informationen zum Abrufen dieses Werts über die Tanzu CLI finden Sie unter Listen von Paketrepositorys oder in Tanzu Mission Control in der Liste Add-Ons (Addons) > Repositorys (Repositories) im Fensterbereich Cluster.Rufen Sie den Namen des ExternalDNS-Pakets ab:
tanzu package available list -A
Rufen Sie die Version des ExternalDNS-Pakets ab:
tanzu package available list external-dns.tanzu.vmware.com -A
Wenn Ihre Datei external-dns-data-values.yaml
Kommentare enthält, entfernen Sie diese vor der Installation des Pakets:
yq -i eval '... comments=""' external-dns-data-values.yaml
Installieren des Pakets:
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
Dabei gilt:
TARGET-NAMESPACE
ist der Namespace, in dem das ExternalDNS-Paket installiert werden soll. Beispielsweise der Namespace my-packages
oder tanzu-cli-managed-packages
.
--namespace
nicht angegeben ist, installiert die Tanzu CLI das Paket im Namespace default
. Die ExternalDNS-Pods und alle anderen mit der ExternalDNS-Komponente verknüpften Ressourcen werden im Namespace tanzu-system-service-discovery
erstellt. Installieren Sie das ExternalDNS-Paket nicht in diesem Namespace.kubectl create namespace my-packages
.AVAILABLE-PACKAGE-VERSION
ist die oben abgerufene Version.Beispiel:
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
Bestätigen Sie, dass das Paket external-dns
installiert wurde:
tanzu package installed list -A
Sie können auch folgenden Befehl ausführen, um weitere Paketdetails anzuzeigen:
tanzu package installed get external-dns --namespace PACKAGE-NAMESPACE
Dabei gilt: PACKAGE-NAMESPACE
ist der Namespace, in dem das external-dns
-Paket installiert ist.
Bestätigen Sie, dass die external-dns
-App erfolgreich in Ihrem PACKAGE-NAMESPACE
abgeglichen wurde:
kubectl get apps -A
Lautet der Status nicht Reconcile Succeeded
, zeigen Sie die vollständigen Statusdetails der App external-dns
an. Die Anzeige des vollständigen Status kann Sie bei der Behebung des Problems unterstützen.
kubectl get app external-dns --namespace PACKAGE-NAMESPACE -o yaml
Dabei gilt: PACKAGE-NAMESPACE
ist der Namespace, in dem Sie das Paket installiert haben. Wenn das Problem nicht behoben werden kann, müssen Sie das Paket zunächst deinstallieren und dann erneut installieren:
tanzu package installed delete external-dns --namespace PACKAGE-NAMESPACE
Bestätigen Sie, dass ExternalDNS-Pods im Namespace tanzu-system-service-discovery
ausgeführt werden:
kubectl get pods -A
Bei der Konfiguration mit Contour überwacht ExternalDNS automatisch den angegebenen Namespace auf HTTPProxy-Ressourcen und erstellt DNS-Datensätze für Dienste mit Hostnamen, die dem konfigurierten Domänenfilter entsprechen.
ExternalDNS führt ebenfalls eine automatische Überwachung der Kubernetes-Dienste mit der Anmerkung external-dns.alpha.kubernetes.io/hostname
durch und erstellt DNS-Datensätze für Dienste, deren Anmerkungen mit dem konfigurierten Domänenfilter übereinstimmen.
Beispiel: Für einen Dienst mit der Anmerkung external-dns.alpha.kubernetes.io/hostname: foo.k8s.example.org
erstellt ExternalDNS einen DNS-Datensatz für foo.k8s.example.org
. Sie können überprüfen, ob der Datensatz vorhanden ist, indem Sie die von Ihnen erstellte Zone überprüfen.
Wenn Sie nach der Bereitstellung Änderungen an der Konfiguration des ExternalDNS-Pakets vornehmen müssen, führen Sie diese Schritte aus, um das bereitgestellte ExternalDNS-Paket zu aktualisieren.
Aktualisieren Sie die ExternalDNS-Konfiguration in external-dns-data-values.yaml
.
Aktualisieren Sie die Konfiguration des installierten Pakets:
tanzu package installed update external-dns \
--version INSTALLED-PACKAGE-VERSION \
--values-file external-dns-data-values.yaml \
--namespace INSTALLED-PACKAGE-NAMESPACE
Dabei gilt:
INSTALLED-PACKAGE-VERSION
ist die Version des installierten ExternalDNS-Pakets.INSTALLED-PACKAGE-NAMESPACE
ist der Namespace, in dem das ExternalDNS-Paket installiert ist.Beispiel:
tanzu package installed update external-dns \
--version 0.10.0+vmware.1-tkg.1 \
--values-file external-dns-data-values.yaml \
--namespace my-packages
Das ExternalDNS-Paket wird mit dem neuen Wert oder den von Ihnen hinzugefügten Werten abgeglichen. Es kann bis zu fünf Minuten dauern, bis kapp-controller
die Änderungen übernommen hat.
Weitere Informationen zum Befehl tanzu package installed update
finden Sie unter Aktualisieren eines Pakets in Installieren und Verwalten von Paketen. Sie können diesen Befehl verwenden, um die Version oder die Konfiguration eines installierten Pakets zu aktualisieren.