Kubernetes DNS 簡要分析

Service

  • 創建普通service 會以my-svc.my-namespace.svc.cluster.local 的形式指派一個 DNS A 記錄,並解析到該service的Cluster IP。
  • 創建“Headless” Service(沒有Cluster IP)也會以 my-svc.my-namespace.svc.cluster.local 的形式被指派一個 DNS A 記錄,但是並不會解析到的Cluster IP,而是解析到一組被選中的pod 的IP,如果沒有backend則不做處理。
[root@kvm5-k8s-test1 ~]# kubectl get svc -n kube-system
NAME                   TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE
api-server             ClusterIP   172.18.23.244    <none>        8080/TCP                 47h

# DNS解析
[root@kvm5-k8s-test1 ~]# kubectl exec -it console-web-bcc786b9-4rmlw bash -n kube-system
root@console-web-bcc786b9-4rmlw:/cc/app# nslookup api-server.kube-system.svc.cluster.local
Server:		172.18.0.3
Address:	172.18.0.3#53

Name:	api-server.kube-system.svc.cluster.local
Address: 172.18.23.244

Pod

  • 創建Pod 會以 pod-ip-address.my-namespace.pod.cluster.local 這種形式被指派一個 DNS A 記錄。
# Pod
[root@kvm5-k8s-test1 ~]# kubectl get pod -n kube-system -o wide
NAME                                          READY   STATUS    RESTARTS   AGE     IP               NODE                  NOMINATED NODE
api-server-654999ff9-z4bbc                    1/1     Running   0          160m    172.19.3.75      kvm100-k8s-test5   <none>

# DNS解析
[root@kvm5-k8s-test1 ~]# kubectl exec -it console-web-bcc786b9-4rmlw bash -n kube-system
root@console-web-bcc786b9-4rmlw:/lain/app# nslookup 172-19-3-75.kube-system.pod.cluster.local
Server:		172.18.0.3
Address:	172.18.0.3#53

Name:	172-19-3-75.kube-system.pod.cluster.local
Address: 172.19.3.75

Pod內部的本地DNS配置

root@console-web-bcc786b9-4rmlw:/cc/app# cat /etc/resolv.conf
nameserver 172.18.0.3
search kube-system.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

Pod’s DNS 策略

  • “Default“: pod 繼承其運行的宿主機dns解析
  • “ClusterFirst“: 如果請求的地址與集羣的域名後綴不一致,則轉向宿主機的dns解析,相同則集羣內部解析。這個選項是k8s pod 的 默認選項
  • “ClusterFirstWithHostNet“: hostNetwork 宿主機網絡
  • “None“: 忽略k8s環境,用戶可以在spec中使用dnsConfig關鍵字配置dns設置

k8s集羣域名配置

  • kubelet配置
--cluster-dns=<dns-service-ip>
--cluster-domain=<default-local-domain>

K8S DNS 參考

CoreDNS

  1. 介紹
  • 插件化
  1. 配置
kubernetes [ZONES...] {
    resyncperiod DURATION
    endpoint URL [URL...]
    tls CERT KEY CACERT
    kubeconfig KUBECONFIG CONTEXT
    namespaces NAMESPACE...
    labels EXPRESSION
    pods POD-MODE
    endpoint_pod_names
    upstream [ADDRESS...]
    ttl TTL
    noendpoints
    transfer to ADDRESS...
    fallthrough [ZONES...]
    ignore empty_service
}
  • Corefile
    server 以什麼協議監聽在哪個端口(可以同時定義多個 server 監聽不同端口)
    server 負責哪個 zone 的權威(authoritative)DNS 解析
    server 將加載哪些插件
  1. 當前集羣配置在 kube-system->configmap->coredns 下
Corefile: |
    .:53 {
        errors
        health
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          pods insecure
          upstream /etc/resolv.conf
          fallthrough in-addr.arpa ip6.arpa
        }
        prometheus :9153
        proxy . /etc/resolv.conf
        cache 30
        loop
        reload
        loadbalance
    }
  • 上述配置解釋
    • errors:標準錯誤輸出
    • health:服務健康檢查
    • kubernetes:k8s 插件, 容器內部訪問以laincloud.test爲後綴的服務,由coredns 負責解析,其他則轉到下一個插件去解析
    • 暴露給 prometheus 監控指標
    • proxy: 任何沒有以laincloud.test爲後綴的服務由容器所在宿主機解析
    • reload: 修改配置文件自動重啓
    • loadbalance:負載均衡
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章