Добавление серверов имен в 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
как объяснено здесь