POD使用DNS工作原理

tag: k8s coredns


一贮聂、前言

有個(gè)同學(xué)不小心將CoreDNS干掉了,直接使用helm安裝寨辩,但是DNS SVC的IP會(huì)重新分配一個(gè)吓懈。部署的POD的dns服務(wù)器地址不會(huì)變成新的(老的也不會(huì)改變)。

二靡狞、集群示例

kubelet 通過--cluster-dns=<dns-service-ip> 傳遞dns的地址耻警。當(dāng)創(chuàng)建POD時(shí),如果使用ClusterDNS甸怕,則/etc/resolv.conf文件里的地址就使用這個(gè)甘穿。參考官網(wǎng)

kubelet狀態(tài)

查看kubelet的PID,及啟動(dòng)配置梢杭。

# systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
   Loaded: loaded (/etc/systemd/system/kubelet.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/kubelet.service.d
           └─10-node-kubeadm.conf
   Active: active (running) since Wed 2020-04-15 22:37:12 CST; 1 months 24 days ago
     Docs: http://kubernetes.io/docs/
 Main PID: 1181 (kubelet)
   Memory: 354.7M
   CGroup: /system.slice/kubelet.service
           └─1181 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/node-bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/etc/kubelet/no...

kubelet啟動(dòng)參數(shù)

--config=/etc/kubelet/node-config.yaml 節(jié)點(diǎn)配置温兼,里面配置了dns的地址。

[root@k8s-node-vm6fqz-77jtilv0tc ~]# cat /proc/1181/cmdline  | strings -1
/usr/bin/kubelet
--bootstrap-kubeconfig=/etc/kubernetes/node-bootstrap-kubelet.conf
--kubeconfig=/etc/kubernetes/kubelet.conf
--config=/etc/kubelet/node-config.yaml
--network-plugin=cni
--pod-infra-container-image=jdcloud-cn-south-1.jcr.service.jdcloud.com/k8s/pause-amd64:3.1
--kube-reserved=cpu=80m,memory=2562Mi
--node-labels=group=default,failure-domain.beta.kubernetes.io/zone=cn-south-1b,failure-domain.beta.kubernetes.io/region=cn-south-1
--cloud-provider=external

clusterDNS配置

默認(rèn)dns地址為:172.16.56.10

# cat /etc/kubelet/node-config.yaml 
address: 0.0.0.0
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: cgroupfs
cgroupsPerQOS: true
clusterDNS:
- 172.16.56.10
clusterDomain: cluster.local
configMapAndSecretChangeDetectionStrategy: Watch

三武契、DNS地址由來(lái)

以kubeadm部署集群為例募判,kubeadm默認(rèn)獲取svc網(wǎng)段下的第10個(gè)IP作為DNS的地址。

dns地址

  • CoreDNS在創(chuàng)建SVC時(shí)調(diào)用GetDNSIP咒唆,顯示的將ClusterIP字段進(jìn)行設(shè)置届垫。
  • kubelet初始化時(shí),調(diào)用GetDNSIP將地址傳入到啟動(dòng)參數(shù)里全释。

cmd/kubeadm/app/constants/constants.go:GetDNSIP

// GetDNSIP returns a dnsIP, which is 10th IP in svcSubnet CIDR range
func GetDNSIP(svcSubnetList string, isDualStack bool) (net.IP, error) {
    // Get the service subnet CIDR
    svcSubnetCIDR, err := GetKubernetesServiceCIDR(svcSubnetList, isDualStack)
    if err != nil {
        return nil, errors.Wrapf(err, "unable to get internal Kubernetes Service IP from the given service CIDR (%s)", svcSubnetList)
    }

    // Selects the 10th IP in service subnet CIDR range as dnsIP
    dnsIP, err := utilnet.GetIndexedIP(svcSubnetCIDR, 10)
    if err != nil {
        return nil, errors.Wrap(err, "unable to get internal Kubernetes Service IP from the given service CIDR")
    }

    return dnsIP, nil
}
image-20200609120618743

四装处、POD DNS配置

dns內(nèi)部類型

用戶對(duì)pod的配置,會(huì)在內(nèi)部進(jìn)行轉(zhuǎn)換浸船,轉(zhuǎn)為以下3種妄迁。

podDNSCluster k8s集群內(nèi)部的DNS
podDNSHost 主機(jī)節(jié)點(diǎn)的DNS
podDNSNone 不配置DNS

dns配置轉(zhuǎn)換

  • Default”: Pod從運(yùn)行所在的節(jié)點(diǎn)繼承名稱解析配置找前。
  • ClusterFirst”: dnsPolicy的默認(rèn)配置。與配置的群集域后綴不匹配的任何DNS查詢(例如 “www.kubernetes.io” )都將轉(zhuǎn)發(fā)到從節(jié)點(diǎn)繼承的上游名稱服務(wù)器判族。 群集管理員可能配置了額外的存根域和上游DNS服務(wù)器躺盛。
  • ClusterFirstWithHostNet”: hostNetwork=true的 Pod,應(yīng)顯式設(shè)置其DNS策略 “ClusterFirstWithHostNet”形帮。
  • None”: 它允許 Pod 忽略 Kubernetes 環(huán)境中的 DN S設(shè)置槽惫。 應(yīng)該使用 Pod Spec 中的 dnsConfig 字段提供所有 DNS 設(shè)置。

pkg/kubelet/network/dns/dns.go:getPodDNSType

func getPodDNSType(pod *v1.Pod) (podDNSType, error) {
    dnsPolicy := pod.Spec.DNSPolicy
    switch dnsPolicy {
    case v1.DNSNone:
        return podDNSNone, nil
    case v1.DNSClusterFirstWithHostNet:
        return podDNSCluster, nil
    case v1.DNSClusterFirst:
        if !kubecontainer.IsHostNetworkPod(pod) {
            return podDNSCluster, nil
        }
        // Fallback to DNSDefault for pod on hostnetowrk.
        fallthrough
    case v1.DNSDefault:
        return podDNSHost, nil
    }
    // This should not happen as kube-apiserver should have rejected
    // invalid dnsPolicy.
    return podDNSCluster, fmt.Errorf(fmt.Sprintf("invalid DNSPolicy=%v", dnsPolicy))
}

https://kubernetes.io/zh/docs/concepts/services-networking/dns-pod-service/

dns地址

pkg/kubelet/network/dns/dns.go:331

func (c *Configurer) GetPodDNS(pod *v1.Pod) (*runtimeapi.DNSConfig, error) {
    dnsConfig, err := c.getHostDNSConfig()

    dnsType, err := getPodDNSType(pod)

    switch dnsType {
    case podDNSNone:
        dnsConfig = &runtimeapi.DNSConfig{}
    case podDNSCluster:
        // 從c.clusterDNS里獲取dns地址
        if len(c.clusterDNS) != 0 {
            dnsConfig.Servers = []string{}
            for _, ip := range c.clusterDNS {
                dnsConfig.Servers = append(dnsConfig.Servers, ip.String())
            }
            dnsConfig.Searches = c.generateSearchesForDNSClusterFirst(dnsConfig.Searches, pod)
            dnsConfig.Options = defaultDNSOptions
            break
        }
        fallthrough
    case podDNSHost:
        if c.ResolverConfig == "" {
            switch {
            case c.nodeIP == nil || c.nodeIP.To4() != nil:
                dnsConfig.Servers = []string{"127.0.0.1"}
            case c.nodeIP.To16() != nil:
                dnsConfig.Servers = []string{"::1"}
            }
            dnsConfig.Searches = []string{"."}
        }
    }

    if pod.Spec.DNSConfig != nil {
        dnsConfig = appendDNSConfig(dnsConfig, pod.Spec.DNSConfig)
    }
    return c.formDNSConfigFitsLimits(dnsConfig, pod), nil
}

五辩撑、DNS修復(fù)

1)重新創(chuàng)建界斜, svc的IP設(shè)置為之前的地址。

