Dns 向kubernetes添加名称服务器
我正在AWS上使用Kubernetes v1.0.6,该版本已使用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
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复制控制器?