# 环境 ``` $ 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通过使用插件管理系统`cluster add-on`,成为了一个内建的自启动服务。 Kubernetes DNS在Kubernetes集群上调度了一个DNS Pod和Service,并配置kubelet,使其告诉每个容器使用DNS Service的Ip来解析DNS名称。 # 什么是DNS名称 集群中定义的每个Service(包括DNS Service它自己)都被分配了一个DNS名称。默认的,Pod的DNS搜索列表中会包含Pod自己的命名空间和集群的默认域,下面我们用示例来解释以下。 假设有一个名为`foo`的Service,位于命名空间`bar`中。运行在`bar`命名空间中的Pod可以通过DNS查找`foo`关键字来查找到这个服务,而运行在命名空间`quux`中的Pod可以通过关键字`foo.bar`来查找到这个服务。 # 支持的DNS模式 下面的章节详细的描述了支持的记录(record)类型和layout。 ## Services 普通(非headless)的Service都被分配了一个DNS记录,该记录的名称格式为`my-svc.my-namespace.svc.cluster.local`,通过该记录可以解析出服务的集群IP。 Headless(没有集群IP)的Service也被分配了一个DNS记录,名称格式为`my-svc.my-namespace.svc.cluster.local`。与普通Service不同的是,它会解析出Service选择的Pod的IP列表。 ### SRV records SRV records用于为命名端口服务,这些端口是headless或者普通Service的一部分。对于每个命名端口,SRV record的格式为:`_my-port-name._my-port-protocol.my-svc.my-namespace.svc.cluster.local`。对于普通服务来说,这会解析出端口号和CNAME`my-svc.my-namespace.svc.cluster.local`。对于headless服务来说,这会解析出多个结果,一个是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`。 当pod被创建时,它的hostname设置在Pod的`metadata.name`中(写yaml的时候应该很清楚这点)。 在v1.2版本中,用户可以指定一个Pod注解,`pod.beta.kubernetes.io/hostname`,用于指定Pod的hostname。这个Pod注解,一旦被指定,就将优先于Pod的名称,成为pod的hostname。比如,一个Pod,其注解为`pod.beta.kubernetes.io/hostname: my-pod-name`,那么该Pod的hostname会被设置为my-pod-name。 v1.2中还引入了一个beta特性,用户指定Pod注解,`pod.beta.kubernetes.io/subdomain`,来指定Pod的subdomain。比如,一个Pod,其hostname注解设置为`“foo”`,subdoma