将名称服务器添加到 kubernetes
Adding nameservers to kubernetes
我在使用 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 的服务发现 Oon 假设 192.168.0.1) 我希望我的 kubernetes 容器能够用于 dns 解析。
ps。 kubernetes 1.1 解决方案也是可以接受的:)
非常感谢您,
乔治
DNS addon README has some details on this. Basically, the pod will inherit the resolv.conf
setting of the node it is running on, so you could add your extra DNS server to the nodes' /etc/resolv.conf
. The kubelet
also takes a --resolv-conf
argument 可以为您提供更明确的方式来注入额外的 DNS 服务器。但是,我还没有在任何地方看到该标志的记录。
在 Kuberenetes(可能)1.2 中,我们将转向 nameservers
被假定为可替代的模型。当不同的名称服务器服务于不同的 DNS 子集时,有太多的解析器会中断,并且这里没有我们可以指向的真正规范。
换句话说,我们将开始从容器的合并 resolv.conf 中删除主机的名称服务器记录,并使我们自己的 DNS 服务器成为唯一的 nameserver
行。我们的 DNS 将能够将请求转发到上游域名服务器。
我最终设法通过配置 SkyDNS 添加一个额外的名称服务器很容易地解决了这个问题,您只需添加 SkyDNS 复制控制器中 SkyDNS docs 中定义的环境变量 SKYDNS_NAMESERVERS
。它的影响很小,并且不依赖于节点更改等。
env:
- name: SKYDNS_NAMESERVERS
value: 10.0.0.254:53,10.0.64.254:53
对于那些使用 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
并使用标志 [=16] 将其添加到 Kubelet =] 如解释的那样 here
您需要知道核心 DNS 的 IP 才能将其设置为辅助 DNS
运行 获取 CoreDNS IP 的命令:
kubectl -n kube-system get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 172.20.0.10 <none> 53/UDP,53/TCP 43d
metrics-server ClusterIP 172.20.232.147 <none> 443/TCP 43d
这就是我在部署 yaml 中设置 DNS 的方式。
我发布了 Google DNS IP(为清楚起见)和我的 CoreDNS IP,但你应该使用你的 VPC DNS 和你的 CoreDNS 服务器。
containers:
- name: nginx
image: nginx
ports:
- containerPort: 8080
dnsPolicy: None
dnsConfig:
nameservers:
- 8.8.8.8
- 172.20.0.10
searches:
- 1b.svc.cluster.local
- svc.cluster.local
- cluster.local
- ec2.internal
options:
- name: ndots
value: "5"
我在使用 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 的服务发现 Oon 假设 192.168.0.1) 我希望我的 kubernetes 容器能够用于 dns 解析。
ps。 kubernetes 1.1 解决方案也是可以接受的:)
非常感谢您, 乔治
DNS addon README has some details on this. Basically, the pod will inherit the resolv.conf
setting of the node it is running on, so you could add your extra DNS server to the nodes' /etc/resolv.conf
. The kubelet
also takes a --resolv-conf
argument 可以为您提供更明确的方式来注入额外的 DNS 服务器。但是,我还没有在任何地方看到该标志的记录。
在 Kuberenetes(可能)1.2 中,我们将转向 nameservers
被假定为可替代的模型。当不同的名称服务器服务于不同的 DNS 子集时,有太多的解析器会中断,并且这里没有我们可以指向的真正规范。
换句话说,我们将开始从容器的合并 resolv.conf 中删除主机的名称服务器记录,并使我们自己的 DNS 服务器成为唯一的 nameserver
行。我们的 DNS 将能够将请求转发到上游域名服务器。
我最终设法通过配置 SkyDNS 添加一个额外的名称服务器很容易地解决了这个问题,您只需添加 SkyDNS 复制控制器中 SkyDNS docs 中定义的环境变量 SKYDNS_NAMESERVERS
。它的影响很小,并且不依赖于节点更改等。
env:
- name: SKYDNS_NAMESERVERS
value: 10.0.0.254:53,10.0.64.254:53
对于那些使用 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
并使用标志 [=16] 将其添加到 Kubelet =] 如解释的那样 here
您需要知道核心 DNS 的 IP 才能将其设置为辅助 DNS
运行 获取 CoreDNS IP 的命令:
kubectl -n kube-system get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 172.20.0.10 <none> 53/UDP,53/TCP 43d
metrics-server ClusterIP 172.20.232.147 <none> 443/TCP 43d
这就是我在部署 yaml 中设置 DNS 的方式。
我发布了 Google DNS IP(为清楚起见)和我的 CoreDNS IP,但你应该使用你的 VPC DNS 和你的 CoreDNS 服务器。
containers:
- name: nginx
image: nginx
ports:
- containerPort: 8080
dnsPolicy: None
dnsConfig:
nameservers:
- 8.8.8.8
- 172.20.0.10
searches:
- 1b.svc.cluster.local
- svc.cluster.local
- cluster.local
- ec2.internal
options:
- name: ndots
value: "5"