Pod 与 Service 的 DNS

    Kubernetes DNS 在群集上调度 DNS Pod 和服务,并配置 kubelet 以告知各个容器使用 DNS 服务的 IP 来解析 DNS 名称。

    在集群中定义的每个 Service(包括 DNS 服务器自身)都会被指派一个 DNS 名称。 默认,一个客户端 Pod 的 DNS 搜索列表将包含该 Pod 自己的名字空间和集群默认域。 如下示例是一个很好的说明:

    假设在 Kubernetes 集群的名字空间 中,定义了一个服务 foo。 运行在名字空间 bar 中的 Pod 可以简单地通过 DNS 查询 foo 来找到该服务。 运行在名字空间 quux 中的 Pod 可以通过 DNS 查询 foo.bar 找到该服务。

    以下各节详细介绍了受支持的记录类型和支持的布局。 其它布局、名称或者查询即使碰巧可以工作,也应视为实现细节, 将来很可能被更改而且不会因此出现警告。 有关最新规范请查看 。

    A/AAAA 记录

    “普通” 服务(除了无头服务)会以 my-svc.my-namespace.svc.cluster-domain.example 这种名字的形式被分配一个 DNS A 或 AAAA 记录,取决于服务的 IP 协议族。 该名称会解析成对应服务的集群 IP。

    “无头(Headless)” 服务(没有集群 IP)也会以 my-svc.my-namespace.svc.cluster-domain.example 这种名字的形式被指派一个 DNS A 或 AAAA 记录, 具体取决于服务的 IP 协议族。 与普通服务不同,这一记录会被解析成对应服务所选择的 Pod 集合的 IP。 客户端要能够使用这组 IP,或者使用标准的轮转策略从这组 IP 中进行选择。

    SRV 记录

    Kubernetes 会为命名端口创建 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 的域名。

    A/AAAA 记录

    一般而言,Pod 会对应如下 DNS 名字解析:

    pod-ip-address.my-namespace.pod.cluster-domain.example

    例如,对于一个位于 default 名字空间,IP 地址为 172.17.0.3 的 Pod, 如果集群的域名为 cluster.local,则 Pod 会对应 DNS 名称:

    172-17-0-3.default.pod.cluster.local.

    Deployment 或通过 Service 暴露出来的 DaemonSet 所创建的 Pod 会有如下 DNS 解析名称可用:

    pod-ip-address.deployment-name.my-namespace.svc.cluster-domain.example.

    当前,创建 Pod 时其主机名取自 Pod 的 metadata.name 值。

    Pod 规约还有一个可选的 subdomain 字段,可以用来指定 Pod 的子域名。 举个例子,某 Pod 的 hostname 设置为 “foo”,subdomain 设置为 “bar”, 在名字空间 “my-namespace” 中对应的完全限定域名(FQDN)为 “foo.bar.my-namespace.svc.cluster-domain.example”。

    示例:

    如果某无头服务与某 Pod 在同一个名字空间中,且它们具有相同的子域名, 集群的 DNS 服务器也会为该 Pod 的全限定主机名返回 A 记录或 AAAA 记录。 例如,在同一个名字空间中,给定一个主机名为 “busybox-1”、 子域名设置为 “default-subdomain” 的 Pod,和一个名称为 “default-subdomain” 的无头服务,Pod 将看到自己的 FQDN 为 “busybox-1.default-subdomain.my-namespace.svc.cluster-domain.example“。 DNS 会为此名字提供一个 A 记录或 AAAA 记录,指向该 Pod 的 IP。 “busybox1” 和 “busybox2” 这两个 Pod 分别具有它们自己的 A 或 AAAA 记录。

    Endpoints 对象可以为任何端点地址及其 IP 指定 hostname

    Pod 的 setHostnameAsFQDN 字段

    FEATURE STATE: Kubernetes v1.19 [alpha]

    前置条件SetHostnameAsFQDN 必须在 API 服务器 上启用。

    当你在 Pod 规约中设置了 setHostnameAsFQDN: true 时,kubelet 会将 Pod 的全限定域名(FQDN)作为该 Pod 的主机名记录到 Pod 所在名字空间。 在这种情况下,hostnamehostname --fqdn 都会返回 Pod 的全限定域名。

    DNS 策略可以逐个 Pod 来设定。目前 Kubernetes 支持以下特定 Pod 的 DNS 策略。 这些策略可以在 Pod 规约中的 dnsPolicy 字段设置:

    • ClusterFirst“: 与配置的集群域后缀不匹配的任何 DNS 查询(例如 “www.kubernetes.io”) 都将转发到从节点继承的上游名称服务器。集群管理员可能配置了额外的存根域和上游 DNS 服务器。 参阅 了解在这些场景中如何处理 DNS 查询的信息。
    • ClusterFirstWithHostNet“:对于以 hostNetwork 方式运行的 Pod,应显式设置其 DNS 策略 “ClusterFirstWithHostNet“。
    • None“: 此设置允许 Pod 忽略 Kubernetes 环境中的 DNS 设置。Pod 会使用其 dnsConfig 字段 所提供的 DNS 设置。 参见 Pod 的 DNS 配置节。

    下面的示例显示了一个 Pod,其 DNS 策略设置为 “ClusterFirstWithHostNet“, 因为它已将 hostNetwork 设置为 true

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. name: busybox
    5. namespace: default
    6. containers:
    7. - image: busybox:1.28
    8. command:
    9. - sleep
    10. imagePullPolicy: IfNotPresent
    11. name: busybox
    12. restartPolicy: Always
    13. hostNetwork: true
    14. dnsPolicy: ClusterFirstWithHostNet

    Pod 的 DNS 配置

    Pod 的 DNS 配置可让用户对 Pod 的 DNS 设置进行更多控制。

    dnsConfig 字段是可选的,它可以与任何 dnsPolicy 设置一起使用。 但是,当 Pod 的 dnsPolicy 设置为 “None“ 时,必须指定 dnsConfig 字段。

    用户可以在 dnsConfig 字段中指定以下属性:

    • nameservers:将用作于 Pod 的 DNS 服务器的 IP 地址列表。 最多可以指定 3 个 IP 地址。当 Pod 的 dnsPolicy 设置为 “None“ 时, 列表必须至少包含一个 IP 地址,否则此属性是可选的。 所列出的服务器将合并到从指定的 DNS 策略生成的基本名称服务器,并删除重复的地址。

    • searches:用于在 Pod 中查找主机名的 DNS 搜索域的列表。此属性是可选的。 指定此属性时,所提供的列表将合并到根据所选 DNS 策略生成的基本搜索域名中。 重复的域名将被删除。Kubernetes 最多允许 6 个搜索域。

    • options:可选的对象列表,其中每个对象可能具有 name 属性(必需)和 value 属性(可选)。 此属性中的内容将合并到从指定的 DNS 策略生成的选项。 重复的条目将被删除。

    以下是具有自定义 DNS 设置的 Pod 示例:

    创建上面的 Pod 后,容器 test 会在其 /etc/resolv.conf 文件中获取以下内容:

    1. nameserver 1.2.3.4
    2. search ns1.svc.cluster-domain.example my.dns.search.suffix
    3. options ndots:2 edns0

    对于 IPv6 设置,搜索路径和名称服务器应按以下方式设置:

    输出类似于

    1. nameserver fd00:79:30::a
    2. search default.svc.cluster-domain.example svc.cluster-domain.example cluster-domain.example

    Pod DNS 配置和 DNS 策略 ““ 的可用版本对应如下所示。

    有关管理 DNS 配置的指导,请查看 配置 DNS 服务