Перейти к основному содержимому
Настроить NodeLocal DNS Cache
Последнее изменение:

Настроить NodeLocal DNS Cache

Чтобы снизить нагрузку на DNS в кластере Managed Kubernetes и ускорить получение ответа от внешних и внутренних ресурсов, вы можете использовать NodeLocal DNS Cache.

NodeLocal DNS Cache — это механизм кеширования DNS-запросов, который работает на всех нодах Managed Kubernetes и предоставляет локальный кэш для резолвера DNS. Когда поды пользователя отправляют запросы, они сначала проходят через локальный кэш DNS. Если эти запросы совпадают с ранее сохраненными записями, то удается избежать дополнительных запросов к внешнему DNS-серверу. Это позволяет сократить время обработки DNS-запросов и сэкономить сетевой трафик в кластере.

Подробнее о NodeLocal DNS Cache в документации Kubernetes.

  1. Настройте NodeLocal DNS Cache.
  2. Проверьте работу NodeLocal DNS Cache.

Настроить NodeLocal DNS Cache

  1. Создайте 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
  2. Примените манифест:

    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

  1. Включите режим логирования для подов NodeLocal DNS. В манифесте nodelocaldns.yaml, в объект ConfigMap добавьте строку log:

    data:
    Corefile: |
    cluster.local:53 {
    log
    errors
    cache {
    success 9984 30
    denial 9984 5
    }
  2. Примените манифест:

    kubectl apply -f nodelocaldns.yaml
  3. Запустите под с утилитами для проверки DNS:

    kubectl apply -f https://k8s.io/examples/admin/dns/dnsutils.yaml

    В ответе появится подтверждение, что под создан:

    pod/dnsutils created
  4. Убедитесь, что под в статусе Running:

    kubectl get pods dnsutils
  5. Подключитесь к поду:

    kubectl exec -i -t dnsutils -- bash
  6. Выполните тестовый запрос о домене к 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
  7. Проверьте логи:

    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