Согласованный DNS между Kubernetes и docker-compose
Насколько мне известно, это скорее вопрос разработки, чем вопрос о сервере, но он лежит на грани двух, поэтому не стесняйтесь переходить на serverfault.com, если это общее мнение).
У меня есть служба, давайте назовем это web
и объявлено в docker-compose.yml
файл следующим образом:
web:
image: webimage
command: run start
build:
context: ./web
dockerfile: Dockerfile
Перед этим у меня есть обратный прокси-сервер под управлением Apache Traffic Server. В конфигурационном файле переназначения URL есть простое правило отображения
map / http://web/
Таким образом, все входящие запросы отображаются на web
Сервис описан выше. Это работает просто peachily в docker-compose
Однако, когда я перевожу сервис в kubernetes со следующим описанием сервиса:
apiVersion: v1
kind: Service
metadata:
labels:
io.kompose.service: web
name: web
spec:
clusterIP: None
ports:
- name: headless
port: 55555
targetPort: 0
selector:
io.kompose.service: web
status:
loadBalancer: {}
... сервер трафика жалуется, потому что не может разрешить имя DNS web
,
Я могу решить эту проблему, слегка изменив поведение DNS сервера трафика со следующим изменением конфигурации:
CONFIG proxy.config.dns.search_default_domains INT 1
(см. https://docs.trafficserver.apache.org/en/7.1.x/admin-guide/files/records.config.en.html).
Это изменение конфигурации описывается следующим образом:
Traffic Server может попытаться разрешить неквалифицированные имена хостов путем расширения до локального домена. Например, если клиент отправляет запрос неквалифицированному хосту (например, host_x), а локальным доменом Traffic Server является y.com, то Traffic Server расширит имя хоста до host_x.y.com.
Теперь все работает просто отлично в kubernetes.
Тем не менее, когда работает в docker-compose
, Traffic-сервер жалуется на невозможность разрешить web
,
Итак, я могу заставить все работать на обеих платформах, но для этого требуются изменения конфигурации. Я мог бы запустить скрипт запуска для сервера трафика, чтобы определить, работаем ли мы в kube или docker, и написать строку конфигурации выше в зависимости от того, где мы работаем, но в идеале я хотел бы, чтобы DNS был согласованным на разных платформах., Мое понимание DNS (и в частности DNS-доменов по умолчанию / локальных доменов) неоднозначно.
Есть указатели? В идеале, локальный домен для docker-compose кажется подходящим вариантом.
2 ответа
По умолчанию локальный домен kubernetes является
default.svc.cluster.local
Это означает, что полное имя web
сервис под кубернетесом есть web.default.svc.cluster.local
Итак, в docker-compose
файл, в разделе конфигурации сервера трафика, я могу создать псевдоним для web
как web.default.svc.cluster.local
со следующим docker-compose.yml
синтаксис:
version: "3"
services:
web:
# ...
trafficserver:
# ...
links:
- "web:web.default.svc.cluster.local"
и обновите конфигурацию сопоставления на сервере трафика:
map / http://web.default.svc.cluster.local/
а теперь web
услуга доступна с использованием одного и того же доменного имени через docker-compose
а также kubernetes
,
Я нашел ту же проблему, но решил ее по-другому, после очень мучительной отладки.
С CONFIG proxy.config.dns.search_default_domains INT 1
Apache Traffic Server добавит имена, найденные в search
в /etc/resolve.conf по одному, пока не получит удар.
В моем случае resol.conf указывает на company.intra
чтобы я мог назвать свои сервисы (все сервисы, используемые с Apache Traffic Server) в соответствии с этим
version: '3.2'
services:
# this hack is ugly but we need to name this
# (and all other service called from ats), with
# the same name as found under search in /etc/resolve.conf)
web.company.intra:
image: web-image:1.0.0
С этим изменением мне вообще не нужно вносить какие-либо изменения в remap.config, используемый URL-адрес по-прежнему может быть только "веб", поскольку он расширяется до имени, которое соответствует обеим средам,web.company.intra
в docker.composeweb.default.svc.local.cluster
в Куберне