Решение проблемы Docker и DNS

Docker использует встроенный DNS-сервер, который позволяет контейнерам беспрепятственно общаться друг с другом по именам сервисов. Однако на практике достаточно часто контейнеры внезапно теряют связность.

Популярное решение поставить внешний DNS, у меня это были: образы defreitas/dns-proxy-server:4.0.0 или ghcr.io/thisisqasim/dns-proxy-server:3.33.0-snapshot, но на стабильность решения оказывало влияние версии ОС, версия Docker и другие факторы, что вызывало сложности в эксплуатации и отказы про обновлениях.

Поэтому я решил переехать на coredns-dockerdiscovery, но есть нюанс.

CoreDNS — это высокопроизводительный движок на Go, который достаточно неплохо кастомизируется и имеет большое количество плагинов.

coredns-dockerdiscovery отказался работать на docker 29.1.5, предложенное решение в issues40 также не заработало, потому пришлось немного исправить код и сделать свою сборку: spions/coredns-dockerdiscovery:0.0.6

Бонусом решение имеет встроенный мониторинг: https://grafana.com/grafana/dashboards/14981-coredns/

docker-compose.yml.j2
services:
  coredns:
    image: spions/coredns-dockerdiscovery:0.0.6
    hostname:  {{ item }}.{{ ansible_facts['nodename'] }}.loc
    container_name:  {{ item }}.{{ ansible_facts['nodename'] }}.loc
    restart: unless-stopped
    network_mode: bridge
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./Corefile:/Corefile
    healthcheck:
      test: ["CMD-SHELL", "nslookup coredns.{{ ansible_facts['nodename'] }}.loc 127.0.0.1 || exit 1"]
      interval: 30s
      timeout: 10s
      retries: 3
    ports:
      - {{ docker_daemon_options.bip | default('172.17.0.1/24', true) | regex_replace('^(.*)/.*$', '\\1') }}:53:53/tcp
      - {{ docker_daemon_options.bip | default('172.17.0.1/24', true) | regex_replace('^(.*)/.*$', '\\1') }}:53:53/udp
      - 9153:9153
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "1"
Corefile.j2
.:53 {
        docker {
            domain loc
        }
    log
    errors
    prometheus :9153
    forward . {{ '8.8.8.8' if (ansible_dns.nameservers | first) | ansible.utils.ipaddr('127.0.0.0/24') else (ansible_dns.nameservers | first) }} {
        max_fails 3
    }

    # Кэширование ответов для скорости
    cache 30
}

Потребление ресурсов изменилось с:

до:

Вы можете оставить комментарий ниже.

Оставить комментарий

Вы должны Войти, чтобы оставить комментарий.