Жергілікті DNS-кэшті баптау
Кластердің әрбір торабында CoreDNS негізіндегі жергілікті кэштейтін DNS серверін баптауға болады. Мұндай схема NodeLocal DNS деп те аталады. Бұл бұрыннан бар қолданбаларды өзгертпей-ақ кластердегі DNS сервисінің тұрақтылығы мен өнімділігін арттыруға мүмкіндік береді.
Белгілі бір под DNS сұрауын бастайды делік.
-
Кэштейтін DNS серверлерін пайдаланбай, келесі жағдай орын алады:
- DNS сұрауы кластердің
kube-dnsсервисінің IP мекенжайына жіберіледі. - Бұл IP мекенжай
iptablesережелері көмегіменkube-proxyарқылыkube-dnsэндпоинтының IP мекенжайына түрлендіріледі. Бұл реттеiptablesқосылымдарды қадағалау үшінconntrackпайдаланады. kubedns-тен жауап алынған кезде кері процесс орындалады.
Егер DNS сұраулары негізінен UDP протоколы арқылы жіберілсе, онда
kube-dns-ке жоғары жүктеме (мысалы, қандай да бір қолданба DNS сұрауларын белсенді түрде жіберсе) мәселелерге әкелуі мүмкін:conntrackүшін жарыс күйі (racing condition). Нәтижесінде DNS сұрауларына жауап алу айтарлықтай (бірнеше есеге дейін) баяулайды.conntrackүшін қызметтік кестелердің толып кетуі. UDP үшін жазбалар олардан тек тайм-аут бойынша жойылады (әдепкі бойынша — 30 секунд). Кестелер толып кеткен кезде UDP арқылы жіберілген жаңа DNS сұраулары тасталып кетеді.
- DNS сұрауы кластердің
-
Кэштейтін DNS серверлерін пайдаланғанда келесі жағдай орын алады:
-
Подтар өздерімен бір торапта орналасқан жергілікті кэштейтін DNS серверіне жүгінеді.
Бұл мекенжайларды түрлендіруден (Dynamic NAT, DNAT),
iptablesпенconntrackпайдаланудан бас тартуға мүмкіндік береді. Жоғарыда сипатталған мәселелер жойылады. -
Кэштейтін DNS серверінің өзі
iptablesпенconntrackпайдалана отырып, бірақ TCP протоколы арқылыkube-dnsсервисіне жүгінеді.Бұл жағдайда
kube-dns-ке түсетін жүктеме азаяды, себебі оған DNS өз жұмысы үшін қажет кластердің барлық сервистері емес, DNS серверлерінің шектеулі саны ғана тікелей жүгінеді. Бұған қоса, TCP пайдаланылған кезде UDP пакеттерінің жоғалуына және тайм-ауттарға байланысты кідіріс (latency) азаяды.
-
Толығырақ Kubernetes ресми құжаттамасында.
-
Жасаңыз Kubernetes кластерін өзекті нұсқада, егер бұл әлі жасалмаған болса.
Кластер параметрлерін өз қалауыңыз бойынша таңдаңыз.
-
kubectlкөмегімен кластерге қосыла алатыныңызға көз жеткізіңіз.
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 серверін жазу үшін:
-
NodeLocal DNS үшін манифест файлын жасаңыз:
Бұл файл жоғарыда келтірілген конфигурацияны ескере отырып, Kubernetes ресми репозиторийіндегі манифест негізінде жасалған.
-
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
-
DNS-пен жұмыс істеуге арналған утилиталарды қамтитын подты жасаңыз:
kubectl apply -f https://k8s.io/examples/admin/dns/dnsutils.yaml -
Команданы орындап, подтың сәтті жасалғанына көз жеткізіңіз:
kubectl get pod dnsutilsКелесі ақпарат шығуы тиіс:
NAME READY STATUS RESTARTS AGEdnsutils 1/1 Running ... ... -
Осы подтың ішіндегі bash-сессияға қосылыңыз:
kubectl exec -it dnsutils -- bash -
DNS сұрауларының сәтті орындалатынын тексеріңіз:
DNS серверін көрсетпей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 -
dnsutilsподындағы bash-сессияны аяқтаңыз:exit
Жұмыс істеп тұрған кластер тарификацияланады және есептеу ресурстарын тұтынады. Егер жергілікті DNS-кэштің жұмысын тексеру үшін жасалған Kubernetes ресурстары енді қажет болмаса, оларды жойыңыз:
-
Жасалған подты және
nodelocaldns.yamlманифестінде сипатталған ресурстарды жойыңыз:Linux/macOSWindowskubectl delete -f https://k8s.io/examples/admin/dns/dnsutils.yamlkubectl -f nodelocaldns.yaml -
Тоқтатыңыз жасалған кластерді, оны кейінірек пайдалану үшін, немесе жойыңыз оны біржола.