Kubernetes DNS记录

Kubernetes基于DNS的服务发现GitHub

服务和pod的Pods | Kubernetes

Kubernetes DNS在集群中部署DNS Pod和服务,kubelet会告诉容器DNS服务IP解析DNS名称。

群集中的每个服务(包括DNS服务器)都将被分配一个DNS名称。默认情况下,客户端Pod的搜索列表包含Pod的名称空间和集群的默认域。

根据不同的名称空间,DNS查询将返回不同的结果。DNS查询不指定命名空间,所以使用pod的命名空间;指定要跨命名空间查询的命名空间。

您可以通过Pod的/etc/resolv.conf文件扩展查询。这个文件是由Kubelet设置的。例如,只有查询数据会展开到data . test . cluster . local。search参数也可用于展开查询。有关更多DNS查询,请参见solv.conf手册页。

总之,测试命名空间中的pod可以成功解析data . prod ordata . prod . SVC . cluster . local。

哪些对象拥有DNS记录?

以下部分详细描述了支持的DNS记录类型和层次结构。以下部分详细介绍了支持的DNS记录类型和支持的布局。任何其他布局、名称或查询都被认为是实现细节,可能会在没有警告的情况下进行更改。请参阅Kubernetes基于DNS的服务发现,了解最新的设置文档。

“普通”(非headless)服务分配DNS A或AAAA记录,名称格式为my-SVC . my-namespace . SVC . cluster-domain . example。这将被解析为服务的群集IP。

* *“headless”* *(无集群IP)服务还准备分配DNS A或AAAA记录,名称格式为my-SVC . my-namespace . SVC . cluster-domain . example .与普通服务不同,它解析为一组Pods select的IP。客户端应该以标准的循环方式使用这组集合。

SRV记录是为作为普通或无头服务一部分的命名端口创建的。对于每个指定的端口,SRV记录的格式应该是_my-port-name。_ my-port-protocol . my-SVC . my-namespace . SVC . cluster-domain . example。对于常规服务,这将解析为端口号和域名:my-SVC . my-namespace . SVC . cluster-domain . example。对于无头服务,这将解析为多个答案,每个支持该服务的pod一个答案,包含端口号和pod的域名,格式为auto-generated-name . my-SVC . my-namespace . SVC . cluster-domain . example

有时,我们不需要负载平衡或配置服务IP。在这种情况下,我们可以通过为集群IP (.spec.clusterIP)的显示指定“None”来创建“headless”服务。

您可以使用headless服务与其他服务发现机制进行交互,而不必绑定到Kubernetes方案。

无头服务,没有分配集群IP,kube-proxy不负责这些服务,平台上也没有负载均衡或代理处理。DNS的自动配置取决于服务是否定义了选择器:

定义了选择器的无头服务,端点控制器在API中创建端点记录,并配置DNS返回的IP地址,使其直接指向服务后的Pods。

如果没有为选择器定义的无头服务,端点控制器不会创建端点记录。DNS系统的搜索和配置如下:

DNS中的pod名称通常如下:通常,pod具有以下DNS解析:

pod-IP-address . my-namespace . pod . cluster-domain . example。

例如,在默认命名空间的Pod中,IP地址为172.17.0.3,集群的域名为cluster.local,则Pod的DNS名称为:

172-17-0-3 .默认值. pod.cluster.local。

由部署创建的Pods,或由服务发布的DaemonSet,DNS解析如下:

pod-IP-address . deployment-name . my-namespace . SVC . cluster-domain .示例

创建Pod后,其主机名被设置为Pod的metadata.name值。

Pod的规范有一个可选的主机名,用于指定Pod的主机名。分配后,pod的名称优先作为Pod的主机名。例如,如果某个Pod的主机名配置为“我的主机”,则该Pod的主机名将设置为“我的主机”。

Pod规范还有一个可选的子域来指定子域。例如,如果一个Pod将主机名设置为“foo”,子域设置为“bar”,名称空间设置为“my-namespace”,那么完整的域名(FQDN)就是foo . bar . my-namespace . SVC . cluster-domain . example..

如果在同一个名称空间中有一个headless服务,该名称空间与pod的子域名相同,则群集的DNS仍会返回Pod FQDN的A或AAAA记录。

比如Pod的主机名是“busybox-1”,子域是“default-subdomain”,名为“default-subdomain”的无头服务在同一个命名空间。该pod会将其自己的FQDN标识为busybox-1 . default-subdomain . my-namespace . SVC . cluster-domain . example . DNS为该名称提供一个或AAAA记录,指向该Pod的IP。pod“busybox 1”和“busybox2”都可以有唯一的A或AAAA记录。

端点对象为主机名分配端点地址及其IP。

功能状态:Kubernetes v1.20 [beta]

当一个Pod被配置为具有FQDN时,其主机名将成为缩写主机名。例如,如果Pod的fqdn是busybox-1 . default-subdomain . my-namespace . SVC . cluster-domain . example,那么Pod的默认主机名是busybox-1,hostname - fqdn命令返回FQDN。

当您在Pod规范中设置setHostnameAsFQDN: true时,kubelet会将Pod的FQDN写入该Pod的名称空间的主机名中。这样,主机名和主机名- fqdn都将返回pod的fqdn。

您可以为每个pod设置DNS策略。Kubernetes现在支持以下特定于pod的DNS策略。这些策略在Pod规范的dnsPolicy配置项目中设置。

Pod的DNS配置提供了更多的DNS控制手段。

DnsConfig可选配置项目可用于任何dnsPolicy。但是,如果dnsPolicy设置为“无”,则必须指定dnsConfig配置项目。

以下是dnsConfig配置项目的可定义属性: