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

  • 按照优先顺序, 一个endpointhostname 是:
    • endpointhostname字段值.
    • 系统为endpoint分配的唯一标识符。本标准不规定该标识符的确切格式和来源,但是该标识符必须可以表示一个特定端点。

ready

  • 当一个endpoint的地址已经存在于EndpointSubset对象的addresses字段中,或者对应serviceservice.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: MSRV记录。

其中优先级<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进行扩展,但是本文档中所述的所有记录必须是所实现记录的子集。