# 環(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開始,DNS通過使用插件管理系統(tǒng)`cluster add-on`,成為了一個內(nèi)建的自啟動服務(wù)。 Kubernetes DNS在Kubernetes集群上調(diào)度了一個DNS Pod和Service,并配置kubelet,使其告訴每個容器使用DNS Service的Ip來解析DNS名稱。 # 什么是DNS名稱 集群中定義的每個Service(包括DNS Service它自己)都被分配了一個DNS名稱。默認(rèn)的,Pod的DNS搜索列表中會包含Pod自己的命名空間和集群的默認(rèn)域,下面我們用示例來解釋以下。 假設(shè)有一個名為`foo`的Service,位于命名空間`bar`中。運行在`bar`命名空間中的Pod可以通過DNS查找`foo`關(guān)鍵字來查找到這個服務(wù),而運行在命名空間`quux`中的Pod可以通過關(guān)鍵字`foo.bar`來查找到這個服務(wù)。 # 支持的DNS模式 下面的章節(jié)詳細(xì)的描述了支持的記錄(record)類型和layout。 ## Services 普通(非headless)的Service都被分配了一個DNS記錄,該記錄的名稱格式為`my-svc.my-namespace.svc.cluster.local`,通過該記錄可以解析出服務(wù)的集群IP。 Headless(沒有集群IP)的Service也被分配了一個DNS記錄,名稱格式為`my-svc.my-namespace.svc.cluster.local`。與普通Service不同的是,它會解析出Service選擇的Pod的IP列表。 ### SRV records SRV records用于為命名端口服務(wù),這些端口是headless或者普通Service的一部分。對于每個命名端口,SRV record的格式為:`_my-port-name._my-port-protocol.my-svc.my-namespace.svc.cluster.local`。對于普通服務(wù)來說,這會解析出端口號和CNAME`my-svc.my-namespace.svc.cluster.local`。對于headless服務(wù)來說,這會解析出多個結(jié)果,一個是service后端的每個pod,一個是包含端口號,和格式為`auto-generated-name.my-svc.my-namespace.svc.cluster.local`的pod的CNAME。 ### 向后兼容性 kube-dns的之前版本,使用了格式為`my-svc.my-namespace.cluster.local`(svc這一層是后面加上的)的名稱。但這種格式不再被支持了。 ## Pods pod會被分配一個DNS記錄,名稱格式為`pod-ip-address.my-namespace.pod.cluster.local`。 比如,一個pod,它的IP地址為`1.2.3.4`,命名空間為`default`,DNS名稱為cluster.local,那么它的記錄就是:`1-2-3-4.default.pod.cluster.local`。 當(dāng)pod被創(chuàng)建時,它的hostname設(shè)置在Pod的`metadata.name`中(寫yaml的時候應(yīng)該很清楚這點)。 在v1.2版本中,用戶可以指定一個Pod注解,`pod.beta.kubernetes.io/hostname`,用于指定Pod的hostname。這個Pod注解,一旦被指定,就將優(yōu)先于Pod的名稱,成為pod的hostname。比如,一個Pod,其注解為`pod.beta.kubernetes.io/hostname: my-pod-name`,那么該Pod的hostname會被設(shè)置為my-pod-name。 v1.2中還引入了一個beta特性,用戶指定Pod注解,`pod.beta.kubernetes.io/subdomain`,來指定Pod的subdomain。比如,一個Pod,其hostname注解設(shè)置為`“foo”`,subdoma