将名称服务器添加到 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"