您的位置  > 互联网

与Pod的DNS你的工作负载可以使用DNS发现集群内的

可以使用 DNS 在集群中发现您的工作负载,本页介绍了其工作原理。

为 Pod 创建 DNS 记录。 您可以使用一致的 DNS 名称而不是 IP 地址进行访问。

发布有关 Pod 和 Pod 的信息,这些信息用于对 DNS 进行编程。 配置 Pod 的 DNS,以便运行的容器可以通过名称而不是 IP 找到服务。

给出了集群中定义的 DNS 名称。 默认情况下,客户端 Pod 的 DNS 搜索列表包括 Pod 自己的命名空间和集群的默认域。

名称空间

DNS 查询可能会返回不同的结果,具体取决于执行查询的 Pod 的命名空间。 不指定命名空间的 DNS 查询将仅限于 Pod 所在的命名空间。 要访问其他命名空间,您需要在 DNS 查询中指定命名空间。

例如,假设命名空间 test 中有一个 Pod,并且 prod 命名空间中有一个服务 data。

Pod查询数据时不会返回任何结果,因为使用了Pod的命名空间测试。

当 Pod 查询 data.prod 时,它会返回预期的结果,因为查询中指定了命名空间。

可以使用 Pod 中的 /etc/.conf 来扩展 DNS 查询。 为每个 Pod 配置此文件。 例如,数据查询可能会扩展为 data.test.svc..local。 该选项的值将用于扩展查询。 要了解有关 DNS 查询的更多信息,请参阅 .conf 手册页。

nameserver 10.32.0.10
search .svc.cluster.local svc.cluster.local cluster.local
options ndots:5

综上所述,命名空间 test 中的 Pod 可以成功解析 data.prod 或 data.prod.svc..local。

DNS记录

哪些对象将获得 DNS 记录?

以下部分详细介绍了支持的 DNS 记录类型和布局。 其他布局、名称或查询,即使它们碰巧起作用,也应被视为实现细节,并且将来可能会在没有警告的情况下进行更改。 有关最新规范,请参阅基于 DNS 的服务发现。

/AAAA记录

除无头之外的“正常”将被分配 my-svc.my-.svc.-. 形式的 DNS A 和/或 AAAA 记录,具体取决于 IP 协议套件(可能有多个)设置。 该名称将解析为相应的集群 IP。

那些没有集群 IP 的系统还将分配一个 DNS A 和/或 AAAA 记录,格式为 my-svc.my-.svc.-。 与正常情况不同的是,这条记录将被解析为与所选 Pod IP 对应的集合。 客户端需要能够使用这组 IP,或者使用标准轮换策略从这组 IP 中进行选择。

SRV记录

基于普通或无头的命名端口创建 SRV 记录。 对于每个命名端口,SRV 记录格式为 _port-name._port-.my-svc.my-.svc.-.。通常,该记录将被解析为端口号和域名:my-svc.my- .svc.-.. ,该记录会被解析成多条结果,服务的每个后端Pod一条SRV记录,其中包含Pod端口号和域名,格式为.my-svc.my- .svc.-..

PodA/AAAA 记录

在DNS规范实施之前,Kube-DNS版本使用以下DNS解析:

pod-ipv4-.my-.pod.-.

例如,对于位于 IP 地址为 172.17.0.3 的命名空间中的 Pod,如果集群的域名为 .local,则 Pod 将对应 DNS 名称:

172-17-0-3..pod..本地

所有公开的 Pod 都将具有以下可用的 DNS 解析名称:

pod-ipv4-.-name.my-.svc.-.

Pod 和字段

目前,当创建 Pod 时,其主机名(从 Pod 内部查看)取自 Pod 的 .name 值。

Pod 规范包含一个可选字段,可用于指定不同的主机名。 设置此字段后,它将优先于 Pod 的名称作为 Pod 的主机名(同样,从 Pod 内部查看)。 例如,给定一个具有规格的 Pod。 设置为“my-host”,Pod 的主机名将设置为“my-host”。

Pod 规范还有一个可选字段,可用于指示 Pod 是命名空间子组的一部分。 例如,某个 Pod 的规格。 设置为“foo”,规格。 设置为“bar”,在命名空间“my-”中,主机名设置为“foo”,相应的完全限定域名 (FQDN) 为“foo.bar.my-.svc.-”。 (再次从 Pod 内部看)。

如果 Pod 的命名空间中存在与子域同名的无头服务,则集群的 DNS 服务器还将返回 Pod 完全限定主机名的 A 和/或 AAAA 记录。

例子:

apiVersion: v1
kind: Service
metadata:
  name: busybox-subdomain
spec:
  selector:
    name: busybox
  clusterIP: None
  ports:
  - name: foo # 实际上不需要指定端口号
    port: 1234
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox1
  labels:
    name: busybox
