Как запустить DNS-сервер (dnsmasq) в Kubernetes?

#kubernetes #dns #dnsmasq

Вопрос:

Я пытаюсь запустить DNS-сервер (Dnsmasq) в кластере Kubernetes. Кластер имеет только один узел. Все работает нормально, пока мне не понадобится перезапустить контейнер dnsmasq ( kubectl rollout restart daemonsets dnsmasq-daemonset ), чтобы применить изменения, внесенные в hosts карту конфигурации. Как я выяснил, это необходимо, так как Dnsmasq, который уже запущен, в противном случае не будет загружать изменения, внесенные в hosts карту конфигурации.

Как только контейнер перезапущен, он не может извлечь изображение dnsmasq, и это приводит к сбою. Это ожидаемое поведение, поскольку оно не может разрешить имя образа, поскольку другие dns-серверы не запущены, но мне интересно, как лучше всего это обойти или каковы рекомендации по запуску DNS-сервера в Kubernetes в целом. Это то, для чего используется CoreDNS, или какие есть другие альтернативы? Может быть, какое-нибудь решение с высокой доступностью?

карта конфигурации хостов:

 --- 
apiVersion: v1
kind: ConfigMap
metadata:
  name: dnsmasq-hosts
  namespace: core
data:
  hosts: |
    127.0.0.1       localhost

    10.x.x.x        example.com
    ...
 

Развертывание Dnsmasq:

 ---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: dnsmasq-daemonset
  namespace: core
spec:
  selector:
    matchLabels:
      app: dnsmasq-app
  template:
    metadata:
      labels:
        app: dnsmasq-app
      namespace: core
    spec:
      containers:
        - name: dnsmasq
          image: registry.gitlab.com/path/to/dnsmasqImage:tag
          imagePullPolicy: IfNotPresent
          resources:
            limits:
              cpu: "1"
              memory: "32Mi"
            requests:
              cpu: "150m"
              memory: "16Mi"
          ports:
            - name: dns
              containerPort: 53
              hostPort: 53
              protocol: UDP
          volumeMounts:
            - name: conf-dnsmasq
              mountPath: /etc/dnsmasq.conf
              subPath: dnsmasq.conf
              readOnly: true
            - name: dnsconf-dnsmasq
              mountPath: /etc/dnsmasq.d/dns.conf
              subPath: dns.conf
              readOnly: true
            - name: hosts-dnsmasq
              mountPath: /etc/dnsmasq.d/hosts
              subPath: hosts
              readOnly: true
      volumes:
        - name: conf-dnsmasq
          configMap:
            name: dnsmasq-conf
        - name: dnsconf-dnsmasq
          configMap: 
            name: dnsmasq-dnsconf
        - name: hosts-dnsmasq
          configMap:
            name: dnsmasq-hosts
      imagePullSecrets:
        - name: gitlab-registry-credentials
      nodeSelector:
        kubernetes.io/hostname: master
      restartPolicy: Always
 

Я пытался использовать imagePullPolicy: Never , но, похоже, все равно не получается.

Комментарии:

1. Kubernetes предоставляет собственную систему DNS , которую администратор кластера должен был установить при создании кластера. Вам не нужно устанавливать слой DNS поверх него.

2. привет @JohnyFailLab, комментарий Дэвида решает вашу проблему?

3. @DavidMaze Спасибо за отзыв. Вероятно, я не был достаточно ясен, но мне нужен DNS-сервер, который разрешает внешние запросы. Не запросы только внутри кластера. Из того, что я понимаю, система DNS в Kubernetes — kube-dns и core-dns используется в основном только для разрешения dns-запросов в кластере kubernetes. Хотя не уверен, что я прав. Мне нужно, чтобы все dns-запросы в моей локальной сети разрешались этим dns-сервером.

4. @JohnyFailLab, удалось ли вам заставить это работать с dnsmasq или другим DNS, таким как bind, поскольку я хочу попробовать точно то же самое, что не запускать DNS для моего кластера, а скорее запускать DNS-сервер поверх моего кластера, который будет использоваться в качестве DNS для некоторых доменов, которые не связаны, как я бы сделал, запустив dns на виртуальной машине, что, если я правильно понял, что вы также пытались сделать?