VK Cloud logo

Жергілікті DNS-кэшті баптау

Кластердің әрбір торабында CoreDNS негізіндегі жергілікті кэштейтін DNS серверін баптауға болады. Мұндай схема NodeLocal DNS деп те аталады. Бұл бұрыннан бар қолданбаларды өзгертпей-ақ кластердегі DNS сервисінің тұрақтылығы мен өнімділігін арттыруға мүмкіндік береді.

Кластердегі DNS архитектурасына шолу

Белгілі бір под DNS сұрауын бастайды делік.

  • Кэштейтін DNS серверлерін пайдаланбай, келесі жағдай орын алады:

    1. DNS сұрауы кластердің kube-dns сервисінің IP мекенжайына жіберіледі.
    2. Бұл IP мекенжай iptables ережелері көмегімен kube-proxy арқылы kube-dns эндпоинтының IP мекенжайына түрлендіріледі. Бұл ретте iptables қосылымдарды қадағалау үшін conntrack пайдаланады.
    3. kubedns-тен жауап алынған кезде кері процесс орындалады.

    Егер DNS сұраулары негізінен UDP протоколы арқылы жіберілсе, онда kube-dns-ке жоғары жүктеме (мысалы, қандай да бір қолданба DNS сұрауларын белсенді түрде жіберсе) мәселелерге әкелуі мүмкін:

    • conntrack үшін жарыс күйі (racing condition). Нәтижесінде DNS сұрауларына жауап алу айтарлықтай (бірнеше есеге дейін) баяулайды.
    • conntrack үшін қызметтік кестелердің толып кетуі. UDP үшін жазбалар олардан тек тайм-аут бойынша жойылады (әдепкі бойынша — 30 секунд). Кестелер толып кеткен кезде UDP арқылы жіберілген жаңа DNS сұраулары тасталып кетеді.
  • Кэштейтін DNS серверлерін пайдаланғанда келесі жағдай орын алады:

    1. Подтар өздерімен бір торапта орналасқан жергілікті кэштейтін DNS серверіне жүгінеді.

      Бұл мекенжайларды түрлендіруден (Dynamic NAT, DNAT), iptables пен conntrack пайдаланудан бас тартуға мүмкіндік береді. Жоғарыда сипатталған мәселелер жойылады.

    2. Кэштейтін DNS серверінің өзі iptables пен conntrack пайдалана отырып, бірақ TCP протоколы арқылы kube-dns сервисіне жүгінеді.

      Бұл жағдайда kube-dns-ке түсетін жүктеме азаяды, себебі оған DNS өз жұмысы үшін қажет кластердің барлық сервистері емес, DNS серверлерінің шектеулі саны ғана тікелей жүгінеді. Бұған қоса, TCP пайдаланылған кезде UDP пакеттерінің жоғалуына және тайм-ауттарға байланысты кідіріс (latency) азаяды.

Толығырақ Kubernetes ресми құжаттамасында.

Дайындық қадамдары

  1. Жасаңыз Kubernetes кластерін өзекті нұсқада, егер бұл әлі жасалмаған болса.

    Кластер параметрлерін өз қалауыңыз бойынша таңдаңыз.

  2. kubectl көмегімен кластерге қосыла алатыныңызға көз жеткізіңіз.

1. Әрбір торапта кэштейтін DNS серверін жазыңыз

DNS сервері келесі конфигурацияда жазылады:

  • Жазу түрі: сервер кластердің барлық тораптарында қолжетімді болуы үшін DaemonSet.

  • Сервер тыңдайтын IP мекенжайлар:

    • Әрбір тораптағы 169.254.0.10 жергілікті IP мекенжайы. Бұл link-local мекенжай кластер пайдаланатын басқа ішкі желілердегі мекенжайлармен қиылыспау үшін арнайы таңдалған.
    • kube-dns сервисінің IP мекенжайы. Cloud Containers кластерлерінде бұл әрқашан 10.254.0.10.

    Мұндай конфигурация Cloud Containers кластерлерінде kube-proxy жұмыс істейтін iptables режиміне байланысты пайдаланылады.

  • Prometheus метрикаларды жинау үшін жүгінетін порт: 9153.

  • Сервисті таңдау белгісі: kube-dns: coredns.

  • Кластер домені: cluster.local.

Конфигурациялар мен баптау туралы толығырақ Kubernetes ресми құжаттамасында.

DNS серверін жазу үшін:

  1. NodeLocal DNS үшін манифест файлын жасаңыз:

    Бұл файл жоғарыда келтірілген конфигурацияны ескере отырып, Kubernetes ресми репозиторийіндегі манифест негізінде жасалған.

  2. NodeLocal DNS жұмысына қажетті Kubernetes ресурстарын манифест негізінде жасаңыз:

    kubectl apply -f nodelocaldns.yaml

    Жасалған ресурстар туралы келесі ақпарат шығуы тиіс:

    serviceaccount/node-local-dns createdservice/kube-dns-upstream createdconfigmap/node-local-dns createddaemonset.apps/node-local-dns createdservice/node-local-dns created

2. Кэштейтін DNS серверінің жұмысын тексеріңіз

  1. DNS-пен жұмыс істеуге арналған утилиталарды қамтитын подты жасаңыз:

    kubectl apply -f https://k8s.io/examples/admin/dns/dnsutils.yaml
  2. Команданы орындап, подтың сәтті жасалғанына көз жеткізіңіз:

    kubectl get pod dnsutils

    Келесі ақпарат шығуы тиіс:

    NAME       READY   STATUS    RESTARTS    AGEdnsutils   1/1     Running   ...         ...
  3. Осы подтың ішіндегі bash-сессияға қосылыңыз:

    kubectl exec -it dnsutils -- bash
  4. DNS сұрауларының сәтті орындалатынын тексеріңіз:

    nslookup cloud.vk.com && \nslookup kubernetes.default

    Мынаған ұқсас ақпарат шығуы тиіс:

    Server:         10.254.0.10Address:        10.254.0.10#53Non-authoritative answer:Name:   cloud.vk.comAddress: 95.163.254.194Name:   cloud.vk.comAddress: 95.163.254.192Name:   cloud.vk.comAddress: 95.163.254.193Server:         10.254.0.10Address:        10.254.0.10#53Name:   kubernetes.default.svc.cluster.localAddress: 10.254.0.1
  5. dnsutils подындағы bash-сессияны аяқтаңыз:

    exit

Пайдаланылмайтын ресурстарды жойыңыз

Жұмыс істеп тұрған кластер тарификацияланады және есептеу ресурстарын тұтынады. Егер жергілікті DNS-кэштің жұмысын тексеру үшін жасалған Kubernetes ресурстары енді қажет болмаса, оларды жойыңыз:

  1. Жасалған подты және nodelocaldns.yaml манифестінде сипатталған ресурстарды жойыңыз:

    kubectl delete -f https://k8s.io/examples/admin/dns/dnsutils.yamlkubectl  -f nodelocaldns.yaml
  2. Тоқтатыңыз жасалған кластерді, оны кейінірек пайдалану үшін, немесе жойыңыз оны біржола.