原文链接
DNS for Services and Pods
这篇文章是kubernetes关于DNS的概述.
- Introduction
- Services
- Pods
Introduction
Kubernetes DNS 在集群中调度一个DNS Pod和Service,并配置kubelets去告诉独立的容器使用DNS Service’s IP去解析DNS名称.
What things get DNS names?
在集群中的每个service都会被分配一个DNS名称.默认情况下,客户端发起的Pod的DNS搜索包括Pod的namespace和集群默认的域名.这里有个例子说明:
假设一个Service名称为foo,在kubernetes中的namespace为bar.一个运行在namespace为bar的pod,通过简便的DNS查询到名称为foo的Service.一个运行在namespace为quux的pod,可以在DNS中通过搜索名称为foo.bar,并查到这个容器.
下面的章节详细的说明了支持的record类型以及支持的布局设计.
Services
A Record
正常(not headless)Services会被分配一个这种格式的DNS A 记录my-svc.my-namespace.svc.cluster.local
.这个解析集群的Service Ip.
Headless(没有cluster ip)Services会被分配一个这种格式的DNS A记录my-svc.my-namespace.svc.cluster.local
.和正常的Services不同的是,通过解析Pod中的一组Ip.
SRV Record
SRV记录是在正常或Headless Service创建时指定端口.每个指定的端口,SRV记录的格式是: _my-port-name._my-port-protocol.my-svc.my-namespace.svc.cluster.local
.对于headless serviec来说,这个解析会得到多个结果,pod中的容器端口号和子域名格式为:auto-generated-name.my-svc.my-namespace.svc.cluster.local
.
Pods
A Record
Pods会被分配这种格式的一条DNS A记录:pod-ip-address.my-namespace.pod.cluster.local
例如:一个pod的ip是1.2.3.4,namespace为default,DNS为cluster.local的DNS记录为:1-2-3-4.default.pod.cluster.local
Pod’s hostname and subdomain fields
创建pod时,它的hostname默认为Pod中的metadata.name的值.
Pod的spec有个hostname字段选项,用来指定pod的hostname.而.spec.hostname
优先级高于.metadata.name
.例如:给一个pod的hostname设置为”my-host”,那么这个pod的名称就是”my-host”.
Pod的spec有个subdomain字段选项,用来指定pod的子域名.例如:一个pod的hostname设置为”foo”,subdomain设置为”bar”,namespace为”my-namespace”,则它的查询名称就为:foo.bar.my-namespace.svc.cluster.local
例子:
1 | apiVersion: v1 |
如果存在一个headless service和一个pod在同一个namespace中,并且headless service的名称和pod中的subdomain名称相同,kubernetes的DNS服务一样查询到这个Service.例如:上面配置中,一个Pod的hostname是”busybox-1”,subdomain是default-subdomain,而headless service命名为”default-subdomain”.那么这个DNS为busybox-1.default-subdomain.my-namespace.svc.cluster.local