外部 DNS 允许您根据 Kubernetes 负载均衡服务动态配置 DNS 记录。可以为外部 DNS 部署 TKG 扩展,以便为集群提供动态服务发现。

扩展必备条件

在为外部 DNS 部署 TKG 扩展 v1.3.1 之前,请遵循以下要求。

其他要求

随外部 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。

  1. 将目录更改为外部 DNS 扩展文件的下载位置。
    cd /tkg-extensions-v1.3.1+vmware.1/extensions/service-discovery/external-dns
  2. 创建命名空间和多个基于角色的访问控制对象,以与外部 DNS 扩展配合使用。
    kubectl apply -f namespace-role.yaml

    此命令将创建命名空间 tanzu-system-service-discovery 和关联的 RBAC 对象。运行 kubect get ns 进行验证。

  3. 创建数据值文件。示例数据值文件提供了所需的最低配置。

    系统提供了 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
  4. 配置外部 DNS 数据值。

    例如,下面是 Azure DNS 的配置。您需要提供 domain-filterazure-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
  5. 使用您填充的数据值文件创建通用密钥。

    例如,以下命令使用 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 进行验证。

  6. 部署外部 DNS 扩展。
    kubectl apply -f external-dns-extension.yaml

    成功后,应该会看到 app.kappctrl.k14s.io/external-dns created

  7. 检查扩展部署的状态。
    kubectl get app external-dns -n tanzu-system-service-discovery
    成功部署外部 DNS 后,应用状态应从 Reconciling 更改为 Reconcile succeeded。如果状态为 Reconcile failed,请参见对部署进行故障排除
  8. 查看详细状态。
    kubectl get app external-dns -n tanzu-system-service-discovery -o yaml

对部署进行故障排除

如果协调失败,请运行命令 kubectl get pods -A 以查看 pod 的状态。在正常情况下,您应该会看到 external-dns-XXXXX pod 为 Running。如果协调失败或者 pod 状态为 ImagePullBackOffImagecRashLoopBackOff,这意味着无法从存储库中提取容器映像。检查数据值和扩展 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 扩展。

  1. 从密钥获取 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
  2. 更新 external-dns-data-values.yaml 中的外部 DNS 数据值。请参见配置外部 DNS 扩展
  3. 更新 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 扩展。
  4. 检查扩展的状态。
    kubectl get app external-dns -n tanzu-system-service-disovery

    更新该应用后,其状态应更改为 Reconcile Succeeded

  5. 查看详细状态并进行故障排除。
    kubectl get app external-dns -n tanzu-system-service-disovery -o yaml

删除外部 DNS 扩展

Tanzu Kubernetes 集群中删除外部 DNS 扩展。

注: 按顺序完成步骤。在删除扩展和应用之前,请不要删除目标命名空间和角色对象。删除命名空间和角色对象会删除kapp-controller使用的服务帐户。如果在删除应用和扩展之前删除了此服务帐户,可能会导致系统错误。
  1. 将目录更改为扩展文件的下载位置。
    cd /tkg-extensions-v1.3.1+vmware.1/extensions/service-discovery/external-dns
  2. 删除外部 DNS 扩展。
    kubectl delete -f external-dns-extension.yaml
  3. 验证是否已删除该扩展。
    kubectl get app contour -n tanzu-system-ingress

    预期结果:应用结果为 Not Found

  4. 删除命名空间。
    只有在确认已完全删除 Contour 扩展和应用后,才能安全地删除命名空间和角色对象。
    kubectl delete -f namespace-role.yaml
    预期结果:删除部署了该扩展的命名空间以及基于角色的关联访问控制对象。

配置外部 DNS 扩展

可以使用自定义设置配置外部 DNS 扩展。

配置外部 DNS 提供程序的部署参数。有关其他指导,请参阅 Kubernetes 站点 https://github.com/kubernetes-sigs/external-dns#running-externaldns
表 1. Harbor 扩展配置参数
参数 描述 类型 默认
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> []