Настроить NodeLocal DNS Cache
Чтобы снизить нагрузку на 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: v1
kind: ServiceAccount
metadata:
name: node-local-dns
namespace: kube-system
labels:
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
---
apiVersion: v1
kind: Service
metadata:
name: kube-dns-upstream
namespace: kube-system
labels:
k8s-app: kube-dns
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
kubernetes.io/name: "KubeDNSUpstream"
spec:
ports:
- name: dns
port: 53
protocol: UDP
targetPort: 53
- name: dns-tcp
port: 53
protocol: TCP
targetPort: 53
selector:
k8s-app: kube-dns
---
apiVersion: v1
kind: ConfigMap
metadata:
name: node-local-dns
namespace: kube-system
labels:
addonmanager.kubernetes.io/mode: Reconcile
data:
Corefile: |
cluster.local:53 {
errors
cache {
success 9984 30
denial 9984 5
}
reload
loop
bind 169.254.20.25 10.96.0.10
forward . __PILLAR__CLUSTER__DNS__ {
force_tcp
}
prometheus :9253
health 169.254.20.25:8080
}
in-addr.arpa:53 {
errors
cache 30
reload
loop
bind 169.254.20.25 10.96.0.10
forward . __PILLAR__CLUSTER__DNS__ {
force_tcp
}
prometheus :9253
}
ip6.arpa:53 {
errors
cache 30
reload
loop
bind 169.254.20.25 10.96.0.10
forward . __PILLAR__CLUSTER__DNS__ {
force_tcp
}
prometheus :9253
}
.:53 {
errors
cache 30
reload
loop
bind 169.254.20.25 10.96.0.10
forward . __PILLAR__UPSTREAM__SERVERS__
prometheus :9253
}
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-local-dns
namespace: kube-system
labels:
k8s-app: kube-dns
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
spec:
updateStrategy:
rollingUpdate:
maxUnavailable: 10%
selector:
matchLabels:
k8s-app: kube-dns
template:
metadata:
labels:
k8s-app: kube-dns
annotations:
prometheus.io/port: "9253"
prometheus.io/scrape: "true"
spec:
priorityClassName: system-node-critical
serviceAccountName: node-local-dns
hostNetwork: true
dnsPolicy: Default # Do not use cluster DNS.
tolerations:
- key: "CriticalAddonsOnly"
operator: "Exists"
- effect: "NoExecute"
operator: "Exists"
- effect: "NoSchedule"
operator: "Exists"
containers:
- name: node-cache
image: registry.k8s.io/dns/k8s-dns-node-cache:1.22.20
resources:
requests:
cpu: 25m
memory: 5Mi
args: [ "-localip", "169.254.20.25,10.96.0.10", "-conf", "/etc/Corefile", "-upstreamsvc", "kube-dns-upstream" ]
securityContext:
capabilities:
add:
- NET_ADMIN
ports:
- containerPort: 53
name: dns
protocol: UDP
- containerPort: 53
name: dns-tcp
protocol: TCP
- containerPort: 9253
name: metrics
protocol: TCP
livenessProbe:
httpGet:
host: 169.254.20.25
path: /health
port: 8080
initialDelaySeconds: 60
timeoutSeconds: 5
volumeMounts:
- mountPath: /run/xtables.lock
name: xtables-lock
readOnly: false
- name: config-volume
mountPath: /etc/coredns
- name: kube-dns-config
mountPath: /etc/kube-dns
volumes:
- name: xtables-lock
hostPath:
path: /run/xtables.lock
type: FileOrCreate
- name: kube-dns-config
configMap:
name: kube-dns
optional: true
- name: config-volume
configMap:
name: node-local-dns
items:
- key: Corefile
path: Corefile.base -
Примените манифест:
kubectl create -f nodelocaldns.yaml
В ответе появится список созданных объектов:
serviceaccount/node-local-dns created
service/kube-dns-upstream created
configmap/node-local-dns created
daemonset.apps/node-local-dns created
Проверить работу NodeLocal DNS Cache
-
Включите режим логирования для подов NodeLocal DNS. В манифесте
nodelocaldns.yaml
, в объектConfigMap
добавьте строкуlog
:data:
Corefile: |
cluster.local:53 {
log
errors
cache {
success 9984 30
denial 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