spec:
  hostname: busybox-1
  subdomain: busybox-subdomain
  containers:
  - image: busybox:1.28
    command:
      - sleep
      - "3600"
    name: busybox
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox2
  labels:
    name: busybox
spec:
  hostname: busybox-2
  subdomain: busybox-subdomain
  containers:
  - image: busybox:1.28
    command:
      - sleep
      - "3600"
    name: busybox

鉴于上面的服务“-”和具有规格的 Pod。 设置为“-”,第一个 Pod 会将其自己的 FQDN 视为“-1.-.my-.svc.-.”。 DNS 将为该名称提供 A 记录和/或 AAAA 记录,指向 Pod 的 IP。 Pod“”和“”都会有自己的地址记录。

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

注意:由于 A 和 AAAA 记录不是根据 Pod 名称创建的,因此需要在生成 Pod 的 A 或 AAAA 记录之前设置它们。 未设置但已设置的 Pod 只会创建 A 或 AAAA 记录 (-.my-.svc.-.),用于无头指向 Pod 的 IP 地址。 另外,除非在服务上设置了sses=True,否则只有Pod准备好时对应的记录才会有。

Pod 的字段

功能状态:v1.22【】

当 Pod 配置了完全限定域名 (FQDN) 时,其主机名是短主机名。 例如,如果您有一个具有完全限定域名 -1.-.my-.svc.-. 的 Pod,则默认情况下该 Pod 中的命令会返回 -1,而 --fqdn 命令会返回 FQDN。

当 Pod 规范中设置:true 时,Pod 的完全限定域名(FQDN)将记录在 Pod 所在的命名空间中,作为 Pod 的主机名。 在这种情况下,--fqdn 都将返回 Pod 的完全限定域名。

阐明:

在 Linux 中,内核的主机名字段( 的字段)限制为最多 64 个字符。

如果 Pod 启用此功能并且其 FQDN 超过 64 个字符,则 Pod 启动将失败。 Pod 将保持不处于状态(如图所示)并生成错误事件,例如“从 Pod 到 FQDN,并且 -FQDN 太长(最大值为 64,70)”。 构造FQDN,FQDN long-FQDN太长,最多64个字符,请求的字符数为70)。 对于这种情况,改善用户体验的一种方法是创建一个在用户创建顶级对象(例如)时控制 FQDN 长度的方法。

Pod 的 DNS 策略

DNS 策略可以逐个 Pod 进行设置。 当前支持以下特定于 Pod 的 DNS 策略。 这些策略可以在 Pod 规范的字段中设置:

“None”:此设置允许 Pod 忽略环境中的 DNS 设置。 Pod 将使用其字段提供的 DNS 设置。 参见章节。

阐明:

"" 不是默认 DNS 策略。 如果没有明确指定,则使用“”。

下面的示例显示了一个 Pod,其 DNS 策略设置为“Net”,因为它已设置为 true。

apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default
spec:
  containers:
  - image: busybox:1.28
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
    name: busybox
  restartPolicy: Always
  hostNetwork: true
  dnsPolicy: ClusterFirstWithHostNet

Pod 的 DNS 配置

功能状态:v1.14【】

Pod 的 DNS 配置使用户可以更好地控制 Pod 的 DNS 设置。

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

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

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

//-dns.yaml

apiVersion: v1
kind: Pod
metadata:
  namespace: default
  name: dns-example
spec:
  containers:
    - name: test
      image: nginx
  dnsPolicy: "None"
  dnsConfig:
    nameservers:
      - 192.0.2.1 # 这是一个示例
    searches:
      - ns1.svc.cluster-domain.example
      - my.dns.search.suffix
    options:
      - name: ndots
        value: "2"
      - name: edns0

创建上述 Pod 后,容器测试将在其 /etc/.conf 文件中获取以下内容:

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

对于 IPv6 设置,搜索路径和名称服务器应设置如下:

kubectl exec -it dns-example -- cat /etc/resolv.conf

输出类似于:

nameserver 2001:db8:30::a
search default.svc.cluster-domain.example svc.cluster-domain.example cluster-domain.example
options ndots:5

DNS 搜索域列表限制

功能状态:1.28【】

它不限制 DNS 配置,最多可支持 32 个搜索域列表。 所有搜索域的总长度不超过2048。此限制分别适用于节点的解析器配置文件、Pod 的 DNS 配置和合并的 DNS 配置。

阐明:

某些早期版本的容器运行时可能对 DNS 搜索域的数量有自己的限制。 根据容器运行环境的不同,那些具有大量 DNS 搜索域的 Pod 可能会出现卡住的情况。

据了解,v1.5.5 或更早版本和 CRI-O v1.21 或更早版本存在此问题。

接下来是节点上的 DNS 解析

有关管理 DNS 配置的指南,请参阅配置 DNS 服务