ACK預設使用CoreDNS作為DNS伺服器,本文介紹CoreDNS的常見外掛程式和各應用情境下配置說明。
前提條件
已建立ACK託管叢集或ACK Serverless叢集。具體操作,請參見建立Kubernetes託管版叢集、Container Service Serverless 版使用快速入門。
情境說明
本文樣本情境:使用ACK叢集提供的CoreDNS來做網域名稱解析,即使用dnsPolicy: ClusterFirst
策略。樣本配置如下:
apiVersion: v1
kind: Pod
metadata:
name: alpine
namespace: default
spec:
containers:
- image: alpine
command:
- sleep
- "10000"
imagePullPolicy: Always
name: alpine
dnsPolicy: ClusterFirst
關於dnsPolicy配置和情境說明,請參見DNS原理和配置說明。
CoreDNS的預設配置
在命名空間kube-system下,ACK叢集有一個CoreDNS配置項(有關如何查看配置項的具體步驟,請參見管理配置項)。CoreDNS會基於該配置項啟用和配置外掛程式。不同CoreDNS版本的配置項有略微差異,修改配置前請仔細閱讀CoreDNS官方文檔。以下是一個1.6.2版本CoreDNS預設採用的設定檔:
Corefile: |
.:53 {
errors
log
health {
lameduck 15s
}
ready
kubernetes {{.ClusterDomain}} in-addr.arpa ip6.arpa {
pods verified
fallthrough in-addr.arpa ip6.arpa
}
prometheus :9153
forward . /etc/resolv.conf {
prefer_udp
}
cache 30
loop
reload
loadbalance
}
設定檔中ClusterDomain
代指叢集建立過程中填寫的叢集本地區名,預設值為cluster.local
。
參數 | 描述 |
errors | 錯誤資訊到標準輸出。 |
health | CoreDNS自身健康狀態報表,預設監聽連接埠8080,一般用來做健全狀態檢查。您可以通過 |
ready | CoreDNS外掛程式狀態報表,預設監聽連接埠8181,一般用來做可讀性檢查。可以通過 |
kubernetes | CoreDNS Kubernetes外掛程式,提供叢集內服務解析能力。 |
prometheus | CoreDNS自身metrics資料介面。可以通過 |
forward(或proxy) | 將網域名稱查詢請求轉到預定義的DNS伺服器。預設配置中,當網域名稱不在Kubernetes域時,將請求轉寄到預定義的解析器(/etc/resolv.conf)中。預設使用宿主機的/etc/resolv.conf配置。 |
cache | DNS緩衝。 |
loop | 環路檢測,如果檢測到環路,則停止CoreDNS。 |
reload | 允許自動重新載入已更改的Corefile。編輯ConfigMap配置後,請等待兩分鐘以使更改生效。 |
loadbalance | 迴圈DNS負載平衡器,可以在答案中隨機A、AAAA、MX記錄的順序。 |
CoreDNS的擴充配置
針對以下不同情境,您可以擴充CoreDNS的配置:
情境一:開啟Log Service
如果需將CoreDNS每次網域名稱解析的日誌列印出來,您可以開啟Log外掛程式,在Corefile裡加上log。樣本配置如下:
Corefile: | .:53 { errors log health { lameduck 15s } ready kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } prometheus :9153 forward . /etc/resolv.conf { prefer_udp } cache 30 loop reload loadbalance }
情境二:特定網域名稱使用自訂DNS伺服器
如果example.com類型尾碼的網域名稱需要經過自建DNS伺服器(IP為10.10.0.10)進行解析的話,您可為網域名稱配置一個單獨的服務塊。樣本配置如下:
example.com:53 { errors cache 30 forward . 10.10.0.10 { prefer_udp } }
完整配置如下:
Corefile: | .:53 { errors health { lameduck 15s } ready kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } prometheus :9153 forward . /etc/resolv.conf { prefer_udp } cache 30 loop reload loadbalance } example.com:53 { errors cache 30 forward . 10.10.0.10 { prefer_udp } }
情境三:外部網域名稱完全使用自建DNS伺服器
如果您需要使用的自建DNS服務的網域名稱沒有統一的網域名稱尾碼,您可以選擇所有叢集外部網域名稱都使用自建DNS伺服器(此時需要您將自建的DNS服務不能解析的網域名稱轉寄到阿里雲DNS,禁止直接更改叢集ECS上的/etc/resolv.conf檔案)。例如,您自建的DNS伺服器IP為10.10.0.10和10.10.0.20,可以更改forward參數進行配置。樣本配置如下:
Corefile: | .:53 { errors health { lameduck 15s } ready kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } prometheus :9153 forward . 10.10.0.10 10.10.0.20 { prefer_udp } cache 30 loop reload loadbalance }
情境四:自訂Hosts
如果您需要為特定網域名稱指定hosts,如為www.example.com指定IP為127.0.0.1,可以使用Hosts外掛程式來配置。樣本配置如下:
Corefile: | .:53 { errors health { lameduck 15s } ready hosts { 127.0.0.1 www.example.com fallthrough } kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } prometheus :9153 forward . /etc/resolv.conf { prefer_udp } cache 30 loop reload loadbalance }
重要請配置fallthrough,否則會造成非定製Hosts網域名稱解析失敗。
情境五:叢集外部存取叢集內服務
如果您希望運行在叢集ECS上的進程能夠訪問到叢集內的服務,雖然可以通過將ECS的/etc/resolv.conf檔案內
nameserver
配置為叢集kube-dns的ClusterIP地址來達到目的,但不推薦您直接更改ECS的/etc/resolv.conf檔案的方式來達到任何目的。內網情境下,您可以將叢集內的服務通過內網SLB進行暴露,然後在雲解析PrivateZone控制台通過添加A記錄到該SLB的內網IP進行解析。
情境六:統一網域名稱訪問服務或是在叢集內對網域名稱做CNAME解析
您可以實現在公網、內網和叢集內部通過統一網域名稱foo.example.com訪問您的服務,原理如下:
叢集內的服務
foo.default.svc.cluster.local
通過公網SLB進行了暴露,且有網域名稱foo.example.com
解析到該公網SLB的IP。叢集內服務
foo.default.svc.cluster.local
通過內網SLB進行了暴露,且通過雲解析PrivateZone在VPC內網中將foo.example.com
解析到該內網SLB的IP。具體步驟,請參見上述情境四:自訂Hosts。在叢集內部,您可以通過Rewrite外掛程式將
foo.example.com
CNAME到foo.default.svc.cluster.local
。樣本配置如下:Corefile: | .:53 { errors health { lameduck 15s } ready rewrite stop { name exact foo.example.com foo.default.svc.cluster.local answer name foo.default.svc.cluster.local foo.example.com } kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } prometheus :9153 forward . /etc/resolv.conf { prefer_udp } cache 30 loop reload loadbalance }
情境七:禁止CoreDNS對IPv6類型的AAAA記錄查詢返回
當業務容器不需要AAAA記錄類型時,可以在CoreDNS中將AAAA記錄類型攔截,返回空(NODATA),以減少不必要的網路通訊。樣本配置如下:
Corefile: | .:53 { errors health { lameduck 15s } #新增以下一行Template外掛程式,其它資料請保持不變。 template IN AAAA . }
情境八:開啟ACK One多叢集服務功能
說明1.9.3及更高版本的CoreDNS支援ACK One多叢集服務功能,如果您的CoreDNS組件版本低於1.9.3,請升級CoreDNS後再開啟此功能。詳細資料,請參見CoreDNS自動升級和CoreDNS手動升級。
執行如下命令,變更CoreDNS配置項。
kubectl edit configmap/coredns -n kube-system
在
kubernetes
字樣上方增加一行multicluster clusterset.local
,表示開啟multicluster多叢集服務外掛程式功能,並將多叢集服務網域名稱尾碼設定為clusterset.local
。Corefile: | .:53 { # 此處省略其它內容。 # 增加以下一行。 multicluster clusterset.local kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } # 此處省略其它內容。 }
修改完成後,按Esc鍵,輸入:wq!並按Enter鍵,儲存修改後的設定檔並退出編輯模式。