【问题标题】:Kubernetes use private DNSKubernetes 使用私有 DNS
【发布时间】:2020-01-30 17:40:17
【问题描述】:

是否可以在 Kubernetes 中使用私有 DNS?例如,应用程序需要通过其主机名连接到外部数据库。解析 IP 的 DNS 条目存放在私有 DNS 中。

我的 AKS(Azure Kubernetes 服务)在 1.17 版上运行,该版本已使用新的 coreDNS。

我的第一次尝试是通过配置 pod 的 /etc/resolve.conf 文件,在 VM 上使用私有 DNS:

dnsPolicy: "None"
  dnsConfig:
    nameservers:
      - 10.76.xxx.xxx
      - 10.76.xxx.xxx
    searches:
      - az-q.example.com
    options:
      - name: ndots
        value: "2"

然后我尝试使用configmap来调整coreDNS:

apiVersion: v1
kind: ConfigMap
metadata:
  name: kube-dns
  namespace: kube-system
data:
  upstreamNameservers: |
    ["10.76.xxx.xxx", "10.76.xxx.xxx"]

但我的 pod 每次在部署时都会出错:

$ sudo kubectl logs app-homepage-backend-xxxxx -n ingress-nginx
events.js:174
      throw er; // Unhandled 'error' event
      ^
Error: getaddrinfo ENOTFOUND az-q.example.com az-q.example.com:636
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:56:26)

我错过了什么?

【问题讨论】:

    标签: kubernetes coredns


    【解决方案1】:

    一切都取决于您在应用程序的部署配置文件中设置的dnsPolicy

    当 Pod 的 dnsPolicy 设置为 “default”, 时,它会从运行 Pod 的节点继承名称解析配置。 Pod 的 DNS 解析应该与节点的行为相同。

    1. 许多 Linux 发行版(例如 Ubuntu)通过以下方式使用本地 DNS 解析器 默认(systemd-resolved)。 Systemd 解决的移动和替换 /etc/resolv.conf 带有可能导致致命转发的存根文件 解析上游服务器中的名称时循环。这可以修复 通过使用 kubelet 的 --resolv-conf 标志手动指向 正确的 resolv.conf(使用 systemd-resolved,这是 /run/systemd/resolve/resolv.conf)。 kubeadm (>= 1.11) 自动 检测到 systemd-resolved,并相应地调整 kubelet 标志。

    Kubernetes 安装不会将节点的 resolv.conf 文件配置为 默认使用集群 DNS,因为该过程本质上是 特定于分布。这可能应该实施 最终。

    2. Linux 的 libc 不可能被卡住(参见 2005 年的这个错误) 仅 3 个 DNS 名称服务器记录和 6 个 DNS 搜索记录的限制。 Kubernetes 需要消耗 1 个名称服务器记录和 3 个搜索 记录。这意味着如果本地安装已经使用 3 名称服务器或使用超过 3 次搜索,其中一些设置 会迷路。作为部分解决方法,该节点可以运行 dnsmasq 这将提供更多名称服务器条目,但不会提供更多搜索 条目。您也可以使用 kubelet 的 --resolv-conf 标志。

    3。确保您使用的不是 Alpine 3.3 或更早版本 您的基础映像,DNS 可能无法正常工作。

    请看这里:dns-kubernetes-known-issues

    【讨论】:

      【解决方案2】:

      为了满足您的需求,我会在 pod 清单中使用 dnsPolicy: ClusterFirst 定义,然后在集群 DNS 子系统中定义存根区域(私有 DNS 区域)。

      为了识别集群 DNS 堆栈,通常检查在 kube-system 命名空间中运行的 pod。您很可能会找到以下两者之一:CoreDNS 或 Kube-DNS。

      如果您的集群 DNS 在 CoreDNS 上运行,则在您的 coredns 配置映射中查找 this 类型的修改。 如果您在较旧的 Kube-DNS 系统上运行,则在 kube-dns configmap 中查找 this 修改。

      重要的是,如果您想将此修改应用于在主机网络模式下运行的 pod(许多来自 kube-system 命名空间的 pod),您需要使用 dnsPolicy: ClusterFirstWithHostNet 节修改它们的清单。

      【讨论】:

        【解决方案3】:

        在应用程序的部署配置中设置的dnsPolicy 是什么?根据this doc

        自定义上游名称服务器和存根域不会影响具有 dnsPolicy 设置为“Default”或“None”。

        如果 Pod 的 dnsPolicy 设置为“ClusterFirst”,则其名称解析为 处理方式不同,具体取决于存根域和上游 DNS 服务器已配置。

        请参阅该文档中的示例以及自定义配置会发生什么。

        【讨论】:

          猜你喜欢
          • 2021-08-28
          • 2012-09-26
          • 2016-12-06
          • 1970-01-01
          • 2020-05-07
          • 1970-01-01
          • 2013-05-06
          • 2018-11-30
          • 1970-01-01
          相关资源
          最近更新 更多