ExternalName, указывающее на службу в другом пространстве имен, не разрешается, если не указано полное FQDN - PullRequest
1 голос
/ 05 марта 2020

У меня есть служба my-service типа ClusterIP в пространстве имен A, которая может балансировать нагрузку до нескольких модулей. Я хочу создать другую службу типа ExternalName в пространстве имен B, которая указывает на my-service в пространстве имен A.

Я создаю следующий YAML:

apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: B
spec:
  type: ExternalName
  externalName: my-service.A

, и если я exe c в модуль, работающий в пространстве имен B и выполните:

# ping my-service
ping: my-service: Name or service not known

Но если я заменим externalName в вышеприведенном YAML на следующее:

apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: B
spec:
  type: ExternalName
  externalName: my-service.A.svc.cluster.local   <--- full FQDN here

работать как положено. Кроме того, если я пингую my-service напрямую из модуля в пространстве имен B, это разрешается:

# ping my-service.A
PING my-service.A.svc.cluster.local (10.0.80.133) 56(84) bytes of data.

Почему my-service.A не разрешается до my-service.A.svc.cluster.local в Службе ExternalName?

Моя версия K8s 1.14.8 и использует CoreDNS.

1 Ответ

1 голос
/ 06 марта 2020

На основе документации kubernetes и okd вот как это должно работать

Kubernetes DNS планирует DNS Pod и службу в кластере и настраивает kubelets, чтобы указать отдельным контейнерам использовать IP-адрес службы DNS для разрешения имен DNS.

Какие объекты получают имена DNS?

Каждой службе, определенной в кластере (включая сам DNS-сервер), назначается DNS-имя По умолчанию список поиска клиентского модуля DNS включает собственное пространство имен модуля и домен кластера по умолчанию .


Службам присваивается запись DNS A или AAAA, в зависимости от семейства IP-адресов службы, для имени в форме my-sv c. my-namespace.sv c .Cluster-domain.example . Это разрешает IP-адрес кластера Службы.


Есть журналы от kubedns, когда вы хотите использовать my-service.A

I0306 09:44:32.424126       1 logs.go:41] skydns: incomplete CNAME chain from "my-service.dis.": rcode 3 is not equal to success

Вот почему вам нужно весь путь к службе, который в вашей ситуации равен

my-service.A.svc.cluster.local

, поскольку

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


Я надеюсь, что это ответь на свой вопрос Дайте мне знать, если у вас есть еще вопросы.

...