Kubernetes 使用私有 DNS

Kubernetes use private DNS

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

我的 AKS(Azure Kubernetes 服务)运行 版本 1.17 已经使用了新的 coreDNS。

我的第一个尝试是通过配置 pods:

的 /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)

我错过了什么?

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

Custom upstream nameservers and stub domains do not affect Pods with a dnsPolicy set to “Default” or “None”.

If a Pod’s dnsPolicy is set to “ClusterFirst”, its name resolution is handled differently, depending on whether stub-domain and upstream DNS servers are configured.

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

Everyting 取决于 dnsPolicy 您在应用程序的部署配置文件中设置。

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

1. 许多 Linux 发行版(例如 Ubuntu),使用本地 DNS 解析器 默认(systemd 解析)。 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.

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

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

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

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