# 環(huán)境 ``` $ sudo lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 16.04.2 LTS Release: 16.04 Codename: xenial $ kubectl version Client Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.4", GitCommit:"7243c69eb523aa4377bce883e7c0dd76b84709a1", GitTreeState:"clean", BuildDate:"2017-03-07T23:53:09Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.4", GitCommit:"7243c69eb523aa4377bce883e7c0dd76b84709a1", GitTreeState:"clean", BuildDate:"2017-03-07T23:34:32Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"linux/amd64"} ``` # 介紹 從Kubernetes 1.3開(kāi)始,DNS通過(guò)使用插件管理系統(tǒng)`cluster add-on`,成為了一個(gè)內(nèi)建的自啟動(dòng)服務(wù)。 Kubernetes DNS在Kubernetes集群上調(diào)度了一個(gè)DNS Pod和Service,并配置kubelet,使其告訴每個(gè)容器使用DNS Service的Ip來(lái)解析DNS名稱。 # 什么是DNS名稱 集群中定義的每個(gè)Service(包括DNS Service它自己)都被分配了一個(gè)DNS名稱。默認(rèn)的,Pod的DNS搜索列表中會(huì)包含Pod自己的命名空間和集群的默認(rèn)域,下面我們用示例來(lái)解釋以下。 假設(shè)有一個(gè)名為`foo`的Service,位于命名空間`bar`中。運(yùn)行在`bar`命名空間中的Pod可以通過(guò)DNS查找`foo`關(guān)鍵字來(lái)查找到這個(gè)服務(wù),而運(yùn)行在命名空間`quux`中的Pod可以通過(guò)關(guān)鍵字`foo.bar`來(lái)查找到這個(gè)服務(wù)。 # 支持的DNS模式 下面的章節(jié)詳細(xì)的描述了支持的記錄(record)類型和layout。 ## Services 普通(非headless)的Service都被分配了一個(gè)DNS記錄,該記錄的名稱格式為`my-svc.my-namespace.svc.cluster.local`,通過(guò)該記錄可以解析出服務(wù)的集群IP。 Headless(沒(méi)有集群IP)的Service也被分配了一個(gè)DNS記錄,名稱格式為`my-svc.my-namespace.svc.cluster.local`。與普通Service不同的是,它會(huì)解析出Service選擇的Pod的IP列表。 ### SRV records SRV records用于為命名端口服務(wù),這些端口是headless或者普通Service的一部分。對(duì)于每個(gè)命名端口,SRV record的格式為:`_my-port-name._my-port-protocol.my-svc.my-namespace.svc.cluster.local`。對(duì)于普通服務(wù)來(lái)說(shuō),這會(huì)解析出端口號(hào)和CNAME`my-svc.my-namespace.svc.cluster.local`。對(duì)于headless服務(wù)來(lái)說(shuō),這會(huì)解析出多個(gè)結(jié)果,一個(gè)是service后端的每個(gè)pod,一個(gè)是包含端口號(hào),和格式為`auto-generated-name.my-svc.my-namespace.svc.cluster.local`的pod的CNAME。 ### 向后兼容性 kube-dns的之前版本,使用了格式為`my-svc.my-namespace.cluster.local`(svc這一層是后面加上的)的名稱。但這種格式不再被支持了。 ## Pods pod會(huì)被分配一個(gè)DNS記錄,名稱格式為`pod-ip-address.my-namespace.pod.cluster.local`。 比如,一個(gè)pod,它的IP地址為`1.2.3.4`,命名空間為`default`,DNS名稱為cluster.local,那么它的記錄就是:`1-2-3-4.default.pod.cluster.local`。 當(dāng)pod被創(chuàng)建時(shí),它的hostname設(shè)置在Pod的`metadata.name`中(寫(xiě)yaml的時(shí)候應(yīng)該很清楚這點(diǎn))。 在v1.2版本中,用戶可以指定一個(gè)Pod注解,`pod.beta.kubernetes.io/hostname`,用于指定Pod的hostname。這個(gè)Pod注解,一旦被指定,就將優(yōu)先于Pod的名稱,成為pod的hostname。比如,一個(gè)Pod,其注解為`pod.beta.kubernetes.io/hostname: my-pod-name`,那么該P(yáng)od的hostname會(huì)被設(shè)置為my-pod-name。 v1.2中還引入了一個(gè)beta特性,用戶指定Pod注解,`pod.beta.kubernetes.io/subdomain`,來(lái)指定Pod的subdomain。比如,一個(gè)Pod,其hostname注解設(shè)置為`“foo”`,subdoma