k8s與dns--coredns的一些實戰經驗


coredns簡介

安裝新版本k8s,coredns已經成為默認dns了。之前是kube-dns。coredns是一個靈活,可擴展的DNS服務器,可以作為Kubernetes集群DNS。與Kubernetes一樣,CoreDNS項目由CNCF主持。但是在實際使用中,需要一些注意的地方。

增加應用的反親和性,防止coredns調度到一台主機上

coredns 所需要的資源非常小,所以很容易調度到一台主機上。coredns是一個系統組件,我們應該盡量讓coredns分散部署,增強其可用性。故在deployment的yaml中增加如下設置:

      affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - coredns topologyKey: kubernetes.io/hostname

這里利用到了k8s的一個屬性反親和性。

選擇合理的coredns 伸縮

很多k8s部署,默認是部署兩個coredns 實例,但是當我們集群逐步變大的時候,2個實例是不能滿足需求的。因而coredns的伸縮就非常重要了。切記coredns 千萬不要用hpa來彈性伸縮coredns。頻繁的伸縮,會導致業務很多dns解析失敗的情況。需要用cluster-proportional-autoscaler組件,我一般是選擇根據node節點數來伸縮dns。具體的伸縮策略大家可以選擇。

如何利用coredns 禁用ipv6的解析

如果K8S集群宿主機沒有關閉IPV6內核模塊的話,容器請求coredns時的默認行為是同時發起IPV4和IPV6解析。
由於我們通常只使用IPV4地址,或者是你對主機環境暫無支持ipv6,那么實際的業務場景中,AAAA解析成功返回來的IPv6地址,是會訪問失敗的。如下:

2019/09/06 18:12:37 [error] 37#0: *265 connect() to [2404:6800:4003:c03::5f]:443 failed (101: Network is unreachable), client: 100.125.198.131, server: , request: "POST /user/google/signin HTTP/1.1", host: "user.inner.xxx.com" 2019/09/06 18:12:37 [error] 37#0: *265 [lua] http_util.lua:49: http_get(): http request error, url = https://www.googleapis.com/oauth2/v1/userinfo?access_token=ya29.Glt7B5qqIHMVkyJNSmE32jGAo-hkEgIyK2CzMcO0ksrXcCZSMts4VcBoY-uNQmXdEhb8QJQAhVsv-5LxESalKNiD7rJrBgYJgfV-z81No9a_vwW59RgBEvYJMAAr; request headers = null ; request body = ; error = network is unreachable, client: 100.125.198.131, server: , request: "POST /user/google/signin HTTP/1.1", host: "user.inner.xxx.com"

所以此時如果我們僅僅在coredns中配置DOMAIN -> IPV4地址的解析的話,當coredns收到IPV6解析請求的時候就會因為本地找不到配置而foward到upstream DNS服務器解析,從而導致容器的DNS解析請求變慢。
coredns提供了一種plugin叫做template,經過配置后可以給所有的IPV6請求立即返回一個空結果的應答,避免請求forward到上游DNS。
而對於業務來說,ipv6解析不成功,會降級到ipv4的A解析。
template插件默認是在coredns啟用的,只需要在配置文件中添加如下配置即可:

template ANY AAAA { rcode NXDOMAIN }

coredns 配置stub domain和upstream nameserver

在實際場景中,我們經常會有自己的內部dns服務器,例如我們的Consul域服務器位於10.150.0.1,並且所有Consul名稱都具有后綴.consul.local。要在CoreDNS中配置它,集群管理員在CoreDNS ConfigMap中創建以下配置:

 
consul.local:53 { errors cache 30 forward . 10.150.0.1 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM