En este tema se explica cómo implementar ExternalDNS en un clúster de carga de trabajo en Tanzu Kubernetes Grid.
El servicio ExternalDNS publica registros de DNS para las aplicaciones en los servidores DNS mediante una interfaz declarativa nativa de Kubernetes. Se empaqueta como un paquete administrado por CLI en Tanzu Kubernetes Grid.
En entornos en los que Harbor se implementa en un clúster de servicios compartidos con equilibrio de carga (AWS, Azure y vSphere con NSX Advanced Load Balancer), ExternalDNS puede utilizarse para publicar un nombre de host DNS para el servicio de Harbor. Esto proporciona acceso a Harbor desde otros clústeres. Para obtener más información, consulte Registro de Harbor y ExternalDNS.
kubectl
.tanzu context use
.El servicio ExternalDNS debe implementarse en el mismo clúster que los servicios para los que exportará registros de DNS.
El paquete de ExternalDNS se validó con AWS (ruta 53), DNS de Azure y RFC2136 (BIND). La configuración proporcionada a continuación exporta registros para los recursos de Contour HTTPProxy y Kubernetes Services
de tipo LoadBalancer
.
La comunidad de DNS externo mantiene las integraciones con muchos proveedores de DNS en distintos niveles de estabilidad. Excepto cuando se indique lo contrario, VMware no garantiza la compatibilidad con la integración del paquete ExternalDNS con proveedores específicos.
Cree una directiva de IAM para ExternalDNS que permita que ExternalDNS actualice la ruta 53. En la consola de AWS, vaya al panel de control de IAM y, en Administración de acceso, desplácese hasta la pantalla Directivas. Haga clic en Crear directiva y cambie a la pestaña JSON. Pegue la siguiente directiva. Si es necesario, puede ajustar la directiva para permitir actualizaciones en la zona alojada que acaba de crear. Finalice el asistente.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"route53:ChangeResourceRecordSets"
],
"Resource": [
"arn:aws:route53:::hostedzone/*"
]
},
{
"Effect": "Allow",
"Action": [
"route53:ListHostedZones",
"route53:ListResourceRecordSets"
],
"Resource": [
"*"
]
}
]
}
Cree un usuario de IAM para ExternalDNS con la directiva que creó anteriormente. En la consola de AWS, vaya a la pantalla Usuarios y haga clic en Agregar usuarios. Proporcione un nombre para el usuario de IAM y asegúrese de que Programar acceso esté habilitado. En la pantalla Permisos del asistente, haga clic en Asociar directivas existentes directamente y seleccione la directiva que creó en el paso anterior.
Continúe a la página final del asistente. Registre el identificador de clave de acceso y la clave de acceso secreta. Para que estas credenciales de la ruta 53 estén disponibles para ExternalDNS, cree un secreto de Kubernetes en el espacio de nombres donde se ejecutará ExternalDNS.
Establezca el contexto de kubectl
en el clúster en el que va a implementar ExternalDNS. Por ejemplo:
kubectl config use-context tkg-services-admin@tkg-services
Cree el secreto de 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
Donde YOUR-ACCESS-KEY-ID
y YOUR-SECRET-ACCESS-KEY
son las credenciales que registró anteriormente.
Cree un archivo de configuración para el paquete ExternalDNS recuperando la configuración predeterminada del paquete:
tanzu package available get external-dns.tanzu.vmware.com/PACKAGE-VERSION --default-values-file-output FILE-PATH
Donde PACKAGE-VERSION
es la versión del paquete de ExternalDNS que desea instalar y FILE-PATH
es la ubicación en la que desea guardar el archivo de configuración, por ejemplo, external-dns-data-values.yaml
.
Configure los siguientes ajustes en el archivo external-dns-data-values.yaml
. Este archivo configura el paquete 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: []
Reemplace los marcadores de posición del archivo external-dns-data-values.yaml
por los valores. Para obtener más opciones de configuración, consulte la documentación ExternalDNS.
Antes de establecer otras opciones de configuración en el archivo external-dns-data-values.yaml
, revise el esquema de valores del paquete ExternalDNS. Para recuperar el esquema de valores, ejecute:
tanzu package available get external-dns.tanzu.vmware.com/AVAILABLE-VERSION --values-schema
Donde AVAILABLE-VERSION
es la versión del paquete ExternalDNS. La marca --values-schema
recupera la sección valuesSchema
del recurso de API Package
para el paquete ExternalDNS. Puede establecer el formato de salida, --output
, para el esquema de valores en yaml
, json
o table
. Para obtener más información, consulte Paquetes en Instalar y administrar paquetes.
Solicite o cree una clave TSIG para el servidor. Esta clave debe estar autorizada para actualizar y transferir la zona que desea actualizar. La clave debe ser similar al siguiente mensaje:
key "externaldns-key" {
algorithm hmac-sha256;
secret "/2avn5M4ndEztbDqy66lfQ+PjRZta9UXLtToW6NV5nM=";
};
Si administra su propio servidor DNS, puede crear una clave TSIG mediante el comando tsig-keygen -a hmac-sha256 externaldns
. Copie los resultados en la configuración de los servidores DNS. Por ejemplo, para BIND, agregue la clave al archivo named.conf
y configure la zona con los campos allow-transfer
y update-policy
. Por ejemplo:
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;
};
};
En lo anterior, se supone que también tiene un archivo de zona similar al siguiente:
$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
Cree un archivo de configuración para el paquete ExternalDNS recuperando la configuración predeterminada del paquete:
tanzu package available get external-dns.tanzu.vmware.com/PACKAGE-VERSION --default-values-file-output FILE-PATH
Donde PACKAGE-VERSION
es la versión del paquete de ExternalDNS que desea instalar y FILE-PATH
es la ubicación en la que desea guardar el archivo de configuración, por ejemplo, external-dns-data-values.yaml
.
Configure los siguientes ajustes en el archivo external-dns-data-values.yaml
. Este archivo configura el paquete 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: []
Reemplace los marcadores de posición del archivo external-dns-data-values.yaml
por los valores. Para obtener más opciones de configuración, consulte la documentación ExternalDNS.
Antes de establecer otras opciones de configuración en el archivo external-dns-data-values.yaml
, revise el esquema de valores del paquete ExternalDNS. Para recuperar el esquema de valores, ejecute:
tanzu package available get external-dns.tanzu.vmware.com/AVAILABLE-VERSION --values-schema
Donde AVAILABLE-VERSION
es la versión del paquete ExternalDNS. La marca --values-schema
recupera la sección valuesSchema
del recurso de API Package
para el paquete ExternalDNS. Puede establecer el formato de salida, --output
, para el esquema de valores en yaml
, json
o table
. Para obtener más información, consulte Paquetes en Instalar y administrar paquetes.
Inicie sesión en la CLI az
:
az login
Establezca su suscripción:
az account set -s SUBSCRIPTION-ID-GUID
Cree una entidad de servicio:
az ad sp create-for-rbac -n SERVICE-PRINCIPAL-NAME
La salida JSON del comando tiene un aspecto similar al siguiente:
{
"appId": "a72a7cfd-7cb0-4b02-b130-03ee87e6ca89",
"displayName": "foo",
"name": "http://foo",
"password": "515c55da-f909-4e17-9f52-236ffe1d3033",
"tenant": "b35138ca-3ced-4b4a-14d6-cd83d9ea62f0"
}
Asigne permisos a la entidad de servicio:
Recupere el identificador del grupo de recursos:
az group show --name RESOURCE-GROUP --query id
Asigne la función de lector a la entidad de servicio para el ámbito del grupo de recursos. Necesitará el appId
del resultado del comando az ad sp create-for-rbac
anterior.
az role assignment create --role "Reader" --assignee APP-ID-GUID --scope RESOURCE-GROUP-RESOURCE-ID
Recupere el identificador de la zona de DNS:
az network dns zone show --name DNS-ZONE-NAME -g RESOURCE-GROUP-NAME --query id
Asigne la función de colaborador a la entidad de servicio para el ámbito de zona de DNS:
az role assignment create --role "Contributor" --assignee APP-ID-GUID --scope DNS-ZONE-RESOURCE-ID
Para conectar el servicio ExternalDNS al servicio DNS de Azure, cree un archivo de configuración denominado azure.json
en la máquina local con contenido similar al siguiente:
{
"tenantId": "01234abc-de56-ff78-abc1-234567890def",
"subscriptionId": "01234abc-de56-ff78-abc1-234567890def",
"resourceGroup": "MyDnsResourceGroup",
"aadClientId": "01234abc-de56-ff78-abc1-234567890def",
"aadClientSecret": "uKiuXeiwui4jo9quae9o"
}
Reemplace los valores del ejemplo anterior por sus propios valores de la siguiente manera:
tenantId
, puede ejecutar el comando az account show --query "tenantId"
.subscriptionId
, puede ejecutar el comando az account show --query "id"
.resourceGroup
es el nombre del grupo de recursos dentro del que se encuentra la zona de DNS.aadClientId
es el appId
del resultado de la entidad de servicio.aadClientSecret
es la contraseña del resultado de la entidad de servicio.Para que las credenciales de Azure estén disponibles para ExternalDNS, cree un secreto de Kubernetes en el espacio de nombres donde se ejecutará ExternalDNS:
Establezca el contexto de kubectl
en el clúster en el que va a implementar ExternalDNS. Por ejemplo:
kubectl config use-context tkg-services-admin@tkg-services
Cree el secreto mediante el archivo de configuración azure.json
del paso anterior:
kubectl -n tanzu-system-service-discovery create secret generic azure-config-file --from-file=azure.json
Cree un archivo de configuración para el paquete ExternalDNS recuperando la configuración predeterminada del paquete:
tanzu package available get external-dns.tanzu.vmware.com/PACKAGE-VERSION --default-values-file-output FILE-PATH
Donde PACKAGE-VERSION
es la versión del paquete de ExternalDNS que desea instalar y FILE-PATH
es la ubicación en la que desea guardar el archivo de configuración, por ejemplo, external-dns-data-values.yaml
.
Configure los siguientes ajustes en el archivo external-dns-data-values.yaml
. Este archivo configura el paquete 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
Reemplace los marcadores de posición del archivo external-dns-data-values.yaml
por los valores. Para obtener más opciones de configuración, consulte la documentación ExternalDNS.
Antes de establecer otras opciones de configuración en el archivo external-dns-data-values.yaml
, revise el esquema de valores del paquete ExternalDNS. Para recuperar el esquema de valores, ejecute:
tanzu package available get external-dns.tanzu.vmware.com/AVAILABLE-VERSION --values-schema
Donde AVAILABLE-VERSION
es la versión del paquete ExternalDNS. La marca --values-schema
recupera la sección valuesSchema
del recurso de API Package
para el paquete ExternalDNS. Puede establecer el formato de salida, --output
, para el esquema de valores en yaml
, json
o table
. Para obtener más información, consulte Paquetes en Instalar y administrar paquetes.
Establezca el contexto de kubectl
en el clúster en el que va a implementar ExternalDNS. Por ejemplo:
kubectl config use-context tkg-services-admin@tkg-services
Si el clúster no tiene un repositorio de paquetes con el paquete ExternalDNS instalado, como el repositorio tanzu-standard
, instale uno:
tanzu package repository add PACKAGE-REPO-NAME --url PACKAGE-REPO-ENDPOINT --namespace tkg-system
Donde:
PACKAGE-REPO-NAME
es el nombre del repositorio de paquetes, como tanzu-standard
o el nombre de un registro de imagen privado configurado con variables ADDITIONAL_IMAGE_REGISTRY
.PACKAGE-REPO-ENDPOINT
es la URL del repositorio de paquetes.
tanzu-standard
es projects.registry.vmware.com/tkg/packages/standard/repo:v2023.10.16
. Consulte Repositorios de paquetes de lista para obtener este valor de la CLI de Tanzu, o bien en Tanzu Mission Control, consulte la lista Complementos (Addons) > Repositorios (Repositories) en el panel Clúster (Cluster).Recupere el nombre del paquete ExternalDNS:
tanzu package available list -A
Recupere la versión del paquete ExternalDNS:
tanzu package available list external-dns.tanzu.vmware.com -A
Si el archivo external-dns-data-values.yaml
contiene comentarios, elimínelos antes de instalar el paquete:
yq -i eval '... comments=""' external-dns-data-values.yaml
Instale el paquete:
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
Donde:
TARGET-NAMESPACE
es el espacio de nombres en el que se desea instalar el paquete ExternalDNS. Por ejemplo, el espacio de nombres my-packages
o tanzu-cli-managed-packages
.
--namespace
, la CLI de Tanzu instala el paquete en el espacio de nombres default
. Los pods de ExternalDNS y cualquier otro recurso asociado con el componente ExternalDNS se crean en el espacio de nombres tanzu-system-service-discovery
; no instale el paquete de ExternalDNS en este espacio de nombres.kubectl create namespace my-packages
.AVAILABLE-PACKAGE-VERSION
es la versión que recuperó anteriormente.Por ejemplo:
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
Confirme que se haya instalado el paquete external-dns
:
tanzu package installed list -A
Para ver más detalles sobre el paquete, también puede ejecutar:
tanzu package installed get external-dns --namespace PACKAGE-NAMESPACE
Donde PACKAGE-NAMESPACE
es el espacio de nombres en el que está instalado el paquete external-dns
.
Confirme que la aplicación external-dns
se haya conciliado correctamente en su PACKAGE-NAMESPACE
:
kubectl get apps -A
Si el estado no es Reconcile Succeeded
, consulte los detalles del estado completo de la aplicación external-dns
. Ver el estado completo puede ayudarle a solucionar el problema.
kubectl get app external-dns --namespace PACKAGE-NAMESPACE -o yaml
Donde PACKAGE-NAMESPACE
es el espacio de nombres en el que se instaló el paquete. Si la solución de problemas no le ayuda a solucionar el problema, debe desinstalar el paquete antes de volver a instalarlo:
tanzu package installed delete external-dns --namespace PACKAGE-NAMESPACE
Confirme que los pods de ExternalDNS se estén ejecutando en el espacio de nombres tanzu-system-service-discovery
:
kubectl get pods -A
Si se configura con Contour, ExternalDNS observará automáticamente el espacio de nombres especificado para los recursos de HTTPProxy y creará registros de DNS para los servicios con nombres de host que coincidan con el filtro de dominio configurado.
ExternalDNS también buscará automáticamente los servicios de Kubernetes con la anotación external-dns.alpha.kubernetes.io/hostname
y creará registros de DNS para los servicios cuyas anotaciones coincidan con el filtro de dominio configurado.
Por ejemplo, para un servicio con la anotación external-dns.alpha.kubernetes.io/hostname: foo.k8s.example.org
, ExternalDNS creará un registro de DNS para foo.k8s.example.org
. Puede validar que el registro existe examinando la zona que creó.
Si necesita realizar cambios en la configuración del paquete de ExternalDNS después de la implementación, siga estos pasos para actualizar el paquete de ExternalDNS implementado.
Actualice la configuración de ExternalDNS en external-dns-data-values.yaml
.
Actualiza la configuración del paquete instalado:
tanzu package installed update external-dns \
--version INSTALLED-PACKAGE-VERSION \
--values-file external-dns-data-values.yaml \
--namespace INSTALLED-PACKAGE-NAMESPACE
Donde:
INSTALLED-PACKAGE-VERSION
es la versión del paquete ExternalDNS instalado.INSTALLED-PACKAGE-NAMESPACE
es el espacio de nombres en el que está instalado el paquete ExternalDNS.Por ejemplo:
tanzu package installed update external-dns \
--version 0.10.0+vmware.1-tkg.1 \
--values-file external-dns-data-values.yaml \
--namespace my-packages
El paquete de ExternalDNS se conciliará con el nuevo valor o los valores que agregó. kapp-controller
puede tardar hasta cinco minutos en aplicar los cambios.
Para obtener más información sobre el comando tanzu package installed update
, consulte Actualizar un paquete en Instalar y administrar paquetes. Puede usar este comando para actualizar la versión o la configuración de un paquete instalado.