最近公司的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
會監聽service和endpoint的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-robin
load 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問題的方法,看這裏