helm install coredns -n kube-system stable/coredns --set service.clusterIP=10.0.56.10

2)更換DNS地址合冀,需要修改kubelet配置各薇,重啟kubelet。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末君躺,一起剝皮案震驚了整個(gè)濱河市峭判,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌棕叫,老刑警劉巖林螃,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異疗认,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)伏钠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門横漏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)熟掂,“玉大人华畏,你說我怎么就攤上這事横朋∥酰” “怎么了?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵谷羞,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我靠瞎,道長(zhǎng),這世上最難降的妖魔是什么制恍? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任爱榕,我火速辦了婚禮坡慌,結(jié)果婚禮上黔酥,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好跪者,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布棵帽。 她就那樣靜靜地躺著,像睡著了一般渣玲。 火紅的嫁衣襯著肌膚如雪逗概。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天忘衍,我揣著相機(jī)與錄音仗谆,去河邊找鬼。 笑死淑履,一個(gè)胖子當(dāng)著我的面吹牛隶垮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播秘噪,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼狸吞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了指煎?” 一聲冷哼從身側(cè)響起蹋偏,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎至壤,沒想到半個(gè)月后威始,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡像街,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年黎棠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镰绎。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡脓斩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出畴栖,到底是詐尸還是另有隱情随静,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布吗讶,位于F島的核電站燎猛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏照皆。R本人自食惡果不足惜重绷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纵寝。 院中可真熱鬧论寨,春花似錦、人聲如沸爽茴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)室奏。三九已至火焰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間胧沫,已是汗流浹背昌简。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绒怨,地道東北人纯赎。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像南蹂,于是被迫代替她去往敵國(guó)和親犬金。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356