Настроить NodeLocal DNS Cache в кластере Managed Kubernetes
Чтобы снизить нагрузку на DNS в кластере Managed Kubernetes и ускорить получение ответа от внешних и внутренних ресурсов, вы можете использовать NodeLocal DNS Cache.
NodeLocal DNS Cache — это механизм кэширования DNS-запросов, который работает на всех нодах Managed Kubernetes и предоставляет локальный кэш для резолвера DNS. Когда поды пользователя отправляют запросы, они сначала проходят через локальный кэш DNS. Если эти запросы совпадают с ранее сохраненными записями, то удается избежать дополнительных запросов к внешнему DNS-серверу. Это позволяет сократить время обработки DNS-запросов и сэкономить сетевой трафик в кластере.
Подробнее о NodeLocal DNS Cache в документации Kubernetes.
Настроить NodeLocal DNS Cache
-
Создайте yaml-файл
nodelocaldns.yamlс манифестом:Файл nodelocaldns.yaml
apiVersion: v1kind: ServiceAccountmetadata:name: node-local-dnsnamespace: kube-systemlabels:kubernetes.io/cluster-service: "true"addonmanager.kubernetes.io/mode: Reconcile---apiVersion: v1kind: Servicemetadata:name: kube-dns-upstreamnamespace: kube-systemlabels:k8s-app: kube-dnskubernetes.io/cluster-service: "true"addonmanager.kubernetes.io/mode: Reconcilekubernetes.io/name: "KubeDNSUpstream"spec:ports:- name: dnsport: 53protocol: UDPtargetPort: 53- name: dns-tcpport: 53protocol: TCPtargetPort: 53selector:k8s-app: kube-dns---apiVersion: v1kind: ConfigMapmetadata:name: node-local-dnsnamespace: kube-systemlabels:addonmanager.kubernetes.io/mode: Reconciledata:Corefile: |cluster.local:53 {errorscache {success 9984 30denial 9984 5}reloadloopbind 169.254.20.25 10.96.0.10forward . __PILLAR__CLUSTER__DNS__ {force_tcp}prometheus :9253health 169.254.20.25:8080}in-addr.arpa:53 {errorscache 30reloadloopbind 169.254.20.25 10.96.0.10forward . __PILLAR__CLUSTER__DNS__ {force_tcp}prometheus :9253}ip6.arpa:53 {errorscache 30reloadloopbind 169.254.20.25 10.96.0.10forward . __PILLAR__CLUSTER__DNS__ {force_tcp}prometheus :9253}.:53 {errorscache 30reloadloopbind 169.254.20.25 10.96.0.10forward . __PILLAR__UPSTREAM__SERVERS__prometheus :9253}---apiVersion: apps/v1kind: DaemonSetmetadata:name: node-local-dnsnamespace: kube-systemlabels:k8s-app: kube-dnskubernetes.io/cluster-service: "true"addonmanager.kubernetes.io/mode: Reconcilespec:updateStrategy:rollingUpdate:maxUnavailable: 10%selector:matchLabels:k8s-app: kube-dnstemplate:metadata:labels:k8s-app: kube-dnsannotations:prometheus.io/port: "9253"prometheus.io/scrape: "true"spec:priorityClassName: system-node-criticalserviceAccountName: node-local-dnshostNetwork: truednsPolicy: Default # Do not use cluster DNS.tolerations:- key: "CriticalAddonsOnly"operator: "Exists"- effect: "NoExecute"operator: "Exists"- effect: "NoSchedule"operator: "Exists"containers:- name: node-cacheimage: registry.k8s.io/dns/k8s-dns-node-cache:1.22.20resources:requests:cpu: 25mmemory: 5Miargs: [ "-localip", "169.254.20.25,10.96.0.10", "-conf", "/etc/Corefile", "-upstreamsvc", "kube-dns-upstream" ]securityContext:capabilities:add:- NET_ADMINports:- containerPort: 53name: dnsprotocol: UDP- containerPort: 53name: dns-tcpprotocol: TCP- containerPort: 9253name: metricsprotocol: TCPlivenessProbe:httpGet:host: 169.254.20.25path: /healthport: 8080initialDelaySeconds: 60timeoutSeconds: 5volumeMounts:- mountPath: /run/xtables.lockname: xtables-lockreadOnly: false- name: config-volumemountPath: /etc/coredns- name: kube-dns-configmountPath: /etc/kube-dnsvolumes:- name: xtables-lockhostPath:path: /run/xtables.locktype: FileOrCreate- name: kube-dns-configconfigMap:name: kube-dnsoptional: true- name: config-volumeconfigMap:name: node-local-dnsitems:- key: Corefilepath: Corefile.base -
Примените манифест:
kubectl create -f nodelocaldns.yamlВ ответе появится список созданных объектов:
serviceaccount/node-local-dns createdservice/kube-dns-upstream createdconfigmap/node-local-dns createddaemonset.apps/node-local-dns created
Проверить работу NodeLocal DNS Cache
-
Включите режим логирования для подов NodeLocal DNS. В манифесте
nodelocaldns.yaml, в объектConfigMapдобавьте строкуlog:data:Corefile: |cluster.local:53 {logerrorscache {success 9984 30denial 9984 5} -
Примените манифест:
kubectl apply -f nodelocaldns.yaml -
Запустите под с утилитами для проверки DNS:
kubectl apply -f https://k8s.io/examples/admin/dns/dnsutils.yamlВ ответе появится подтверждение, что под создан:
pod/dnsutils created -
Убедитесь, что под в статусе
Running:kubectl get pods dnsutils -
Подключитесь к поду:
kubectl exec -i -t dnsutils -- bash -
Выполните тестовый запрос о домене к DNS-серверу:
dig @169.254.20.25 selectel.ruОтвет покажет, что запрос успешно выполняется:
;; ANSWER SECTION:selectel.ru. 30 IN A 85.119.149.3;; Query time: 437 msec;; SERVER: 169.254.20.25#53(169.254.20.25);; WHEN: Wed Sep 20 15:43:46 UTC 2023;; MSG SIZE rcvd: 67 -
Проверьте логи:
kubectl logs --namespace=kube-system -l k8s-app=kube-dns -fВ ответе DNS-записи A и AAAA с кодом
NOERROR:[INFO] 10.10.71.3:45929 - 55864 "A IN ru-2.cloud.api.selcloud.ru.kube-system.svc.cluster.local. udp 85 false 1232" NOERROR qr,aa,rd,ra 212 3.975488442s[INFO] 10.10.71.3:36099 - 21119 "AAAA IN ru-2.cloud.api.selcloud.ru.kube-system.svc.cluster.local. udp 85 false 1232" NOERROR qr,aa,rd 74 3.976010334s