Kubernetes CoreDNS Sorun Giderme

Kubernetes ortaminda control plane uzerinde yasayan bircok pod ve servis sahibi oldugu yetkinliklerine gore aslinda bulundugu sunucuya bagimlidir.

Bu bagimliliga ornek verecek olursak bir calico podu network uzerinde node uzerinde bircok noktaya mudahale edebiliyor, ancak bu ozelligini SECCOMP uzerinden kapatirsak calico podlarimiz calismayabilir.

SECCOMP : Konteynir dedigimiz arkadaslarimizin kendi bulundugu ilgili IPC namespace uzerinden bulundugu sunucuda yapabilecegi syscallari kisitlamamizi saglayan bir Linux kernelde bulunan bir ozelliktir.

Yukarida sadece bu bagimliligi anlatmak icin bir ornek vermek istedim, bizim bu yazida inceleyecegimiz ana problem COREDNS ozelinde ve ornegimizden tamamen bagimsizdir .

Kubernetes ozelinde DNS

Ilk olarak bildigim ve uyguladigim kadariyla kubernetes uzerinde bir podun cluster disinda bir dns sorgusu attiginda nasil bir sorgu yapitigindan bahsedecegim.

Ilk olarak her DNS sorgulamak istediklerinde /etc/hosts dosyasinin altina bakar akabinde eger DNS /etc/hosts altinda bulamadigi zaman ise upstream bir dns sorgusunu kubernetes cored-dns’e yonlendiriyor .

Buradaki dns servisimiz eger ki cluster disi ise ve kaydi core-dns tarafinda cozulemez ise core-dns’in forward` ozelligi devreye girer

Yani ;

kubectl get configmap coredns -n kube-system -o yaml

Bu komut ciktisinda CoreFile kisminda karisimiza cikiyor ve forward ile /etc/resolv.conf altina route etmektedir . Loop plugin sayesinde bulundugu sunucu uzerindeki resolv.conf altindaki nameserver’a forward ediyor .

Corefile: |
.:53 {
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
forward . /etc/resolv.conf
loop
}

Yani biz bir debian reposuna ya da external dns kaydina ulasmak istersek bu sekilde node uzerinden cikabiliyoruz.

CoreDNS ozelinde /etc/resolv.conf altinda bir local adresin yazmasi durumunda ise loop plugin sonsuz bir donguye giderek surekli kendisine bu dns sorgusunu yonlendirmekte.

Peki ya sorun neydi?

Sorunun ta kendisi benim coredns ‘i uzerinde konumlandirmis oldugum worker ile alakaliydi . Worker uzerinde bulunan /etc/resolv.conf ‘taki upstream dns server olarak 127.0.0.53`u barindiriyordu ki bu nedenle coredns podlarimi infinite loop’a girmekteydi.

Bu durumu cozebilmek icin sunucudaki /etc/resolv.conf`daki nameserver adresini degistirmemiz gerekiyordu .

Bunun icin iki yol var birincisi resolv.conf dosyasini geri dondurmemiz gerekiyor, resolvconf paketini silip tekrar yuklemek veya /run/resolvconf/resolv.conf dosyasini var olan /etc/resolv.conf`a icerik olarak guncellemek gerekiyor .

Benim kullandigim sunucuda ilk olarak 127.0.0.53 olarak belirtilen upstream dns server /run/resolvconf/resolv.conf altinda 172.’li bir internal dns adresi olarak belirtilmistir.

Yani, /etc/resolv.conf ile /run/resolvconf/resolv.conf arasinda bir link olmasi gerekiyor bu link olmasi gereken dosya ile degilse resolvconf ile veya link tekrardan yapilandirilmasi ile cozulebilir.

Kaynakca

PythonRubyLinux(❤)