kubernetes DNS

最近公司的k8s集羣中不時的會出現域名解析的問題,但排查問題的過程卻費了些時間,爲了以後的經驗積累,在這裏在梳理下用到的基本知識.

DNS: /etc/resolv.conf

有四個重要的元素:

  • nameserver //定義DNS服務器的IP地址,可以有多個,分行即可
  • domain //定義本地域名
  • search //定義域名的搜索列表,可以是多個,空格分隔即可
  • sortlist //對返回的域名進行排序

k8s DNS: k8s集羣中是如何處理DNS的

每個k8s集羣都會處理DNS的pod和service.

DNS name

k8s中的每個service都被assign了DNS name,這樣在搜索的時候就可以按照一下規則來處理:

  • 如果: service a和b都處於同一個namespace,那麼a就可以直接search b
  • 如果: service b處於另外一個namespace B,那麼a就需要通過b.B來search

一個正常的DNS record: my-svc.my-namespace.svc.cluster-domain.example這就是經常說的FQDN, full qualified domain name

k8s Pod DNS policy

k8s的pod可以有四種DNS policy,只需要指定dnsPolicy元素即可,但是常用也就兩種:

  • default: pod繼承DNS configuration from 它所運行在的node
  • ClusterFirst: 正如名字所說的,pod現在k8s cluster內部做DNS解析,如果找不到,再去從其他地方做查詢,比如它所運行的node,或是另外一個DNS server

kube-DNS

在k8s v1.11之前,k8s使用kube-dns來做DNS service:

  • 會有一個kube-dns的service和它的幾個pod
  • 這個kube-dns會監聽serviceendpoint的event(類似service discovery)來更新dns records.
  • kubectl將新建pod的/etc/resolv.conf的DNS server設置成DNS service的IP
  • 之後DNS就可以在cluster內部做DNS解析了

CoreDNS

但是自動k8s v1.11之後,默認的dns就從kube-dns換成了coredns,那麼爲什麼?
CodeDNS除了使用Go開發的,提供了所有kube-dns所提供的功能,並且還dns cache, health check等其他功能外,還在kube-dns的基礎上做了如下的優化:

  • 提供了round-robinload balance策略
  • 在解析100.1.1.1.namespace.svc.cluster.local如果100.1.1.1根本不存在,kube-dns依然會解析成100.1.1.1,這會帶來什麼麻煩;而coredns會多做一步verify,只有在它真正存在的時候,纔會resolve

CoreDNS plugin & configuration

CoreDNS是建立在衆多plugin的基礎上的,即基本所有的功能都是由plugin帶來的,這裏可以找到所有的plugin,這裏可以找到如何配置CoreDNS

舉一個CoreDNS的簡單例子

[ITPanda@panda001 ~]$ kubectl get configmap coredns -n kube-system -o yaml
apiVersion: v1
data:
  Corefile: |
    .:53 {    #port53是默認的DNS port,這個括號裏面的全都是plugins
        errors #Any errors encountered during the query processing will be printed to standard output. The errors of particular type can be consolidated and printed once per some period of time.
        health #When CoreDNS is up and running this returns a 200 OK HTTP status code
        kubernetes cluster.local {    #[plugin-kubernetes](https://github.com/coredns/coredns/tree/master/plugin/kubernetes)
          pods insecure
          upstream /etc/resolv.conf    #這個和下面的 proxy . /etc/resolv.conf配合,可以使用node上的DNS
        }
        prometheus :9153    #With prometheus you export metrics from CoreDNS and any plugin that has them. The default location for the metrics is localhost:9153
        proxy . /etc/resolv.conf
        cache 30
    }

最後,k8s官方介紹些如何trouble shooting k8s cluster DNS問題的方法,看這裏

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章