DNS最佳實踐
DNS是Kubernetes集群中至關(guān)重要的基礎(chǔ)服務(wù)之一,在客戶端設(shè)置不合理、集群規(guī)模較大等情況下DNS容易出現(xiàn)解析超時、解析失敗等現(xiàn)象。本文介紹Kubernetes集群中DNS的最佳實踐,幫助您避免此類問題。
前提條件
本文目錄
DNS最佳實踐包含客戶端和服務(wù)端的內(nèi)容:
在客戶端,您可以通過優(yōu)化域名解析請求降低解析延遲,通過使用合適的容器鏡像、合適的節(jié)點操作系統(tǒng) 、節(jié)點DNS緩存NodeLocal DNSCache等方式來減少解析異常。
在CoreDNS服務(wù)端,您可以通過監(jiān)控CoreDNS運(yùn)行狀態(tài)識別DNS異常,快速定位異常根因,通過合理調(diào)整集群CoreDNS部署狀態(tài)來提升集群CoreDNS高可用和QPS吞吐量。
有關(guān)CoreDNS的更多信息,請參見CoreDNS官方文檔。
優(yōu)化域名解析請求
DNS域名解析請求是Kubernetes最高頻的網(wǎng)絡(luò)行為之一,其中很多請求是可以優(yōu)化和避免的。您可以通過以下方式優(yōu)化域名解析請求:
(推薦)使用連接池:當(dāng)一個容器應(yīng)用需要頻繁請求另一服務(wù)時,推薦使用連接池。連接池可以將請求上游服務(wù)的鏈接緩存在內(nèi)存中,避免每次訪問時域名解析和TCP建連的開銷。
使用DNS緩存:
(推薦)當(dāng)您的應(yīng)用無法改造成通過連接池連接另一服務(wù)時,可以考慮在應(yīng)用側(cè)緩存DNS解析結(jié)果,具體操作,請參見使用節(jié)點DNS緩存NodeLocal DNSCache。
如果NodeLocal DNSCache無法適用的,可以在容器內(nèi)置NSCD(Name Service Cache Daemon)緩存。關(guān)于如何使用NSCD緩存,請參見在Kubernetes集群中使用NSCD。
優(yōu)化resolv.conf文件:由于resolv.conf文件中ndots和search兩個參數(shù)的機(jī)制作用,容器內(nèi)配置域名的不同寫法決定了域名解析的效率,關(guān)于ndots和search兩個參數(shù)的機(jī)制詳情,請參見DNS策略配置和域名解析說明。
優(yōu)化域名配置:當(dāng)容器內(nèi)應(yīng)用需要訪問某域名時,該域名按以下原則配置,可以最大程度減少域名解析嘗試次數(shù),繼而減少域名解析耗時。
Pod訪問同命名空間的Service,優(yōu)先使用
<service-name>
訪問,其中service-name
代指Service名稱。Pod跨命名空間訪問Service,優(yōu)先使用
<service-name>.<namespace-name>
訪問,其中namespace-name
代指Service所處的命名空間。Pod訪問集群外部域名時,優(yōu)先使用FQDN類型域名訪問,這類域名通過常見域名最后加半角句號(.)的方式來指定地址,可以避免
search
搜索域拼接帶來的多次無效搜索,例如需要訪問www.aliyun.com,則優(yōu)先使用FQDN類型域名www.aliyun.com.來訪問。
使用合適的容器鏡像
Alpine容器鏡像內(nèi)置的musl libc庫與標(biāo)準(zhǔn)glibc的實現(xiàn)存在以下差異:
3.3及更早版本Alpine不支持search參數(shù),不支持搜索域,無法完成服務(wù)發(fā)現(xiàn)。
并發(fā)請求/etc/resolv.conf中配置的多個DNS服務(wù)器,導(dǎo)致NodeLocal DNSCache優(yōu)化失效。
并發(fā)使用同一Socket請求A和AAAA記錄,在舊版本內(nèi)核上觸發(fā)Conntrack源端口沖突導(dǎo)致丟包問題。
關(guān)于以上問題的更多信息,請參見musl libc。
當(dāng)Kubernetes集群中部署的容器采用了Alpine作為基礎(chǔ)鏡像時,可能會因為上述musl libc特性而無法正常解析域名,建議嘗試更換基礎(chǔ)鏡像,如Debian、CentOS等。
避免IPVS缺陷導(dǎo)致的DNS概率性解析超時問題
當(dāng)集群使用IPVS作為kube-proxy負(fù)載均衡模式時,您可能會在CoreDNS縮容或重啟時遇到DNS概率性解析超時的問題。該問題由社區(qū)Linux內(nèi)核缺陷導(dǎo)致,具體信息,請參見IPVS。
您可以通過以下任意方式降低IPVS缺陷的影響:
使用節(jié)點DNS緩存NodeLocal DNSCache,具體操作,請參見使用節(jié)點DNS緩存NodeLocal DNSCache。
修改kube-proxy中IPVS UDP會話保持的超時時間,具體操作,請參見如何修改kube-proxy中IPVS UDP會話保持的超時時間?。
使用節(jié)點DNS緩存NodeLocal DNSCache
在ACK集群中部署NodeLocal DNSCache可以提升服務(wù)發(fā)現(xiàn)的穩(wěn)定性和性能,NodeLocal DNSCache通過在集群節(jié)點上作為DaemonSet運(yùn)行DNS緩存代理來提高集群DNS性能。
關(guān)于更多NodeLocal DNSCache的介紹及如何在ACK集群中部署NodeLocal DNSCache的具體步驟,請參見使用NodeLocal DNSCache。
使用合適的CoreDNS版本
CoreDNS對Kubernetes版本實現(xiàn)了較好的向后兼容,建議您保持CoreDNS版本為較新的穩(wěn)定版本。ACK組件管理中心提供了CoreDNS的安裝、升級、配置能力,您可以關(guān)注組件管理中組件狀態(tài),若CoreDNS組件顯示可升級,請盡快選擇業(yè)務(wù)低峰期進(jìn)行升級。
關(guān)于升級的具體操作,請參見CoreDNS自動升級。
關(guān)于CoreDNS版本的發(fā)布記錄,請參見CoreDNS。
CoreDNS v1.7.0以下的版本存在風(fēng)險隱患,包括且不僅限于以下:
CoreDNS與APIServer連通性異常(例如APIServer重啟、APIServer遷移、網(wǎng)絡(luò)抖動)時,CoreDNS會因錯誤日志寫入失敗導(dǎo)致容器重啟。更多信息,請參見Set klog's logtostderr flag。
啟動CoreDNS時會占用額外內(nèi)存,默認(rèn)采用的Memory Limit在較大規(guī)模集群下可能觸發(fā)OOM(OutOfMemory)問題,嚴(yán)重時可能導(dǎo)致CoreDNS Pod反復(fù)重啟無法自動恢復(fù)。更多信息,請參見CoreDNS uses a lot memory during initialization phase。
CoreDNS存在若干可能影響Headless Service域名、集群外部域名解析的問題。更多信息,請參見plugin/kubernetes: handle tombstones in default processor和Data is not synced when CoreDNS reconnects to kubernetes api server after protracted disconnection。
在集群節(jié)點異常情況下,部分舊版本CoreDNS默認(rèn)采用的容忍策略,可能會導(dǎo)致CoreDNS Pod部署在異常節(jié)點上,且CoreDNS Pod無法被自動驅(qū)逐,繼而導(dǎo)致域名解析異常。
不同版本的Kubernetes集群,推薦的CoreDNS最低版本有所區(qū)別。如下表:
Kubernetes版本 | 推薦的最低CoreDNS版本 |
v1.14.8以下(停止維護(hù)) | v1.6.2 |
v1.14.8及以上,1.20.4以下 | v1.7.0.0-f59c03d-aliyun |
1.20.4及以上 | v1.8.4.1-3a376cc-aliyun |
Kubernetes 1.14.8以下的版本現(xiàn)已停止維護(hù),請盡快升級至更高版本后,升級CoreDNS。
監(jiān)控CoreDNS運(yùn)行狀態(tài)
監(jiān)控指標(biāo)
CoreDNS通過標(biāo)準(zhǔn)的Prometheus接口暴露出解析結(jié)果等健康指標(biāo),發(fā)現(xiàn)CoreDNS服務(wù)端甚至上游DNS服務(wù)器的異常。
阿里云Prometheus監(jiān)控默認(rèn)內(nèi)置了CoreDNS相關(guān)的指標(biāo)監(jiān)控和告警規(guī)則,您可以在容器服務(wù)管理控制臺開啟Prometheus及儀表盤功能。具體操作,請參見CoreDNS組件監(jiān)控。
若您是自建Prometheus監(jiān)控Kubernetes集群,可以在Prometheus觀測相關(guān)指標(biāo),并對重點指標(biāo)設(shè)置告警。具體操作,請參見CoreDNS Prometheus官方文檔。
運(yùn)行日志
在DNS異常發(fā)生的情況下,CoreDNS日志有助于您快速診斷異常根因。建議您開啟CoreDNS域名解析日志和其SLS日志采集,具體操作,請參見分析和監(jiān)控CoreDNS日志。
Kubernetes事件投遞
在v1.9.3.6-32932850-aliyun及以上版本的CoreDNS中,您可以開啟k8s_event插件以將CoreDNS關(guān)鍵日志以Kubernetes事件的形式投遞到事件中心。關(guān)于k8s_event插件,請參見k8s_event。
全新部署的CoreDNS會默認(rèn)開啟該功能。如果您是從低版本CoreDNS升級到v1.9.3.6-32932850-aliyun及以上版本的,您需要手動修改配置文件以開啟該功能。
執(zhí)行如下命令,打開CoreDNS配置文件。
kubectl -n kube-system edit configmap/coredns
新增kubeAPI和k8s_event插件。
apiVersion: v1 data: Corefile: | .:53 { errors health { lameduck 15s } // 新增開始(請忽略其他差異)。 kubeapi k8s_event { level info error warning // 將info、error、warning狀態(tài)關(guān)鍵日志投遞。 } // 新增結(jié)束。 kubernetes cluster.local in-addr.arpa ip6.arpa { pods verified fallthrough in-addr.arpa ip6.arpa } // 下方略。 }
檢查CoreDNS Pod運(yùn)行狀態(tài)和運(yùn)行日志,運(yùn)行日志中出現(xiàn)
reload
字樣后說明修改成功。
合理調(diào)整集群CoreDNS部署狀態(tài)
CoreDNS應(yīng)部署于您的Kubernetes集群中,默認(rèn)情況下與您的業(yè)務(wù)容器運(yùn)行在同樣的集群節(jié)點上,注意事項如下:
合理調(diào)整CoreDNS副本數(shù)
建議您在任何情況下設(shè)置CoreDNS副本數(shù)應(yīng)至少為2,且副本數(shù)維持在一個合適的水位以承載整個集群的解析。
CoreDNS所能提供的域名解析QPS與CPU消耗成正相關(guān),開啟緩存的情況下,單個CPU可以支撐10000+ QPS的域名解析請求。不同類型的業(yè)務(wù)對域名請求的QPS需求存在較大差異,您可以觀察每個CoreDNS副本的峰值CPU使用量,如果其在業(yè)務(wù)峰值期間占用CPU大于一核,建議您對CoreDNS進(jìn)行副本擴(kuò)容。無法確定峰值CPU使用量時,可以保守采用副本數(shù)和集群節(jié)點數(shù)1:8的比值來部署,即每擴(kuò)容8個集群節(jié)點,增加一個CoreDNS副本,但副本數(shù)不應(yīng)大于10。針對100節(jié)點以上的集群,推薦使用節(jié)點DNS緩存NodeLocal DNSCache。具體操作,請參見使用節(jié)點DNS緩存NodeLocal DNSCache。
當(dāng)集群節(jié)點數(shù)目長時間較為固定時,可以手動擴(kuò)容副本數(shù)。具體操作,請參見手動擴(kuò)容副本數(shù)。
如果集群節(jié)點數(shù)持續(xù)增長,可以設(shè)置自動擴(kuò)容副本數(shù)。具體操作,請參見自動擴(kuò)容副本數(shù)(cluster-autoscaler)。
UDP報文缺少重傳機(jī)制,在CoreDNS副本停止過程中,CoreDNS任意副本縮容或重啟可能會導(dǎo)致接收到的UDP報文丟失,觸發(fā)整個集群域名解析超時或異常。當(dāng)集群節(jié)點存在IPVS UDP缺陷導(dǎo)致的丟包風(fēng)險時,CoreDNS任意副本縮容或重啟可能會導(dǎo)致長達(dá)五分鐘的整個集群域名解析超時或異常。關(guān)于IPVS缺陷導(dǎo)致解析異常的解決方案,請參見IPVS缺陷導(dǎo)致解析異常。
合理分配CoreDNS副本運(yùn)行的位置
建議您在部署CoreDNS副本時,應(yīng)將CoreDNS副本打散在不同可用區(qū)、不同集群節(jié)點上,避免單節(jié)點、單可用區(qū)故障。CoreDNS默認(rèn)配置了按節(jié)點的弱反親和性,可能會因為節(jié)點資源不足導(dǎo)致部分或全部副本部署在同一節(jié)點上,如果遇到這種情況,請刪除Pod重新觸發(fā)其調(diào)度來調(diào)整。
CoreDNS所運(yùn)行的集群節(jié)點應(yīng)避免CPU、內(nèi)存用滿的情況,否則會影響域名解析的QPS和響應(yīng)延遲。當(dāng)集群節(jié)點條件允許時,可以考慮使用自定義參數(shù)將CoreDNS調(diào)度至獨立的集群節(jié)點上,以提供穩(wěn)定的域名解析服務(wù)。關(guān)于CoreDNS調(diào)度至獨立的集群節(jié)點的方式,請參見使用自定義參數(shù)完成CoreDNS獨占部署。
手動擴(kuò)容副本數(shù)
當(dāng)集群節(jié)點數(shù)長時間較為固定時,您可以通過以下命令擴(kuò)容CoreDNS副本數(shù)。
kubectl scale --replicas={target} deployment/coredns -n kube-system
將目標(biāo)副本數(shù){target}
設(shè)置成目標(biāo)值。
自動擴(kuò)容副本數(shù)(cluster-autoscaler)
當(dāng)集群節(jié)點數(shù)不斷增長時,您可以通過以下YAML部署集群水平伸縮器cluster-proportional-autoscaler動態(tài)擴(kuò)容副本數(shù)量:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: dns-autoscaler
namespace: kube-system
labels:
k8s-app: dns-autoscaler
spec:
selector:
matchLabels:
k8s-app: dns-autoscaler
template:
metadata:
labels:
k8s-app: dns-autoscaler
spec:
serviceAccountName: admin
containers:
- name: autoscaler
image: registry.cn-hangzhou.aliyuncs.com/acs/cluster-proportional-autoscaler:1.8.4
resources:
requests:
cpu: "200m"
memory: "150Mi"
command:
- /cluster-proportional-autoscaler
- --namespace=kube-system
- --configmap=dns-autoscaler
- --nodelabels=type!=virtual-kubelet
- --target=Deployment/coredns
- --default-params={"linear":{"coresPerReplica":64,"nodesPerReplica":8,"min":2,"max":100,"preventSinglePointFailure":true}}
- --logtostderr=true
- --v=9
上述使用線程伸縮策略中,CoreDNS副本數(shù)的計算公式為replicas = max (ceil (cores × 1/coresPerReplica), ceil (nodes × 1/nodesPerReplica) ),且CoreDNS副本數(shù)受到max
、min
限制。線程伸縮策略參數(shù)如下。
{
"coresPerReplica": 64,
"nodesPerReplica": 8,
"min": 2,
"max": 100,
"preventSinglePointFailure": true
}
基于CPU負(fù)載指標(biāo)自動擴(kuò)容副本數(shù)(HPA)
由于HPA會頻繁觸發(fā)CoreDNS副本縮容,建議您不要使用容器水平擴(kuò)縮容(HPA),如果您的場景下必須依賴于HPA,請參考以下基于CPU負(fù)載的策略配置:
---
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: coredns-hpa
namespace: kube-system
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: coredns
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
targetAverageUtilization: 50
關(guān)于HPA使用方式的更多信息,請參見使用容器水平伸縮(HPA)。
使用自定義參數(shù)完成CoreDNS獨占節(jié)點部署
登錄容器服務(wù)管理控制臺,在左側(cè)導(dǎo)航欄單擊集群。
在集群列表頁面,單擊目標(biāo)集群名稱,然后在左側(cè)導(dǎo)航欄,選擇
。在節(jié)點頁面,單擊標(biāo)簽與污點管理。
在標(biāo)簽與污點管理頁面,選中目標(biāo)節(jié)點,單擊添加標(biāo)簽。
說明節(jié)點數(shù)應(yīng)大于CoreDNS副本數(shù),避免單個節(jié)點上運(yùn)行多個CoreDNS副本。
在添加對話框中,設(shè)置以下參數(shù),然后單擊確定。
名稱:node-role-type
值:coredns
在集群管理頁左側(cè)導(dǎo)航欄中,選擇
,然后搜索CoreDNS。單擊CoreDNS卡片的配置,在配置對話框,單擊NodeSelector右側(cè)的+,設(shè)置以下參數(shù),然后單擊確定。
Key:node-role-type
Value:coredns
CoreDNS會重新調(diào)度至指定標(biāo)簽的節(jié)點上。
合理配置CoreDNS
容器服務(wù)ACK僅提供CoreDNS的默認(rèn)配置,您應(yīng)關(guān)注配置中的各個參數(shù),優(yōu)化其配置,以使CoreDNS可以為您的業(yè)務(wù)容器正常提供DNS服務(wù)。CoreDNS的配置非常靈活,具體操作,請參見DNS策略配置和域名解析說明和CoreDNS官方文檔。
早期版本隨Kubernetes集群部署的CoreDNS默認(rèn)配置可能存在一些風(fēng)險,推薦您按以下方式檢查和優(yōu)化:
您也可以通過容器智能運(yùn)維中定時巡檢和故障診斷功能完成CoreDNS配置文件的檢查。當(dāng)容器智能運(yùn)維檢查結(jié)果中提示CoreDNS Configmap配置異常時,請逐個檢查以上項目。
合理調(diào)整CoreDNS的資源Request和Limit
CoreDNS的資源消耗具有以下特點:
CoreDNS啟動、配置文件重新加載,APIServer連接、重連的過程中,CPU和內(nèi)存占用會有增加。
CoreDNS的CPU占用和其承載的域名QPS呈正相關(guān)。
CoreDNS的內(nèi)存占用和集群規(guī)模、Service數(shù)量呈正相關(guān)。
部署CoreDNS時采用的默認(rèn)資源Request和Limit如下表,建議您根據(jù)集群實際運(yùn)行情況及時做出調(diào)整,具體操作,請參見運(yùn)維管理-組件管理-網(wǎng)絡(luò)-CoreDNS-參數(shù)配置。
資源類型 | Request/Limit | 默認(rèn)值 | 備注 |
CPU | Request | 100m | 無 |
Limit | 不設(shè)置 | 調(diào)低該值會影響CoreDNS能提供的域名解析QPS。 | |
內(nèi)存 | Request | 100 Mi | 無 |
Limit | 2 Gi | 調(diào)低該值可能會有內(nèi)存不足OOM風(fēng)險。 |
低于1.8.4版本的CoreDNS默認(rèn)設(shè)置可能會與上表有所差異,請進(jìn)行調(diào)整。
關(guān)閉kube-dns服務(wù)的親和性配置
親和性配置可能導(dǎo)致CoreDNS不同副本間存在較大負(fù)載差異,建議按以下步驟關(guān)閉:
控制臺操作方式
- 登錄容器服務(wù)管理控制臺。
在控制臺左側(cè)導(dǎo)航欄中,單擊集群。
在集群列表頁面中,單擊目標(biāo)集群名稱或者目標(biāo)集群右側(cè)操作列下的詳情。
在集群管理頁左側(cè)導(dǎo)航欄中,選擇
。在kube-system命名空間下,單擊服務(wù)kube-dns右側(cè)的YAML編輯。
如果發(fā)現(xiàn)sessionAffinity字段為
None
,則無需進(jìn)行以下步驟。如果發(fā)現(xiàn)sessionAffinity為
ClientIP
,則進(jìn)行以下步驟。
刪除sessionAffinity、sessionAffinityConfig及所有子鍵,然后單擊更新。
# 刪除以下所有內(nèi)容。 sessionAffinity: ClientIP sessionAffinityConfig: clientIP: timeoutSeconds: 10800
再次單擊服務(wù)kube-dns右側(cè)的YAML編輯,校驗sessionAffinity字段是否為
None
,為None
則Kube-DNS服務(wù)變更成功。
命令行方式
執(zhí)行以下命令查看kube-dns服務(wù)配置信息。
kubectl -n kube-system get svc kube-dns -o yaml
如果發(fā)現(xiàn)sessionAffinity字段為
None
,則無需執(zhí)行以下步驟。如果發(fā)現(xiàn)sessionAffinity為
ClientIP
,則執(zhí)行以下步驟。
執(zhí)行以下命令打開并編輯名為kube-dns的服務(wù)。
kubectl -n kube-system edit service kube-dns
刪除sessionAffinity相關(guān)設(shè)置(sessionAffinity、sessionAffinityConfig及所有子鍵),并保存退出。
# 刪除以下所有內(nèi)容。 sessionAffinity: ClientIP sessionAffinityConfig: clientIP: timeoutSeconds: 10800
修改完成后,再次運(yùn)行以下命令查看sessionAffinity字段是否為
None
,為None
則Kube-DNS服務(wù)變更成功。kubectl -n kube-system get svc kube-dns -o yaml
關(guān)閉Autopath插件
部分早期版本的CoreDNS開啟了Autopath插件,該插件在一些極端場景下會導(dǎo)致解析結(jié)果出錯,請確認(rèn)其是否處于開啟狀態(tài),并編輯配置文件將其關(guān)閉。更多信息,請參見Autopath。
關(guān)閉Autopath插件后,客戶端發(fā)起的域名解析請求QPS最高會增加3倍,解析單個域名耗時最高增加3倍,請關(guān)注CoreDNS負(fù)載和業(yè)務(wù)影響。
執(zhí)行
kubectl -n kube-system edit configmap coredns
命令,打開CoreDNS配置文件。刪除
autopath @kubernetes
一行后保存退出。檢查CoreDNS Pod運(yùn)行狀態(tài)和運(yùn)行日志,運(yùn)行日志中出現(xiàn)
reload
字樣后說明修改成功。
配置CoreDNS優(yōu)雅退出
CoreDNS刷新配置過程中,可能會占用額外內(nèi)存。修改CoreDNS配置項后,請觀察Pod運(yùn)行狀態(tài),如果出現(xiàn)Pod內(nèi)存不足的情況,請及時修改CoreDNS Deployment中容器內(nèi)存限制,建議將內(nèi)存調(diào)整至2 GB。
控制臺操作方式
在控制臺左側(cè)導(dǎo)航欄中,單擊集群。
在集群列表頁面中,單擊目標(biāo)集群名稱或者目標(biāo)集群右側(cè)操作列下的詳情。
在集群管理頁左側(cè)導(dǎo)航欄中,選擇
。在kube-system命名空間下,單擊配置項coredns右側(cè)的YAML編輯。
參考下列的CoreDNS配置文件,保證health插件開啟,并調(diào)整lameduck參數(shù)為
15s
,然后單擊確定。
.:53 {
errors
# health插件在不同的CoreDNS版本中可能有不同的設(shè)置情形。
# 情形一:默認(rèn)未啟用health插件。
# 情形二:默認(rèn)啟用health插件,但未設(shè)置lameduck時間。
health
# 情形三:默認(rèn)啟用health插件,設(shè)置了lameduck時間為5s。
health {
lameduck 5s
}
# 對于以上三種情形,應(yīng)統(tǒng)一修改成以下,調(diào)整lameduck參數(shù)為15s。
health {
lameduck 15s
}
# 其它插件不需要修改,此處省略。
}
如果CoreDNS Pod正常運(yùn)行則說明CoreDNS優(yōu)雅退出的配置更新成功。如果CoreDNS Pod出現(xiàn)異常,可以通過查看Pod事件及日志定位原因。
命令行操作方式
執(zhí)行以下命令打開CoreDNS配置文件。
參考下列的Corefile文件,保證
health
插件開啟,并調(diào)整lameduck參數(shù)為15s
。修改CoreDNS配置文件后保存退出。
如果CoreDNS正常運(yùn)行則說明CoreDNS優(yōu)雅退出的配置更新成功。如果CoreDNS Pod出現(xiàn)異常,可以通過查看Pod事件及日志定位原因。
kubectl -n kube-system edit configmap/coredns
.:53 {
errors
# health插件在不同的CoreDNS版本中可能有不同的設(shè)置情形。
# 情形一:默認(rèn)未啟用health插件。
# 情形二:默認(rèn)啟用health插件,但未設(shè)置lameduck時間。
health
# 情形三:默認(rèn)啟用health插件,設(shè)置了lameduck時間為5s。
health {
lameduck 5s
}
# 對于以上三種情形,應(yīng)統(tǒng)一修改成以下,調(diào)整lameduck參數(shù)為15s。
health {
lameduck 15s
}
# 其它插件不需要修改,此處省略。
}
配置Forward插件與上游VPC DNS服務(wù)器的默認(rèn)協(xié)議
NodeLocal DNSCache采用TCP協(xié)議與CoreDNS進(jìn)行通信,CoreDNS會根據(jù)請求來源使用的協(xié)議與上游DNS服務(wù)器進(jìn)行通信。因此默認(rèn)情況下,來自業(yè)務(wù)容器的集群外部域名解析請求會依次經(jīng)過NodeLocal DNSCache、CoreDNS,最終以TCP協(xié)議請求VPC內(nèi)DNS服務(wù)器,即ECS上默認(rèn)配置的100.100.2.136和100.100.2.138兩個 IP。
VPC內(nèi)DNS服務(wù)器對TCP協(xié)議支持有限,如果您使用了NodeLocal DNSCache,您需要修改CoreDNS配置,讓其總是優(yōu)先采用UDP協(xié)議與上游DNS服務(wù)器進(jìn)行通信,避免解析異常。建議您使用以下方式修改CoreDNS配置文件,即修改命名空間kube-system下名為coredns的ConfigMap。具體操作,請參見管理配置項。在forward
插件中指定請求上游的協(xié)議為perfer_udp
,修改之后CoreDNS會優(yōu)先使用UDP協(xié)議與上游通信。修改方式如下所示:
# 修改前
forward . /etc/resolv.conf
# 修改后
forward . /etc/resolv.conf {
prefer_udp
}
配置Ready就緒探針插件
大于1.5.0版本的CoreDNS必須配置ready插件以啟用就緒探針。
執(zhí)行如下命令,打開CoreDNS配置文件。
kubectl -n kube-system edit configmap/coredns
檢查是否包含
ready
一行,若無,則增加ready
一行,按Esc鍵、輸入:wq!
并按Enter鍵,保存修改后的配置文件并退出編輯模式。apiVersion: v1 data: Corefile: | .:53 { errors health { lameduck 15s } ready # 如果沒有這一行,請增加本行,注意縮進(jìn)與Kubernetes保持一致。 kubernetes cluster.local in-addr.arpa ip6.arpa { pods verified fallthrough in-addr.arpa ip6.arpa } prometheus :9153 forward . /etc/resolv.conf { max_concurrent 1000 prefer_udp } cache 30 loop log reload loadbalance }
檢查CoreDNS Pod運(yùn)行狀態(tài)和運(yùn)行日志,運(yùn)行日志中出現(xiàn)
reload
字樣后說明修改成功。