如何配置 external-dns 以创建 A 记录,而不是 CNAME

How do I configure external-dns to create A Record, not CNAME

我正在按照 Linode 的教程使用 helm 部署到 Linode Kubernetes Engine (LKE),我已经the section on configuring external DNS which uses bitnami's external-dns package 在 Linode 的 DNS 服务器上配置域。

当我尝试使用与视频中完全相同的命令来注释我的服务时,它会生成一个 CNAME 别名并且没有 A/TXT 条记录。

external-dns 的日志显示

time="2022-01-01T14:45:10Z" level=info msg="Creating record." action=Create record=juicy type=CNAME zoneID=1770931 zoneName=mydomain.com

time="2022-01-01T14:45:11Z" level=info msg="Creating record." action=Create > record=juicy type=TXT zoneID=1770931 zoneName=mydomain.com

time="2022-01-01T14:45:11Z" level=error msg="Failed to Create record: [400] [name] Record conflict - CNAMES must be unique" action=Create record=juicy type=TXT zoneID=1770931 zoneName=mydomain.com

这些日志暗示 external-dns 首先创建一个 CNAME 记录(根本不是 required/wanted),然后尝试创建一个 TXT 记录,该记录使用与新创建的 CNAME 相同的主机名,这显然是不允许的。而且它显然根本没有尝试创建 A 记录。

我非常感谢任何有关为什么会发生这种情况以及我可以做些什么来纠正它的信息。为清楚起见,所需结果是一个 A 记录和一个 TXT 记录,两者的主机名均为 'juicy'

你可以在route-53中创建A记录我不确定你在哪个云上。

在文档搜索中搜索 aws.preferCNAME 您可以在部署中看到需要配置更改的地方。

外部 DNS 也会创建 A 记录,请检查您的部署配置。

---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: external-dns
spec:
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: external-dns
    spec:
      containers:
      - name: external-dns
        image: registry.opensource.zalan.do/teapot/external-dns:v0.3.0-beta.0
        imagePullPolicy: Always
        args:
        - --domain-filter=$(DOMAIN_FILTER)
        - --source=service
        - --source=ingress
        - --provider=aws
        env:
        - name: DOMAIN_FILTER
          valueFrom:
            configMapKeyRef:
              name: external-dns
              key: domain-filter

有可能,--aws-prefer-cnameCNAME 配置一致,这使得外部 DNS 强制创建 CNAME 而不是一个记录。

删除 CNAME 配置并默认检查它会创建 A 记录。

这似乎是由于 external-dns 应用了一些逻辑 detects if the target is an Elastic Load Balancer.

创建 CNAME 别名后,external-dns 尝试创建具有相同主机名的 TXT 记录,但失败了,因为这是不允许的。为了解决这个问题,external-dns 提供了一个 --txt-prefix flag 允许您在 TXT 主机名前加上一个字符串,从而使其与新创建的 CNAME 记录不同。

可以说,external-dns 在这种情况下不需要从 A 记录切换到 CNAME,因为 Linode 的负载均衡器有 IP 地址,而不是域名。已提出问题 on GitHub

如果您正在学习 Linode 的优秀教程 and/or,那么您正在使用 helm 安装 external-dns,需要将 --txt-prefix 标志设置为安装:

helm install external-dns bitnami/external-dns \                                                                                                                               
  --namespace external-dns --create-namespace \
  --set provider=linode \
  --set linode.apiToken=$LINODE_API_TOKEN \
--set txtPrefix=your-prefix-string

(包含namespace 和其他值以匹配 Linode 教程) 然后可以按原样学习本教程的其余部分。