#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 на виртуальной машине, что, если я правильно понял, что вы также пытались сделать?