外部 DNS 允许您根据 Kubernetes 负载均衡服务动态配置 DNS 记录。可以为外部 DNS 部署 TKG 扩展,以便为集群提供动态服务发现。
扩展必备条件
- 置备 Tanzu Kubernetes 集群。请参见使用 TKGS v1alpha2 API 置备 Tanzu Kubernetes 集群的工作流。
- 连接到 Tanzu Kubernetes 集群。请参见以 vCenter Single Sign-On 用户身份连接到 Tanzu Kubernetes 集群。
- 下载 TKG 扩展 v1.3.1 包到运行 kubectl 的客户端主机上。
- 在目标 Tanzu Kubernetes 上安装 TKG 扩展必备条件。
其他要求
随外部 DNS 扩展提供的示例配置包含带有和不带有 Contour Ingress 控制器的示例。如果要使用 Contour,请先进行安装,然后再安装外部 DNS 扩展。请参见部署和管理用于 Contour Ingress 的 TKG 扩展。
外部 DNS 扩展支持动态服务发现。一个常见用例是使用 Harbor 注册表。Harbor 需要在符合 RFC 2136 的动态 DNS 提供程序(如 AWS Route53、Azure DNS、Google Cloud DNS)或本地 DNS 服务器(如 BIND)上设置 DNS 区域。请参见部署和管理用于 Harbor 注册表的 TKG 扩展。
部署外部 DNS 扩展
完成以下步骤,安装用于外部 DNS 的 TKG 扩展 v1.3.1。
- 将目录更改为外部 DNS 扩展文件的下载位置。
cd /tkg-extensions-v1.3.1+vmware.1/extensions/service-discovery/external-dns
- 创建命名空间和多个基于角色的访问控制对象,以与外部 DNS 扩展配合使用。
kubectl apply -f namespace-role.yaml
此命令将创建命名空间
tanzu-system-service-discovery
和关联的 RBAC 对象。运行kubect get ns
进行验证。 - 创建数据值文件。示例数据值文件提供了所需的最低配置。
系统提供了 AWS、Azure 和符合 RFC 2136 的动态 DNS 提供程序对应的包含和不包含 Contour 输入的示例数据值文件。请选择并复制相应的示例文件。
例如,如果要将 AWS Route 53 与 Contour 结合使用,请运行以下命令。cp external-dns-data-values-aws-with-contour.yaml.example external-dns-data-values-aws-with-contour.yaml
或者,如果要将 Azure 与 Contour 结合使用,请运行以下命令。cp external-dns-data-values-azure-with-contour.yaml.example external-dns-data-values-azure-with-contour.yaml
- 配置外部 DNS 数据值。
例如,下面是 Azure DNS 的配置。您需要提供
domain-filter
和azure-resource-group
值。#@data/values #@overlay/match-child-defaults missing_ok=True --- externalDns: image: repository: projects.registry.vmware.com/tkg deployment: #@overlay/replace args: - --provider=azure - --source=service - --source=ingress - --domain-filter=my-zone.example.org #! zone where services are deployed - --azure-resource-group=my-resource-group #! Azure resource group #@overlay/replace volumeMounts: - name: azure-config-file mountPath: /etc/kubernetes readOnly: true #@overlay/replace volumes: - name: azure-config-file secret: secretName: azure-config-file
- 使用您填充的数据值文件创建通用密钥。
例如,以下命令使用 Azure DNS 数据值文件创建密钥。
kubectl create secret generic external-dns-data-values --from-file=values.yaml=external-dns-data-values-azure-with-contour.yaml -n tanzu-system-service-discovery
您应该会看到在
secret/external-dns-data-values created
命名空间中创建了tanzu-system-service-discovery
。可以使用命令kubectl get secrets -n tanzu-system-service-discovery
进行验证。 - 部署外部 DNS 扩展。
kubectl apply -f external-dns-extension.yaml
成功后,应该会看到
app.kappctrl.k14s.io/external-dns created
。 - 检查扩展部署的状态。
kubectl get app external-dns -n tanzu-system-service-discovery
成功部署外部 DNS 后,应用状态应从Reconciling
更改为Reconcile succeeded
。如果状态为Reconcile failed
,请参见对部署进行故障排除。 - 查看详细状态。
kubectl get app external-dns -n tanzu-system-service-discovery -o yaml
对部署进行故障排除
如果协调失败,请运行命令 kubectl get pods -A
以查看 pod 的状态。在正常情况下,您应该会看到 external-dns-XXXXX
pod 为 Running
。如果协调失败或者 pod 状态为 ImagePullBackOff
或 ImagecRashLoopBackOff
,这意味着无法从存储库中提取容器映像。检查数据值和扩展 YAML 文件中的存储库 URL,并确保它们准确无误。
name-XXXX
是运行
kubectl get pods -A
时可以看到的唯一 pod 名称:
kubectl logs pod/external-dns-XXXXX -c external-dns -n tanzu-system-service-discovery
更新外部 DNS 扩展
更新部署到 Tanzu Kubernetes 集群的外部 DNS 扩展。
- 从密钥获取 Contour 数据值。
kubectl get secret external-dns-data-values -n tanzu-system-service-discovery -o 'go-template={{ index .data "values.yaml" }}' | base64 -d > external-dns-data-values.yaml
- 更新
external-dns-data-values.yaml
中的外部 DNS 数据值。请参见配置外部 DNS 扩展。 - 更新 Contour 数据值密钥。
kubectl create secret generic external-dns-data-values --from-file=values.yaml=external-dns-data-values.yaml -n tanzu-system-service-discovery -o yaml --dry-run | kubectl replace -f-
将使用新数据值协调外部 DNS 扩展。注: 默认情况下,kapp-controller 将每 5 分钟同步一次应用程序。更新应在 5 分钟或更短的时间内生效。如果希望更新立即生效,请将external-dns-extension
中的syncPeriod
更改为更低的值,然后使用kubectl apply -f external-dns-extension
应用 Contour 扩展。 - 检查扩展的状态。
kubectl get app external-dns -n tanzu-system-service-disovery
更新该应用后,其状态应更改为
Reconcile Succeeded
。 - 查看详细状态并进行故障排除。
kubectl get app external-dns -n tanzu-system-service-disovery -o yaml
删除外部 DNS 扩展
从 Tanzu Kubernetes 集群中删除外部 DNS 扩展。
- 将目录更改为扩展文件的下载位置。
cd /tkg-extensions-v1.3.1+vmware.1/extensions/service-discovery/external-dns
- 删除外部 DNS 扩展。
kubectl delete -f external-dns-extension.yaml
- 验证是否已删除该扩展。
kubectl get app contour -n tanzu-system-ingress
预期结果:应用结果为
Not Found
。 - 删除命名空间。
只有在确认已完全删除 Contour 扩展和应用后,才能安全地删除命名空间和角色对象。
kubectl delete -f namespace-role.yaml
预期结果:删除部署了该扩展的命名空间以及基于角色的关联访问控制对象。
配置外部 DNS 扩展
可以使用自定义设置配置外部 DNS 扩展。
参数 | 描述 | 类型 | 默认 |
---|---|---|---|
externalDns.namespace | 将部署 external-dns 的命名空间 | string | tanzu-system-service-discovery |
externalDns.image.repository | 包含 external-dns 映像的存储库 | string | projects.registry.vmware.com/tkg |
externalDns.image.name | external-dns 的名称 | string | external-dns |
externalDns.image.tag | ExternalDNS 映像标记 | string | v0.7.4_vmware.1 |
externalDns.image.pullPolicy | ExternalDNS 映像提取策略 | string | IfNotPresent |
externalDns.deployment.annotations | external-dns 部署上的注释 | map<string,string> | {} |
externalDns.deployment.args | 通过命令行传递到 external-dns 的参数 | list<string> | [] (必填参数) |
externalDns.deployment.env | 要传递到 external-dns 的环境变量 | list<string> | [] |
externalDns.deployment.securityContext | external-dns 容器的安全上下文 | SecurityContext | {} |
externalDns.deployment.volumeMounts | external-dns 容器的卷挂载 | list<VolumeMount> | [] |
externalDns.deployment.volumes | external-dns pod 的卷 | list<Volume> | [] |