天天看點

《Kubernetes網絡權威指南》讀書筆記 | 通過域名通路服務

作者:熱愛程式設計的通信人

書籍來源:《Kubernetes網絡權威指南:基礎、原理與實踐》

一邊學習一邊整理讀書筆記,并與大家分享,侵權即删,謝謝支援!

附上彙總貼:《Kubernetes網絡權威指南》讀書筆記 | 彙總_COCOgsta的部落格-CSDN部落格

在一個Kubernetes叢集中,DNS服務是非必需的,是以無論是Kube-dns還是CoreDNS,通常以插件(add-on)的方式安裝,作為運作在叢集上的應用。

3.7.1DNS服務基本架構

Kubernetes DNS是用來解析Kubernetes叢集内的Pod和Service域名的,而且一般情況下隻供叢集内的容器使用,不給外人使用。

Kubernetes的DNS應用部署好後,會對外暴露一個服務,叢集内的容器通過通路該服務的Cluster IP+53端口獲得域名解析服務,而這個Service的ClusterIP一般情況下都是固定的。

當Kubernetes的DNS服務Cluster IP配置設定後,系統(一般是指安裝程式)會給Kubelet配置--cluster-dns=啟動參數,DNS服務的IP位址将在使用者容器啟動時傳遞,并寫入每個容器的/etc/resolv.conf檔案。DNS服務IP即上文提到的DNS Service的Cluster IP。

Kubelet的--cluster_domain=參數支援配置叢集域名字尾,預設是cluster.local。

打開Kubelet配置:

《Kubernetes網絡權威指南》讀書筆記 | 通過域名通路服務

3.7.2 域名解析基本原理

對于Service,Kubernetes DNS伺服器會生成三類DNS記錄,分别是A記錄、SRV記錄和CNAME記錄。

  1. A記錄

A記錄(A Record)是用于将域或子域指向某個IP位址的DNS記錄的最基本類型。記錄包括域名、解析它的IP位址和以秒為機關的TTL。

Kubernetes為“normal”和“headless”服務配置設定不同的A Record name。“headless”服務與“normal”服務的不同之處在于它們未配置設定Cluster IP且不執行負載均衡。

A記錄與普通Service和headless Service有差別。普通Service的A記錄的映射關系是:

《Kubernetes網絡權威指南》讀書筆記 | 通過域名通路服務

headless Service的A記錄的映射關系是:

《Kubernetes網絡權威指南》讀書筆記 | 通過域名通路服務
  1. SRV記錄

SRV記錄是通過描述某些服務協定和位址促進服務發現的。SRV記錄通常定義一個符号名稱和作為域名一部分的傳輸協定(如TCP),并定義給定服務的優先級、權重、端口和目标:

《Kubernetes網絡權威指南》讀書筆記 | 通過域名通路服務

優先級和權重通常用于建議指定使用某些伺服器。記錄中的最後兩個值定義了要連接配接的端口和主機名,以便與服務通信。

Kubernetes DNS的SRV記錄是按照一個約定俗成的規定實作了對服務端口的查詢:

《Kubernetes網絡權威指南》讀書筆記 | 通過域名通路服務
  1. CNAME記錄

CNAME記錄用于将域或子域指向另一個主機名。為此,CNAME使用現有的A記錄作為其值。相反,A記錄會解析為指定的IP位址。這是一種跨叢集服務發現方法。

3.7.3DNS使用

下面運作一個帶nslookup指令的busybox容器,說明Kubernetes域名解析的使用。

給出帶nslookup指令的busybox Pod示例yaml檔案:

《Kubernetes網絡權威指南》讀書筆記 | 通過域名通路服務

先來查詢Kubernetes預設的API Server服務Kubernetes的IP位址:

《Kubernetes網絡權威指南》讀書筆記 | 通過域名通路服務

如上所示,Kube-dns的IP位址是10.0.0.1,而API Server的Cluster IP位址是10.0.0.10。

在default namespace下又建立了一個名為whoami的服務,并做以下域名解析動作:

《Kubernetes網絡權威指南》讀書筆記 | 通過域名通路服務

如上所示,發起域名解析請求的busybox Pod和whoami服務均在default namespace下,是以以下所有域名都能被正确解析并且傳回相同的結果。

《Kubernetes網絡權威指南》讀書筆記 | 通過域名通路服務

檢視busybox Pod的DNS配置檔案,可以看到如下DNS Server的位址及搜尋的domain清單:

《Kubernetes網絡權威指南》讀書筆記 | 通過域名通路服務

其中,DNS Server的IP位址是10.0.0.1。options ndots:5的含義是當查詢的域名字元串内的點字元數量超過ndots(5)值時,則認為是完整域名,直接解析,否則Linux系統會自動嘗試用default.pod.cluster.local、default.svc.cluster.local或svc.cluster.local補齊域名字尾。

最後,運作DNS Pod可能需要特權,即配置Kubelet的參數:--allow-privileged=true。

  1. Kubernetes域名解析政策

Kubernetes域名解析政策對應到Pod配置中的dnsPolicy,有4種可選政策,分别是None、ClusterFirstWithHostNet、ClusterFirst和Default,其中:

  • None:從Kubernetes 1.9版本起引入的一個新選項值。它允許Pod忽略Kubernetes環境中的DNS設定。應使用dnsConfigPod規範中的字段提供所有DNS設定;
  • ClusterFirstWithHostNet:對于使用hostNetwork運作的Pod,使用者應該明确設定其DNS政策為ClusterFirstWithHostNet;
  • ClusterFirst:任何與配置的群集域字尾(例如cluster.local)不比對的DNS查詢(例如“www.kubernetes.io” )将轉發到從主控端上繼承的上遊域名伺服器。叢集管理者可以根據需要配置上遊DNS伺服器;
  • Default:Pod從主控端上繼承名稱解析配置。

3.7.4 調試DNS

如果nslookup指令由于某種原因失敗,則有幾種調試和排除故障的方案。若DNS失敗,通常會得到如下響應:

《Kubernetes網絡權威指南》讀書筆記 | 通過域名通路服務

如果出現此錯誤,則需要做的第一件事是檢查DNS配置是否正确。

檢視容器中的resolv.conf檔案:

《Kubernetes網絡權威指南》讀書筆記 | 通過域名通路服務

驗證是否正确設定了搜尋路徑和名稱伺服器:

《Kubernetes網絡權威指南》讀書筆記 | 通過域名通路服務

如果/etc/resolve.conf的所有條目都是正确的,則需要檢查kube-dns/coredns插件是否已啟用,或者檢查kubedns/coredns Pod是否正在運作。

如果Pod正在運作,則全局DNS服務可能存在問題。

《Kubernetes網絡權威指南》讀書筆記 | 通過域名通路服務

可能還需要檢查後端DNS Endpoint是否準備好:

《Kubernetes網絡權威指南》讀書筆記 | 通過域名通路服務