Добавление серверов имен в kubernetes

Я использую Kubernetes v1.0.6 на AWS, который был развернут с использованием 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

Это 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.

пс. Решение kubernetes 1.1 также будет приемлемым:)

Спасибо большое заранее, Джордж

5 ответов

Решение

В конце концов мне удалось довольно легко решить эту проблему, настроив SkyDNS для добавления дополнительного сервера имен, вы можете просто добавить переменную среды SKYDNS_NAMESERVERS как определено в документации SkyDNS в вашем контроллере репликации SkyDNS. Это оказывает минимальное влияние и не зависит от изменений узла и т. Д.

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

DNS-аддон README содержит некоторые подробности об этом. По сути, стручок унаследует resolv.conf настройка узла, на котором он работает, чтобы вы могли добавить свой дополнительный DNS-сервер к узлам /etc/resolv.conf, kubelet также занимает --resolv-conf аргумент, который может предоставить более явный способ для вас ввести дополнительный DNS-сервер. Однако я пока не вижу, чтобы этот флаг был задокументирован.

Вам нужно знать IP-адрес вашего основного DNS, чтобы установить его в качестве вторичного DNS.

Запустите эту команду, чтобы получить IP-адрес CoreDNS:

      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

Вот как я настраиваю DNS в своем развертывании yaml.

Я разместил IP-адрес Google DNS (для ясности) и свой IP-адрес CoreDNS, но вы должны использовать свой 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"

В Kuberenetes (вероятно) 1.2 мы перейдем к модели, где nameservers считаются взаимозаменяемыми. Существует слишком много распознавателей, которые ломаются, когда разные серверы имен обслуживают разные подмножества DNS, и здесь нет реальной спецификации, на которую мы можем указать.

Другими словами, мы начнем отбрасывать записи сервера имен хоста из объединенного resolv.conf контейнера и делать наш собственный DNS-сервер единственным nameserver линия. Наш DNS сможет пересылать запросы вышестоящим серверам имен.

Для тех, кто знаком с 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 и добавить его в Kubelet с флагом --resolv-conf как объяснено здесь

Другие вопросы по тегам