【问题标题】:Adding nameservers to kubernetes将名称服务器添加到 Kubernetes
【发布时间】:2015-10-21 13:33:11
【问题描述】:

我正在使用 kube-up.sh 部署的 AWS 上使用 Kubernetes v1.0.6。
集群正在使用kube-dns

$ kubectl get svc kube-dns --namespace=kube-system
NAME       LABELS                                                                           SELECTOR           IP(S)       PORT(S)
kube-dns   k8s-app=kube-dns,kubernetes.io/cluster-service=true,kubernetes.io/name=KubeDNS   k8s-app=kube-dns   10.0.0.10   53/UDP

效果很好。

$ kubectl exec busybox -- nslookup kubernetes.default
Server:    10.0.0.10
Address 1: 10.0.0.10 ip-10-0-0-10.eu-west-1.compute.internal

Name:      kubernetes.default
Address 1: 10.0.0.1 ip-10-0-0-1.eu-west-1.compute.internal

这是一个 pod 的 resolv.conf

$ kubectl exec busybox -- cat /etc/resolv.conf
nameserver 10.0.0.10
nameserver 172.20.0.2
search default.svc.cluster.local svc.cluster.local cluster.local eu-west-1.compute.internal

是否可以让容器使用额外的名称服务器?

我有一个基于辅助 DNS 的服务发现(假设是 192.168.0.1),我希望我的 kubernetes 容器能够用于 dns 解析。

ps。 kubernetes 1.1 解决方案也是可以接受的:)

非常感谢您, 乔治

【问题讨论】:

  • 一种安全的方法可能是在skydns的配置中添加名称服务器,只是不确定在通过kube-up/push自动创建/升级集群时如何完成。

标签: dns kubernetes


【解决方案1】:

DNS addon README 对此有一些详细信息。基本上,该 pod 将继承它正在运行的节点的 resolv.conf 设置,因此您可以将额外的 DNS 服务器添加到节点的 /etc/resolv.confkubelet 还采用--resolv-conf argument,它可以为您提供更明确的方式来注入额外的 DNS 服务器。但是,我还没有在任何地方看到该标志。

【讨论】:

  • 有没有办法自动化这些过程,或者使它们成为 kube-up/kube-push 的一部分,以便将来对它们的更新不会破坏一切?
  • 此外,向/etc/resolvconf/resolv.conf.d/base 添加额外的名称服务器确实会让它们出现在容器的/etc/resolv.conf 文件中,但是由于kube 注入的前两个名称服务器已启动并运行,新的名称服务器将永远不会被查询。
  • 我不再使用kube-up.sh 流程,所以请对我所说的持保留态度(是的,我只是开了一个双关语)。但我认为要自动执行此操作,您可能必须在 cluster/saltbase/salt/kubelet/default 维护 Salt 模板的更改版本,为 master_kubelet_args 设置所需的选项。从长远来看可能并不理想,但在您查看它是否是一个解决方案时可能会有所帮助。
【解决方案2】:

在 Kuberenetes(可能)1.2 中,我们将转移到一个模型,其中 nameservers 被认为是可替代的。当不同的域名服务器为不同的 DNS 子集提供服务时,有太多解析器会中断,并且这里没有我们可以指出的真正规范。

换句话说,我们将开始从容器合并的 resolv.conf 中删除主机的名称服务器记录,并使我们自己的 DNS 服务器成为唯一的 nameserver 行。我们的 DNS 将能够将请求转发到上游域名服务器。

【讨论】:

  • 那么我们如何才能确保 dns 服务始终保持 100% 正常运行?目前,如果我们杀死一个 dns pod,dns 服务需要时间来反映它,因此一些 dns 查询失败并导致应用程序崩溃(为什么是不同的讨论,但我们不控制应用程序)。我想在 k8s 中有两个 dns 服务,以便容器可以使用两个服务器,即使一个返回失败另一个应该接,有没有更好的方法?
  • 您可以运行多个 DNS 服务器的副本,但您不能运行多个“不同”的 DNS 服务器并期望它们正常工作,除非它们具有相同的数据。
  • 是的,但是你可以让两台服务器拥有相同的数据......我现在在 10.3.0.10 和 10.3.0.11 上运行 kube-dns 和两个服务。每个服务都有一个或多个 pod 副本,这并不重要。这解决了我们的 dns 问题,因为当一个 pod 被重新定位时,一些请求在转换过程中失败,但是客户端 pod 的操作系统尝试另一个服务器并且应用程序没有看到失败。我们的问题是让 kubelet 将这两个名称服务器提供给 pod。我考虑过为整个 resolv.conf 提供服务,但我们会错过依赖于命名空间的搜索字段。
  • 如果应用程序对 dns 故障很敏感,特别是使用 alpine 中的 musl 之类的解析器,则当前具有单个 dns 服务器的模型确实无法正常工作。如果您愿意,很容易重现我将提交代码示例问题
  • 问题,我可以使用 8.8.8.8 和我的 kube dns 服务 ip 创建我自己的自定义 resolv.conf 并使用它吗?
【解决方案3】:

我最终设法通过配置 SkyDNS 以添加额外的名称服务器来轻松解决这个问题,您只需在 SkyDNS 复制控制器中添加 SkyDNS docs 中定义的环境变量 SKYDNS_NAMESERVERS。它影响很小,不依赖于节点更改等。

    env:
    - name: SKYDNS_NAMESERVERS
      value: 10.0.0.254:53,10.0.64.254:53

【讨论】:

  • 嘿,有没有办法添加/设置/修改这个环境变量,而不必自己定义整个 kube-dns 复制控制器?
【解决方案4】:

对于那些使用 Kubernetes kube-dns、标志 -nameservers 或环境变量 SKYDNS_NAMESERVERS 的用户不再可用。

Usage of /kube-dns:
  --alsologtostderr                  log to standard error as well as files
  --config-map string                config-map name. If empty, then the config-map will not used. Cannot be  used in conjunction with federations flag. config-map contains dynamically adjustable configuration.
  --config-map-namespace string      namespace for the config-map (default "kube-system")
  --dns-bind-address string          address on which to serve DNS requests. (default "0.0.0.0")
  --dns-port int                     port on which to serve DNS requests. (default 53)
  --domain string                    domain under which to create names (default "cluster.local.")
  --healthz-port int                 port on which to serve a kube-dns HTTP readiness probe. (default 8081)
  --kube-master-url string           URL to reach kubernetes master. Env variables in this flag will be expanded.
  --kubecfg-file string              Location of kubecfg file for access to kubernetes master service; --kube-master-url overrides the URL part of this; if neither this nor --kube-master-url are provided, defaults to service account tokens
  --log-backtrace-at traceLocation   when logging hits line file:N, emit a stack trace (default :0)
  --log-dir string                   If non-empty, write log files in this directory
  --log-flush-frequency duration     Maximum number of seconds between log flushes (default 5s)
  --logtostderr                      log to standard error instead of files (default true)
  --stderrthreshold severity         logs at or above this threshold go to stderr (default 2)
  -v, --v Level                      log level for V logs
  --version version[=true]           Print version information and quit
  --vmodule moduleSpec               comma-separated list of pattern=N settings for file-filtered logging

现在,要么将名称服务器放在主机 resolv.conf 上,因此 DNS 是从节点继承的,要么使用自定义 resolv.conf 并将其添加到带有标志 --resolv-conf 的 Kubelet,如 here 所解释的那样

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 2021-07-04
    相关资源
    最近更新 更多