天天看點

Kubernetes之配置與自定義DNS服務介紹從節點繼承DNS配置配置存根域及上遊DNS伺服器對pod的影響

本文解釋如何為kubernetes叢集配置及自定義DNS服務。從kubernetes1.11版本開始,coreDNS插件被包含在GA發行版中,并且被kubeadm預設安裝。詳情:Configuring CoreDNS and Using CoreDNS for Service Discovery。除特别說明,本文讨論的是預設dns插件。

介紹

Kubernetes的DNS功能以插件形式提供,是自動啟動的系統内置服務。服務包含如下三個容器:

  • kubedns:監控Kubernetes

    master的service與endpoint變更,增删改DNS記錄,将相關資料儲存在記憶體中,為DNS查詢提供服務。

  • dnsmasq: 充當DNS緩存,提高性能。
  • sidecar:挂鬥容器,對dnsmasq與kubedns進行單點健康檢查。

DNS服務擁有靜态IP位址,将各節點kubeletr的–cluster-dns=設定成DNS服務的靜态IP位址,當kubelet建立容器時則将此位址傳遞給容器。Kubernetes的DNS服務基于skyDNS庫,支援forward lookups (A records)、service lookups (SRV records)、reverse IP address lookups (PTR records)。

從節點繼承DNS配置

當kubelet啟動容器時,除使用kubernetes内置的DNS服務,預設從節點繼承其DNS配置。此特性使kubernetes系統中的容器DNS行為高度依賴低層節點,建議關閉,設定kubelet–resolv-conf選項為使用者自定義配置檔案,而非系統預設/etc/resolve.conf,這樣容器繼承的DNS配置由使用者提供的配置檔案決定,而非節點,降低耦合度。

配置存根域及上遊DNS伺服器

叢集管理者可通過為kubernetes中DNS服務kube-system:kube-dns提供ConfigMap對象,設定自定義存根域及上遊DNS伺服器。以下示例為DNS服務配置一個存根域及兩個上遊DNS伺服器:

apiVersion: v1
kind: ConfigMap
metadata:
  name: kube-dns
  namespace: kube-system
data:
  stubDomains: |
    {"acme.local": ["1.2.3.4"]}
  upstreamNameservers: |
    ["8.8.8.8", "8.8.4.4"]
           

如果查詢請求的字首為”acme.local”則被直接轉發到1.2.3.4。下表列出不同域名字首與DNS伺服器對應關系:

Kubernetes之配置與自定義DNS服務介紹從節點繼承DNS配置配置存根域及上遊DNS伺服器對pod的影響

對pod的影響

如果pod Spec之dnsPolicy設定為”Default”或者”Node”,則使用者自定義存根伺服器與上遊伺服器對pod沒有影響。當值為”Default”時,pod之DNS配置完全從節點繼承。如果為Node,則取決于pod Spec中的dnsConfig配置。

當dnsPolicy設定為”ClusterFirst”時,pod的DNS配置分成沒無自定義存根域與上遊伺服器、有自定義存根域與上遊伺服器兩種情況。

無自定義存根域與上遊伺服器:如果查詢請求之域名字首與叢集預設域名比對,則使用kubernetes内置DNS服務,如果不比對則使用從節點繼承之DNS服務。

有自定義存根域與上遊伺服器,域名解析流程如下:

1、請求首先發送到kube-dns緩存層。

2、在緩存層,檢查請求的域名字首并将請求轉發到與之比對的DNS伺服器,流程如下:

  • 與叢集域名字首比對,如“.cluster.local”,則發往kube-dns。
  • 如與存根域比對,如“.acme.local”, 則發往比對的存根域伺服器。
  • 否則,發往上遊伺服器。
    Kubernetes之配置與自定義DNS服務介紹從節點繼承DNS配置配置存根域及上遊DNS伺服器對pod的影響
    ConfigMap選項
    Kubernetes之配置與自定義DNS服務介紹從節點繼承DNS配置配置存根域及上遊DNS伺服器對pod的影響

    配置CoreDNS

    從1.9版本開始,CoreDNS成為GA可選特性,将來可能會取代kube-dns成為預設叢集預設DNS解決方案,CoreDNS具備kube-dns所有功能并更強大。在CoreDNS插件内部通過一種Corefile檔案管理配置。可以直接将為kube-dns設定的ConfigMap直接指定給CoreDNS,CoreDNS自動将此ConfigMap轉換成Corefile。示例如下:

apiVersion: v1
data:
  federations: |
    {"foo" : "foo.feddomain.com"}
  stubDomains: |
    {"abc.com" : ["1.2.3.4"], "my.cluster.local" : ["2.3.4.5"]}
  upstreamNameservers: |
    ["8.8.8.8", "8.8.4.4"]
kind: ConfigMap
           

轉換結果:

.:53 {
        errors
        health
        kubernetes cluster.local  in-addr.arpa ip6.arpa {
           upstream  8.8.8.8 8.8.4.4
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
        }
        federation cluster.local {
           foo foo.feddomain.com
        }
        prometheus :9153
        proxy .  8.8.8.8 8.8.4.4
        cache 30
    }
    abc.com:53 {
        errors
        cache 30
        proxy . 1.2.3.4
    }
    my.cluster.local:53 {
        errors
        cache 30
        proxy . 2.3.4.5
    }
           

原文出處:csdn -> https://blog.csdn.net/dkfajsldfsdfsd/article/details/81218480

繼續閱讀