K8s. Добавление hosts в CoreDNS

Бывают такие ситуации, когда необходимо ip-адресу дать fqdn. Например, для обращения к ресурсам во внутренней сети. Или же, переопределить адрес у нужного ресурса, не меняя при этом dns-запись на сервере.

Если мы говорим про дистрибутивы линукса, то в таком случае мы добавляем необходимую запись в файл /etc/hosts. В случае с windows-системами, ситуация аналогичная (только путь немного другой).

В случаях с K8s-кластером, добавление записей в /etc/hosts не всего срабатывает корректно. А если в кластере несколько сотен узлов, то ситуация становится сложнее.

Для того, чтоб такие изменения применить в кластере достаточно исправить два ConfigMap для CoreDNS и NodeLocalDNS (если такой установлен).

Модификация CoreDNS

Чтоб это сделать, достаточно перейти в режим редактирования ресурса ConfigMap. Сделать это можно командой

  kubectl edit -n kube-system cm coredns

В нем мы можем отредактировать Corefile, добавив строки

  apiVersion: v1
  kind: ConfigMap
  metadata:
    name: coredns
    namespace: kube-system
    labels:
    addonmanager.kubernetes.io/mode: EnsureExists
  data:
    Corefile: |
      .:53 {
          errors
          health {
              lameduck 5s
          }
          ready
        
          # Добавляем блок hosts именно в это место
          hosts {
            123.123.123.123 our.new.site.ru
            fallthrough
          }
        
          kubernetes cluster.local in-addr.arpa ip6.arpa {
            pods insecure
            fallthrough in-addr.arpa ip6.arpa
          }
        
          prometheus :9153
          forward . /etc/resolv.conf {
            prefer_udp
            max_concurrent 1000
          }
          cache 30
          loop
          reload
          loadbalance
      }

И перезапускаем командой kubectl rollout restart deploy -n kube-system coredns.

Модификация NodeLocalDNS

Если же в кластере еще установлен NodeLocalDNS, также необходимо отредактировать и его ConfigMap. Открываем на рекдактирование его конфиг

  kubectl edit -n kube-system cm nodelocaldns

И по аналогии с CoreDNS добавляем блок hosts.

  apiVersion: v1
  kind: ConfigMap
  metadata:
    name: nodelocaldns
    namespace: kube-system
  data:
    Corefile: |
      # ... существующая конфигурация ...
      .:53 {
          errors
          cache 30
          reload
          loop
          bind 169.254.25.10
        
          # Добавить hosts плагин
          hosts {
            123.123.123.123 our.new.site.ru
            fallthrough
          }
        
          forward . __PILLAR__CLUSTER__DNS__
          prometheus :9253
      }

После чего, перезапускаем NodeLocalDns, но уже его DaemonSet kubectl rollout restart daemonset nodelocaldns -n kube-system.