本主题介绍了如何将 ExternalDNS 部署到 Tanzu Kubernetes Grid 中的工作负载集群。
ExternalDNS 服务使用声明性 Kubernetes 本机接口将应用程序的 DNS 记录发布到 DNS 服务器。在 Tanzu Kubernetes Grid 中它打包为 CLI 管理的软件包。
对于在具有负载均衡的共享服务集群(AWS、Azure 和使用 NSX Advanced Load Balancer 的 vSphere)中部署 Harbor 的环境,可以使用 ExternalDNS 为 Harbor 服务发布 DNS 主机名。这提供了从其他集群访问 Harbor 的权限。有关详细信息,请参见 Harbor 注册表和 ExternalDNS。
kubectl
,如安装 Tanzu CLI 和其他工具以与 vSphere with Tanzu 主管配合使用或安装 Tanzu CLI 和其他工具以与独立管理集群配合使用中所述。tanzu login
命令登录到 Tanzu CLI。ExternalDNS 服务必须与它将导出 DNS 记录的服务部署到相同的集群中。
已对 AWS (Route 53)、Azure DNS 和 RFC2136 (BIND) 验证 ExternalDNS 软件包。提供的配置导出 LoadBalancer
类型的 Contour HTTPProxy 资源和 Kubernetes Services
的记录。
外部 DNS 社区以不同的稳定性级别与许多 DNS 提供程序保持集成。除非另有说明,VMware 不保证支持将 ExternalDNS 软件包与特定提供程序集成。
为 ExternalDNS 创建允许 ExternalDNS 更新 Route 53 的 IAM 策略。在 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),然后选择在上一步中创建的策略。
继续到向导的最后一页。记录访问密钥 ID (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"
}
将权限分配给服务主体:
检索资源组的 ID:
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 区域的 ID:
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
命令的详细信息,请参见安装和管理软件包中的更新软件包。您可以使用以下命令更新已安装软件包的版本或配置。