Как перенаправить трафик с .svc.cluster.local на .svc.k8s.my-domain.com в Кубернетесе?

#kubernetes #dns #yaml #coredns #yugabyte-db

Вопрос:

У моего кластера есть свое собственное доменное имя k8s.my-domain.com .

Первоначально, когда я развертывал Dgraph, я столкнулся с проблемой, из-за которой их модули не могут общаться друг с другом dgraph-service.dgraph-namespace.svc.cluster.local .

Если они разговаривают друг с другом по

  • dgraph-service.dgraph-namespace
  • dgraph-service.dgraph-namespace.svc.k8s.my-domain.com

это сработает.

Я исправил это, удалив .svc.cluster.local часть из Dgraph yaml и создав запрос на вытягивание по адресу https://github.com/dgraph-io/dgraph/pull/7976.

Сегодня, когда я развертываю Yugabyte, я снова столкнулся с той же проблемой. Я создал билет на https://github.com/yugabyte/yugabyte-operator/issues/38 и, надеюсь, команда Yugabyte сможет это исправить.

Однако я не уверен, что сейчас такой подход хорош. Я надеюсь, что смогу что-то сделать со своей стороны.

Есть ли способ перенаправить с .svc.cluster.local на .svc.k8s.my-domain.com ?
Может быть, в CoreDNS, чтобы мне не нужно было изменять исходный файл Dgraph или Yugabyte YAML? Спасибо!


ОБНОВЛЕНИЕ 1:

На основе предложения @CodeWizard и потому, что я получил предупреждение от своей среды разработки:

введите описание изображения здесь

Поэтому я попробовал обе версии:

 apiVersion: v1
kind: Service
metadata:
  name: external-service
spec:
  type: ExternalName
  externalName: k8s.my-domain.com
 

и

 apiVersion: v1
kind: Service
metadata:
  name: external-service
spec:
  type: ExternalName
  externalName: cluster.local
 

После применения этого файла yaml.

Тем не менее, я все равно получил ту же ошибку при развертывании Yugabyte в моем кластере.

Ответ №1:

Вы можете использовать ExternalName в своем сервисе.

 kind: "Service"
apiVersion: "v1"
metadata:
  name: "external-mysql-service"
spec:
  type: ExternalName
  externalName: example.domain.name
selector: {} # The selector field to leave blank.
 

Использование внешнего доменного имени

  • Использование внешних доменных имен упрощает управление внешней службой, поскольку вам не нужно беспокоиться об изменении IP-адресов внешней службы.
  • Вы можете использовать службу внешних имен для направления трафика во внешнюю службу.
  • Использование службы внешних доменных имен сообщает системе, что DNS-имя в externalName поле (example.domain.name в предыдущем примере) — это местоположение ресурса, который поддерживает службу.
  • Когда DNS-запрос выполняется против DNS-сервера Kubernetes, он возвращает externalName запись CNAME, в которой клиенту предлагается найти возвращенное имя, чтобы получить IP-адрес.

Комментарии:

1. Привет @CodeWizard Я не уверен, что правильно понял. На самом деле у меня возникли проблемы с развертыванием, например, Yugabyte в моем кластере, когда у моего кластера есть доменное имя. Если у моего кластера нет доменного имени, не возникнет проблем с развертыванием Yugabyte. Собственные службы Yugabyte пытаются общаться друг с другом yugabyte-service.yugabyte-namespace.svc.cluster.local , но это не удалось, потому что у моего кластера есть доменное имя k8s.my-domain.com . Если они поговорят друг с другом через yugabyte-service.yugabyte-namespace или yugabyte-service.yugabyte-namespace.svc.k8s.my-domain.com , это сработает.