Dns 向kubernetes添加名称服务器

Dns 向kubernetes添加名称服务器,dns,kubernetes,Dns,Kubernetes,我正在AWS上使用Kubernetes v1.0.6,该版本已使用kube up.sh 群集正在使用kube dns $ kubectl get svc kube-dns --namespace=kube-system NAME LABELS SELECTOR IP(S) PORT(S) kube-dns

我正在AWS上使用Kubernetes v1.0.6,该版本已使用
kube up.sh

群集正在使用
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解决方案也可接受:)

事先非常感谢, 乔治对此有一些细节。基本上,pod将继承其运行的节点的
resolv.conf
设置,因此您可以将额外的DNS服务器添加到节点的
/etc/resolv.conf
kubelet
还采用了一种更为明确的方法来注入额外的DNS服务器。但是,我还没有看到该标志在任何地方被记录在案。

在Kuberenetes(可能)1.2中,我们将移动到一个模型,在该模型中,
名称服务器
被假定为可替换的。当不同的名称服务器为不同的DNS子集提供服务时,有太多的解析程序会中断,并且这里没有我们可以指出的真正规范


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

我最终通过配置SkyDNS来添加一个额外的名称服务器,非常轻松地解决了这个问题,您只需添加SkyDNS复制控制器中定义的环境变量
SkyDNS\u名称服务器
。它的影响最小,不依赖于节点更改等

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

对于那些使用Kubernetes
kube dns
,flag
-nameservers
或环境变量
SKYDNS\u 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
,并将其添加到Kubelet中,如前所述,标记为
--resolv conf
,是否有办法使这些过程自动化,或使它们成为kube up/kube push的一部分,以使将来对它们的更新不会破坏一切?此外,在
/etc/resolvconf/resolv.conf.d/base
中添加额外的名称服务器确实会让它们显示在容器的
/etc/resolv.conf
文件中,但是由于kube注入的前两个名称服务器已经启动并运行,新的名称服务器将永远不会被查询。我不再使用
kube up.sh
过程,所以,请恕我直言(是的,我只是说了个双关语)。但我认为要实现自动化,您可能必须在
cluster/saltbase/Salt/kubelet/default
中维护一个修改过的Salt模板版本,该模板为
master\u kubelet\u args
设置所需的选项。从长远来看,这可能并不理想,但在您了解这是否是一个解决方案时可能会有所帮助。一个安全的方法可能是在skydns的配置中添加名称服务器,只是不确定在通过
kube up/push
自动创建/升级群集时如何实现。那么,我们如何确保dns服务始终100%运行?目前,如果我们杀死一个dns吊舱,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服务器的当前模型确实无法正常工作。如果您需要,可以很容易地复制。我将用code samplesQuestion提交一个问题。我可以用8.8.8.8和我的kube dns服务ip创建一个自定义resolv.conf并使用它吗?嘿,有没有一种方法可以添加/设置/修改此环境变量,而不必自己定义整个kube dns复制控制器?