Pod 的 DNS 策略

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

Pod 的 DNS 策略


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


  • "Default": Pod 从运行所在的节点继承名称解析配置。 参考相关讨论获取更多信息。default是以pod继承所在的节点的dns解析运行。
  • "ClusterFirst": 与配置的集群域后缀不匹配的任何 DNS 查询(例如 "www.kubernetes.io") 都会由 DNS 服务器转发到上游名称服务器。集群管理员可能配置了额外的存根域和上游 DNS 服务器。 参阅相关讨论 了解在这些场景中如何处理 DNS 查询的信息。 本地先解析,解析不了就转到上游服务器。
  • "ClusterFirstWithHostNet": 对于以 hostNetwork 方式运行的 Pod,应将其 DNS 策略显式设置为 "ClusterFirstWithHostNet"。否则,以 hostNetwork 方式和 "ClusterFirst" 策略运行的 Pod 将会做出回退至 "Default" 策略的行为。  
  • hostNetwork 是一种直接暴露端口的行为。
  • 在yaml里面加了  hostNetwork: true 的机器的一种补救措施,这种方式会使用本pod下的/etc/resolv.conf中的默认的coredns 解析,好处是又可以hostNetwork又可以在k8s集群内解析到。

  

“hostnetwork:true”:一种直接定义pod网络的方式。 pod中使用“hostnetwork:true”配置网络,pod中运行的应用程序可以直接看到宿主主机的网络接口,宿主机所在的局域网上所有的网络接口都可以访问到该应用程序和端口。

 

注:dnsPolicy: ClusterFirstWithHostNet

 

该设置是使POD使用k8s的dns,dns配置在/etc/resolv.conf文件中,如果不加,pod默认使用所在宿主主机使用的DNS,这样会导致容器内不能通过service name 访问k8s集群中其他的pod。

 

    • 注意:这在 Windows 上不支持。 有关详细信息,请参见下文
  • "None": 此设置允许 Pod 忽略 Kubernetes 环境中的 DNS 设置。Pod 会使用其 dnsConfig 字段所提供的 DNS 设置。 参见 Pod 的 DNS 配置节。

说明:

"Default" 不是默认的 DNS 策略。如果未明确指定 dnsPolicy,则使用 "ClusterFirst"。

"Default": Pod 从运行所在的节点继承名称解析配置。 参考相关讨论获取更多信息。
"ClusterFirst": 与配置的集群域后缀不匹配的任何 DNS 查询(例如 "www.kubernetes.io") 都会由 DNS 服务器转发到上游名称服务器。集群管理员可能配置了额外的存根域和上游 DNS 服务器。 参阅相关讨论 了解在这些场景中如何处理 DNS 查询的信息。
"ClusterFirstWithHostNet": 对于以 hostNetwork 方式运行的 Pod,应将其 DNS 策略显式设置为 "ClusterFirstWithHostNet"。否则,以 hostNetwork 方式和 "ClusterFirst" 策略运行的 Pod 将会做出回退至 "Default" 策略的行为。
注意:这在 Windows 上不支持。 有关详细信息,请参见下文。
"None": 此设置允许 Pod 忽略 Kubernetes 环境中的 DNS 设置。Pod 会使用其 dnsConfig 字段所提供的 DNS 设置。 参见 Pod 的 DNS 配置节。
说明:
"Default" 不是默认的 DNS 策略。如果未明确指定 dnsPolicy,则使用 "ClusterFirst"

kubernetes可以在pod级别通过 dnspolicy字段设置DNS策略。目前支持的DNS策略如下:
Default: 继承pod所在宿主机的域名解析设置。
ClusterFirst: 将优先使用kubernetes环境的dns服务(如coreDNS提供的域名解析服务),将无法解析的域名转发到系统配置的上游DNS服务器。
ClusterFirstWithHostNet: 适用与以hostNetwork模式运行的pod。
None: 忽略集群的DNS配置,需要手工通过dnsConfig自定义DNS配置。这个选项在1.9版本中开始引入,到1.10版本时升级为Beta,到1.14版本时达到稳


下面的示例显示了一个 Pod,其 DNS 策略设置为 "ClusterFirstWithHostNet", 因为它已将 hostNetwork 设置为 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 配置
特性状态: Kubernetes v1.14 [stable]
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 示例:

service/networking/custom-dns.yaml Copy service/networking/custom-dns.yaml to clipboard
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 后,容器 test 会在其 /etc/resolv.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 搜索域列表限制 
特性状态: Kubernetes 1.26 [beta]
Kubernetes 本身不限制 DNS 配置,最多可支持 32 个搜索域列表,所有搜索域的总长度不超过 2048。 此限制分别适用于节点的解析器配置文件、Pod 的 DNS 配置和合并的 DNS 配置。

说明:
早期版本的某些容器运行时可能对 DNS 搜索域的数量有自己的限制。 根据容器运行环境,那些具有大量 DNS 搜索域的 Pod 可能会卡在 Pending 状态。

众所周知 containerd v1.5.5 或更早版本和 CRI-O v1.21 或更早版本都有这个问题。

 

apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors
        health
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          pods insecure
          upstream
          fallthrough in-addr.arpa ip6.arpa
        }
        prometheus :9153
        proxy . 10.xxx.51.xxx
        cache 30
    }
kind: ConfigMap
metadata:
  creationTimestamp: 2018-08-22T03:41:51Z
  name: coredns
  namespace: kube-system
  resourceVersion: "73641895"
  selfLink: /api/v1/namespaces/kube-system/configmaps/coredns
  uid: 4e004e43-a5bd-11e8-a33b-060eb4000e9d

 

posted @ 2023-04-10 10:45  滴滴滴  阅读(413)  评论(0编辑  收藏  举报