Вопрос или проблема
У меня настроен стек с external-dns -> etcd -> coredns через плагин etcd. A записи разрешаются правильно, но все записи CNAME возвращают только NOERROR и не имеют значения, хотя цель CNAME является A записью, существующей в том же etcd, как показано ниже:
Когда я проверил документацию по плагину etcd, там не упоминались записи CNAME, за исключением записей, указывающих на внешние имена. Ниже представлены Corefile и состояние etcd. Поддерживаются ли CNAME или я делаю что-то не так? Вся функциональность external-dns построена вокруг CNAME, поэтому я не могу представить, почему его разработчики поддержали coredns через etcd/skydns, если один из основных случаев использования не поддерживался…
.:53 {
errors
health {
lameduck 5s
}
ready
prometheus 0.0.0.0:9153
log
etcd example.com {
stubzones
path /skydns
endpoint http://external-dns-etcd.external-dns-system.svc.cluster.local:2379
credentials root <пароль скрыт>
upstream
}
forward . /etc/resolv.conf
cache 30
loop
reload
loadbalance
}
Данные в etcd, созданные external-dns
/skydns/com/example/a-example2/00e24061
{"text":"\"heritage=external-dns,external-dns/owner=default,external-dns/resource=crd/external-dns-
system/example\"","targetstrip":1}
/skydns/com/example/a-example2/2c23e944
{"text":"\"heritage=external-dns,external-dns/owner=default,external-dns/resource=crd/external-dns-system/example\"","targetstrip":1}
/skydns/com/example/a-traefik/1d8b7880
{"text":"\"heritage=external-dns,external-dns/owner=default,external-dns/resource=service/traefik-system/traefik\"","targetstrip":1}
/skydns/com/example/a-traefik/664f46bc
{"text":"\"heritage=external-dns,external-dns/owner=default,external-dns/resource=service/traefik-system/traefik\"","targetstrip":1}
/skydns/com/example/cname-example1/2f6d448d
{"text":"\"heritage=external-dns,external-dns/owner=default,external-dns/resource=crd/external-dns-system/example\"","targetstrip":1}
/skydns/com/example/cname-oauth/0108beb1
{"text":"\"heritage=external-dns,external-dns/owner=default,external-dns/resource=ingressroute/traefik-system/traefik-oauth2-proxy\"","targetstrip":1}
/skydns/com/example/cname-oauth/1c1d4220
{"text":"\"heritage=external-dns,external-dns/owner=default,external-dns/resource=ingressroute/traefik-system/traefik-oauth2-proxy\"","targetstrip":1}
/skydns/com/example/cname-oauth/583611e5
{"text":"\"heritage=external-dns,external-dns/owner=default,external-dns/resource=ingressroute/traefik-system/traefik-oauth2-proxy\"","targetstrip":1}
/skydns/com/example/example1/270896aa
{"host":"example2.example.com","text":"\"heritage=external-dns,external-dns/owner=default,external-dns/resource=crd/external-dns-system/example\"","ttl":1,"targetstrip":1}
/skydns/com/example/example2/1ba35cde
{"host":"1.1.1.1","text":"\"heritage=external-dns,external-dns/owner=default,external-dns/resource=crd/external-dns-system/example\"","ttl":1,"targetstrip":1}
/skydns/com/example/oauth/6dec8b0b
{"host":"traefik.example.com","text":"\"heritage=external-dns,external-dns/owner=default,external-dns/resource=ingressroute/traefik-system/traefik-oauth2-proxy\"","ttl":1,"targetstrip":1}
/skydns/com/example/traefik/417b21b7
{"host":"10.1.2.128","text":"\"heritage=external-dns,external-dns/owner=default,external-dns/resource=service/traefik-system/traefik\"","targetstrip":1}
.
Ответ или решение
Проблема с разрешением CNAME записей в плагине CoreDNS для etcd
Вышеописанная проблема связана с тем, что плагин etcd для CoreDNS не возвращает значения для записей типа CNAME, несмотря на то, что соответствующие A записи присутствуют в etcd. Это может вызывать недоумение, особенно учитывая, что ваш стек построен с использованием external-dns, который в первую очередь предназначен для управления записями DNS, включая CNAME.
1. Поддержка CNAME в CoreDNS
Первым делом обратим внимание на документацию плагина etcd для CoreDNS. В ней упоминается, что плагин поддерживает только определенные виды записей, и CNAME не рассматриваются, за исключением случаев, когда они указывают на внешние имена. Это может создавать впечатление, что CNAME записи буквального не поддерживаются. Ваша конфигурация предполагает использование CNAME, ссылающегося на существующую A запись внутри etcd, что требует дополнительной проверки.
2. Как исправить ситуацию
Чтобы диагностировать и, возможно, решить проблему с CNAME, выполните следующие шаги:
-
Проверьте структуру данных в etcd: Убедитесь, что ваши записи CNAME корректно настроены и что у них есть соответствующие целевые A записи. Например, запись
cname-example1
должна ссылаться на существующую A запись, такую какa-example2
. -
Проверьте конфигурацию CoreDNS (Corefile): Попробуйте добавить параметр
cname
в конфигурацию etcd плагина. Это может помочь CoreDNS правильно обрабатывать CNAME записи. Например:etcd example.com { stubzones path /skydns endpoint http://external-dns-etcd.external-dns-system.svc.cluster.local:2379 credentials root <password redacted> cname upstream }
-
Проверьте, как external-dns создает записи: Убедитесь, что формат данных, генерируемых external-dns для CNAME записей, соответствует требованиям CoreDNS. Записи должны содержать все необходимые поля и соответствовать ожидаемой структуре.
3. Логгирование и мониторинг
Убедитесь, что у вас настроено логгирование в CoreDNS. Включите уровень логгирования debug
, чтобы получить больше информации о принимаемых запросах и соответствующих действиях. Это может помочь выявить, на каком этапе происходит сбой разрешения CNAME записей.
4. Обратитесь к сообществу или разработчикам
Если после всех проверок проблема остается неразрешимой, рекомендуется обратиться в сообщество или к разработчикам external-dns. Вы можете создать вопрос на таких платформах, как GitHub или Stack Overflow, где специалисты смогут предложить свои решения или подтвердить существующие ограничения.
Заключение
Проблема с отсутствием разрешения CNAME записей в плагине etcd для CoreDNS может быть вызвана рядом факторов, включая неправильные настройки, несовместимость с ожидаемой структурой данных или ограничения самого плагина. Тщательная проверка конфигурации, корректных записей в etcd и логирование – ключевые шаги для решения данной проблемы. Помните, что активное участие в сообществе также может дать дополнительные инсайты и рекомендации.