問題:
收到阿里雲K8S集羣監控告警:css
CoreDNS 5分鐘內NXDOMAIN響應百分比大於50% k8s.coredns.response[aliyun,172.22.82.25:9153,NXDOMAIN]
是coredns的172.22.82.25的這個pod出現dns解析大量失敗的問題。(解析成功的日誌是NOERROR,解析失敗是:NXDMAIN)前端
分析:
首先是查看這個coredns pod的日誌:node
[root@iZbp16er8wkobo2a165ekzZ ~]# kubectl get pods -n kube-system -o wide | grep coredns |grep 172.22.82.25coredns-57dc86754b-9schh 1/1 Running 0 17d 172.22.82.25 cn-hangzhou.xxx.xxx.xxx.xxx <none>[root@iZbp16er8wkobo2a165ekzZ ~]# kubectl logs -n kube-system coredns-57dc86754b-9schh | tail -102020-03-05T13:06:29.745Z [INFO] 172.22.0.66:54106 - 24311 "A IN metrics.cn-hangzhou.aliyuncs.com. udp 50 false 512" NOERROR qr,rd,ra 190 0.00003395s2020-03-05T13:06:29.745Z [INFO] 172.22.0.66:56730 - 20278 "AAAA IN metrics.cn-hangzhou.aliyuncs.com. udp 50 false 512" NOERROR qr,rd,ra 232 0.000072002s2020-03-05T13:06:29.748Z [INFO] 172.22.0.66:41047 - 53211 "AAAA IN metrics.cn-hangzhou.aliyuncs.com.kube-system.svc.cluster.local. udp 80 false 512" NXDOMAIN qr,rd,ra 173 0.00004196s2020-03-05T13:06:29.748Z [INFO] 172.22.0.66:40581 - 40714 "A IN metrics.cn-hangzhou.aliyuncs.com.kube-system.svc.cluster.local. udp 80 false 512" NXDOMAIN qr,rd,ra 173 0.000037223s2020-03-05T13:06:29.75Z [INFO] 172.22.0.66:41910 - 55424 "AAAA IN metrics.cn-hangzhou.aliyuncs.com.svc.cluster.local. udp 68 false 512" NXDOMAIN qr,rd,ra 161 0.000032467s2020-03-05T13:06:29.75Z [INFO] 172.22.0.66:35103 - 22415 "A IN metrics.cn-hangzhou.aliyuncs.com.svc.cluster.local. udp 68 false 512" NXDOMAIN qr,rd,ra 161 0.000071336s2020-03-05T13:06:29.752Z [INFO] 172.22.0.66:38912 - 45565 "AAAA IN metrics.cn-hangzhou.aliyuncs.com.cluster.local. udp 64 false 512" NXDOMAIN qr,rd,ra 157 0.000034122s2020-03-05T13:06:29.752Z [INFO] 172.22.0.66:35033 - 24488 "A IN metrics.cn-hangzhou.aliyuncs.com.cluster.local. udp 64 false 512" NXDOMAIN qr,rd,ra 157 0.000040106s2020-03-05T13:06:29.755Z [INFO] 172.22.0.66:50165 - 55872 "A IN metrics.cn-hangzhou.aliyuncs.com. udp 50 false 512" NOERROR qr,rd,ra 190 0.00004164s2020-03-05T13:06:29.756Z [INFO] 172.22.0.66:37725 - 64492 "AAAA IN metrics.cn-hangzhou.aliyuncs.com. udp 50 false 512" NOERROR qr,rd,ra 232 0.000029312s
查看日誌發現基本上都是172.22.0.66這個pod發起的metrics.cn-hangzhou.aliyuncs.com域名的解析,可是同一個pod解析同一個地址,有NXDOMAIN,又有NOERROR,因而嘗試手動解析一下。分別去到coredns pod上作解析和172.22.0.66這個pod上手動解析,因爲coredns pod鏡像基本命令都不支持,沒法經過命令登陸:linux
[root@iZbp16er8wkobo2a165ekzZ ~]# kubectl exec -ti -n kube-system coredns-57dc86754b-9schh /bin/bashOCI runtime exec failed: exec failed: container_linux.go:344: starting container process caused "exec: \"/bin/bash\": stat /bin/bash: no such file or directory": unknown command terminated with exit code 126
因此使用nsenter工具經過網絡命名空間的方式進入:web
"Pid": 13464,"PidMode": "","PidsLimit": 0,
手工解析發現每次都是解析正常的。經過和阿里雲的同窗溝通了解到alicloud-monitor-controller這個插件每次作解析都會有3條NXDOMAIN和1條NOERROR的記錄,最後都是解析正常的。緣由是解析k8s集羣外部的域名是還會一次search集羣內部的域。致使有3條解析失敗的日誌,最後沒有匹配到集羣內部的域而向外解析。能夠經過統計集羣外部域名和集羣內部域名的解析日誌驗證:redis
[root@iZbp16er8wkobo2a165ekzZ ~]# kubectl logs -n kube-system coredns-57dc86754b-9schh | grep cvte-ms-mc4.redis.rds.aliyuncs.com | awk '{print $8}' | sort -rn |uniq -c130 cvte-ms-mc4.redis.rds.aliyuncs.com.[root@iZbp16er8wkobo2a165ekzZ ~]# kubectl logs -n kube-system coredns-57dc86754b-9schh | grep "172.22.0.66" |grep metrics.cn-hangzhou.aliyuncs.com | awk '{print $8}' | sort -rn |uniq -c11572 metrics.cn-hangzhou.aliyuncs.com.svc.cluster.local.11572 metrics.cn-hangzhou.aliyuncs.com.kube-system.svc.cluster.local.11572 metrics.cn-hangzhou.aliyuncs.com.cluster.local.11574 metrics.cn-hangzhou.aliyuncs.com.
能夠看到,內部域名以後解析成功的記錄,而外部域名會有3條k8s集羣內部域解析失敗的記錄。從而能夠驗證,這說明alicloud_monitor-controller的dns解析方式不合理,會嚴重影響coredns的性能。應該優化。docker
查看172.22.0.66和coredns pod的/etc/resolv.conf文件分別以下:json
[root@iZbp16er8wkobo2a165ekzZ ~]# kubectl exec -ti alicloud-monitor-controller-8bc847d8d-2t5c9 -n kube-system sh $ cat /etc/resolv.conf nameserver 172.23.0.10search kube-system.svc.cluster.local svc.cluster.local cluster.localoptions ndots:5$
//其餘node節點pod的/etc/resolv.conf文件app # cat /etc/resolv.confnameserver 172.23.0.10search project-1602-pro-pro-new.svc.cluster.local svc.cluster.local cluster.localoptions ndots:2app #
發現文件中options選項的ndots參數配置不同。ndots這個參數是作什麼用的呢?swift
其中search kube-system.svc.cluster.local svc.cluster.local cluster.local和options ndots:5這兩行配置代表,全部查詢中,若是.的個數少於5個,則會根據search中配置的列表依次在對應域中先進行搜索,若是沒有返回,則最後再直接查詢域名自己。因此就會出現解析外部域名的時候會依次查詢kube-system.svc.cluster.local,svc.cluster.local和cluster.local這三個域,多了3條NXDOMAIN的解析錯誤的記錄。緩存
至此,問題已經基本清晰。
解決:
解決方法有如下三個:
1)經過修改172.22.0.6的/etc/resolv.conf文件的ndots參數爲2,來實現。(注意這須要確認業務是否不須要解析集羣內部的域名)2)關閉alicloud-monitor-controller雲監控插件。3)嘗試修改coredns的配置來實現,以下(須要驗證):
附:一則Corefile的configmap的配置:
# kubectl get configmap -n kube-system coredns -o jsonpath='{.data}'
.:53 { : log errors health kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure upstream fallthrough in-addr.arpa ip6.arpa } hosts /etc/hostfile { fallthrough } proxy domain.com 10.111.xxx.1:53 10.111.xxx.2:53 { policy round_robin } proxy domain.cn 10.111.xxx.1:53 10.111.xxx.2:53 { policy round_robin } proxy consul 10.111.xxx.1:53 10.111.xxx.2:53 { policy round_robin } prometheus :9153 proxy . /etc/resolv.conf { policy first } cache 120 loop reload //加上這個配置以後修改配置會自動reload pod的配置,可能存在pod不會重啓 loadbalance}]
使用:
# kubectl edit deployment -n kube-system coredns
編輯修改,而後修改對應的deployment重啓pod或者從新發布pod生效。
error: 錯誤記錄到stdouthealth :CoreDNS的運行情況報告爲 http:// localhost:8080 / healthkubernetes :CoreDNS將根據Kubernetes服務和pod的IP回覆DNS查詢prometheus :CoreDNS的度量標準能夠在 http://localhost:9153/ Prometheus格式的 指標 中找到proxy :任何不在Kubernetes集羣域內的查詢都將轉發到預約義的解析器(/etc/resolv.conf)cache :啓用前端緩存loop :檢測簡單的轉發循環,若是找到循環則中止CoreDNS進程reload :容許自動從新加載已更改的Corefile。編輯ConfigMap配置後,請等待兩分鐘以使更改生效
loadbalance :這是一個循環DNS負載均衡器,能夠在答案中隨機化A,AAAA和MX記錄的順序
本文分享自微信公衆號 - K8S中文社區(k8schina)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。