Kubernetes 之 Nameserver limits were exceeded


1、問題描述

最近查看kubernetes 的events,發現了有兩個節點經常出現下面的信息:

DNSConfigForming  Nameserver limits were exceeded, some nameservers have been omitted, the applied nameserver line is: 192.96.0.10 10.2.5.1 10.2.5.2

這個是kubelet打出來的,字面意思很好理解,就是nameserver 超出限制,超出的將被忽略。那限制是多少呢?so帶着這個疑問就去github kubernetes源碼一探究竟。

首先確定知道這個是kubelet里面的events,找到dns的相關源碼:kubernetes/pkg/kubelet/network/dns/dns.go

func (c *Configurer) formDNSNameserversFitsLimits(nameservers []string, pod *v1.Pod) []string { if len(nameservers) > validation.MaxDNSNameservers { nameservers = nameservers[0:validation.MaxDNSNameservers] log := fmt.Sprintf("Nameserver limits were exceeded, some nameservers have been omitted, the applied nameserver line is: %s", strings.Join(nameservers, " ")) c.recorder.Event(pod, v1.EventTypeWarning, "DNSConfigForming", log) klog.Error(log) } return nameservers }

找到上面的函數,有一個validation.MaxDNSNameservers,所以kubelet讀取resolv.conf里面的nameserver是有數量限制的,最大值就是validation.MaxDNSNameservers,我們現在去找validation的源碼。在上面的import里面

找到k8s.io/kubernetes/pkg/apis/core/validation,找到validation這個package的源碼:

const ( // Limits on various DNS parameters. These are derived from // restrictions in Linux libc name resolution handling. // Max number of DNS name servers.
    MaxDNSNameservers = 3
    // Max number of domains in search path.
    MaxDNSSearchPaths = 6
    // Max number of characters in search path.
    MaxDNSSearchListChars = 256 )

原來默認的支持最大nameserver是3個。然后去兩台拋出DNSConfigForming的服務器上面檢查/etc/resolv.conf里面的nameserver發現果然超過了三個。

 

二、解決問題

當然一般被忽略掉的那個nameserver不影響服務使用的話,可以不作為緊急處理。

可以在kubelet設置一個kubermetes專用的resolv.conf文件,保證kubernetes使用到的nameserver不超過三個,這樣就可以解決。

在/var/lib/kubelet路徑下,修改config.yaml

resolvConf: /etc/resolv.conf

重啟kubelet生效。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM