Kubernetes DNS-Based Service Discovery 翻译
本文是Kubernetes DNS-Based Service Discovery的翻译,也就是Kubernetes DNS specification的翻译,目前最新版本号是1.0.1。
0 - 关于此文档
本文档是Kubernetes基于DNS的服务发现的规范说明,尽管在Kubernetes中还有其他方式的服务发现协议和机制,但是DNS仍然是最常见而且是最推荐使用的扩展。实际的DNS服务并不一定由由默认的Kube-DNS提供。 本文档旨在为所有实现之间的通用性提供相应的基准。
1 - Schema 版本
本文档描述了Schema版本1.0.1。
2 - 资源记录
所有的基于DNS的Kubernetes服务发现方案必须兼容并提供以下所说明的所有的资源的对应记录(resource records or RRs)。
2.1 - 定义
在以下的资源记录描述中,不在<>中的是普通文字,<>中的值的含义在下面或者特定记录的描述中说明:
<zone>
= 集群domain, 比如 cluster.local<ns>
= 一个命名空间(namespace)<ttl>
= DNS TTL (time-to-live)
在下面的描述中,以下定义应用于_斜体_文字。
hostname
- 按照优先顺序, 一个
endpoint
的 hostname 是:endpoint
的hostname
字段值.- 系统为
endpoint
分配的唯一标识符。本标准不规定该标识符的确切格式和来源,但是该标识符必须可以表示一个特定端点。
ready
- 当一个
endpoint
的地址已经存在于EndpointSubset对象的addresses
字段中,或者对应service
的service.alpha.kubernetes.io/tolerate-unready-endpoints
注释被标记为true
,则认为该endpoint
_ready_了,
所有查询数据和Kubernetes数据都是不区分大小写的。
2.2 - Schema 版本的记录
必须有一条TXT
记录dns-version.<zone>.
包含该集群DNS使用的Schema 版本。
- 记录格式:
dns-version.<zone>. <ttl> IN TXT <schema-version>
- 查询示例:
dns-version.cluster.local. IN TXT
- 返回示例:
dns-version.cluster.local. 28800 IN TXT "1.0.0"
2.3 - 针对带有ClusterIP的Service的记录
针对一个ClusterIP为<cluster-ip>
、在<ns>
命名空间下的<service>
服务,下面的记录必须存在:
2.3.1 - A
记录
- 记录格式:
<service>.<ns>.svc.<zone>. <ttl> IN A <cluster-ip>
- 查询示例:
kubernetes.default.svc.cluster.local. IN A
- 返回示例:
kubernetes.default.svc.cluster.local. 4 IN A 10.3.0.1
2.3.2 - SRV
记录
针对每一个名字为<port>
、端口为<port-number>
、 协议为<proto>
的Port对象, 下面的SRV
记录必须存在:
- 记录格式:
_<port>._<proto>.<service>.<ns>.svc.<zone>. <ttl> IN SRV <weight> <priority> <port-number> <service>.<ns>.svc.<zone>.
其中优先级<priority>
和权重<weight>
在RFC2782定义。
没有命名的port没有SRV
记录。
- 查询示例:
_https._tcp.kubernetes.default.svc.cluster.local. IN SRV
- 返回示例:
_https._tcp.kubernetes.default.svc.cluster.local. 30 IN SRV 10 100 443 kubernetes.default.svc.cluster.local.
服务的A
记录有可能随着SRV
记录的附加部分一同返回。
2.3.3 - PTR
记录
针对一个服务的ClusterIP <a>.<b>.<c>.<d>
, 必须存在一个如下的PTR
记录:
- 记录格式:
<d>.<c>.<b>.<a>.in-addr.arpa. <ttl> IN PTR <service>.<ns>.svc.<zone>.
- 查询示例:
1.0.3.10.in-addr.arpa. IN PTR
- 返回示例:
1.0.3.10.in-addr.arpa. 14 IN PTR kubernetes.default.svc.cluster.local.
2.4 - 针对Headless Service的记录
针对一个在<ns>
命名空间中名为<service>
的Headless Service(比如一个没有ClusterIP的Service),下面的记录必须存在:
2.4.1 - A
记录
针对每一个处于_ready_状态、IP地址为<endpoint-ip>
的endpoint,必须有对应的一条A记录存在,
如果没有处于_ready_状态的endpoint,返回必须没有A
记录,但是,如果服务存在,查询会得到一个空的返回并且rcode
为0,而不是得到一个NXDOMAIN
结果。
- 记录格式:
<service>.<ns>.svc.<zone>. <ttl> IN A <endpoint-ip>
- 查询示例:
headless.default.svc.cluster.local. IN A
- 返回示例:
headless.default.svc.cluster.local. 4 IN A 10.3.0.1 headless.default.svc.cluster.local. 4 IN A 10.3.0.2 headless.default.svc.cluster.local. 4 IN A 10.3.0.3
针对每个拥有_hostname_为<hostname>
、IP为<endpoint-ip>
,状态为_ready_的endpoint,必须有一条A
记录,如果名_hostname_的主机有多个IP,则每个IP也会有一个A
记录。
- 记录格式:
<hostname>.<service>.<ns>.svc.<zone>. <ttl> IN A <endpoint-ip>
- 查询示例:
my-pet.headless.default.svc.cluster.local. IN A
- 返回示例:
my-pet.headless.default.svc.cluster.local. 4 IN A 10.3.0.100
2.4.2 - SRV
记录
针对每个拥有_hostname_为<hostname>
、IP为<endpoint-ip>
,状态为_ready_的endpoint和一个名字为<port>
、端口为<port-number>
、 协议为<proto>
的Service组合, 下面的SRV
记录必须存在:
- 记录格式:
_<port>._<proto>.<service>.<ns>.svc.<zone>. <ttl> IN SRV <weight> <priority> <port-number> <hostname>.<service>.<ns>.svc.<zone>.
这意味着如果有N个_ready_的endpoints,并且Service定义了M个有名字的端口,那么就会有N :heavy_multiplication_x: M个SRV
记录。
其中优先级<priority>
和权重<weight>
在RFC2782定义。
没有命名的port没有SRV
记录。
- 查询示例:
_https._tcp.headless.default.svc.cluster.local. IN SRV
- 返回示例:
_https._tcp.headless.default.svc.cluster.local. 4 IN SRV 10 100 443 my-pet.headless.default.svc.cluster.local. _https._tcp.headless.default.svc.cluster.local. 4 IN SRV 10 100 443 my-pet-2.headless.default.svc.cluster.local. _https._tcp.headless.default.svc.cluster.local. 4 IN SRV 10 100 443 438934893.headless.default.svc.cluster.local.
服务的A
记录有可能随着SRV
记录的附加部分一同返回。
2.4.3 - PTR
记录
针对一个_hostname_为<hostname>
、IP地址为<a>.<b>.<c>.<d>
状态为_ready_的endpoint,必须存在下面的PTR
记录:
- 记录格式:
<d>.<c>.<b>.<a>.in-addr.arpa. <ttl> IN PTR <hostname>.<service>.<ns>.svc.<zone>.
- 查询示例:
100.0.3.10.in-addr.arpa. IN PTR
- 返回示例:
100.0.3.10.in-addr.arpa. 14 IN PTR my-pet.headless.default.svc.cluster.local.
2.5 - 针对External Name Services的记录
针对一个在<ns>
命名空间中名字为<service>
、ExternalName名字为<extname>
的Service,必须存在一条CNAME
记录<service>.<ns>.svc.<zone>
指向<extname>
:
- 记录格式:
<service>.<ns>.svc.<zone>. <ttl> IN CNAME <extname>.
- 查询示例:
foo.default.svc.cluster.local. IN A
- 返回示例:
foo.default.svc.cluster.local. 10 IN CNAME www.example.com.
www.example.com. 28715 IN A 192.0.2.53
2.6 - 被废弃的记录
在本规范之前的Kube-DNS实现也会对对在0-255之间的<a>
, <b>
, <c>
, and <d>
作出如下的A
记录回复:
- 记录格式:
<a>-<b>-<c>-<d>.<ns>.pod.<zone>. <ttl> IN A <a>.<b>.<c>.<d>
针对本规范这个行为被废弃了,但是仍然需要实现,该特性会在未来的版本中被移除。
3 - Schema扩展
具体的实现可以针对本Schema进行扩展,但是本文档中所述的所有记录必须是所实现记录的子集。