DNS
Stackland позволяет обращаться к сервисам кластера (как к Kubernetes API, так и к собственным сервисам, запущенным в кластере) извне по доменным именам.
Чтобы использовать DNS:
- Перед созданием кластера выделите кластеру доменную зону на внешнем DNS-сервере.
- Настройте делегирование выделенной доменной зоны: создайте NS- и A-записи для IP-адресов серверов с ролью
control-planeилиcombined. - Пропишите доменную зону в параметре
cluster.baseDomain.fqdnинсталлятора.
Stackland обеспечивает доступ к DNS на порту 53 (UDP и TCP) выбранных адресов.
Подзоны и правила создания записей
В выделенной для кластера зоне существуют следующие подзоны:
- системные записи — подзона используется для размещения записей системных сервисов Stackland;
- подзона svc — подзона используется для автоматического создания записей сервисов с типом
LoadBalancer; - корневая подзона — используется для размещения записей пользовательских сервисов.
Системные записи
Подзона sys.<домен кластера> предназначена для размещения записей системных сервисов Stackland. Чтобы предотвратить конфликты имен при добавлении новых системных сервисов, пользователь не может создавать записи в этой подзоне. Например, невозможно создать ресурс Ingress с доменом ingress.sys.<домен кластера>.
Примеры системных записей в подзоне:
api.sys.<домен кластера>— доступ к Kubernetes API;console.sys.<домен кластера>— доступ к консоли управления;grafana.sys.<домен кластера>— доступ к интерфейсу Grafana;storage.sys.<домен кластера>— доступ к Object Storage API.
Подзона svc
Подзона svc используется для автоматического создания DNS-записей для сервисов типа LoadBalancer.
Если пользователь не указал аннотацию dns.stackland.yandex.cloud/hostname, сервис будет доступен по умолчанию по следующему имени: <название сервиса>.<название проекта>.svc.<домен кластера>.
Рассмотрим пример создания сервиса без указания аннотации dns.stackland.yandex.cloud/hostname:
apiVersion: v1
kind: Service
metadata:
name: kafka01
namespace: billing
spec:
type: LoadBalancer
# ...
В этом случае сервис будет автоматически доступен по имени kafka01.billing.svc.<домен кластера>.
Корневая подзона
Корневая подзона предназначена для размещения пользовательских DNS-записей с помощью Ingress и Service с типом LoadBalancer. Пользователь может создавать в зоне произвольные записи, за исключением использования подзон sys и svc.
Примеры пользовательских записей:
phpmyadmin.<домен кластера>;phpmyadmin.warehouse.<домен кластера>;billing.prod.<домен кластера>;billing.test.<домен кластера>;pg01.bob.<домен кластера>.
Создание DNS-записей
Для HTTP-сервисов пользователь может создать DNS-запись с помощью ресурса Ingress. Пример конфигурации:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: phpmyadmin
spec:
ingressClassName: stackland-default
rules:
- host: phpmyadmin.<домен кластера> # это имя будет использовано для создания DNS-записи
# ...
Для прочих сервисов:
apiVersion: v1
kind: Service
metadata:
name: the-service
annotations:
dns.stackland.yandex.cloud/hostname: "the-service.<домен кластера>"
spec:
type: LoadBalancer
# ...
Ограничения:
- Stackland запрещает создание ресурсов, если значения параметра
hostв ресурсеIngressи аннотацииdns.stackland.yandex.cloud/hostnameв ресурсеServiceявляются поддоменамиsys.<домен кластера>иsvc.<домен кластера>; - Stackland не позволит создать ресурс
IngressилиService, если уже существует другой ресурс с таким же доменным именем.
Внешняя и внутренняя DNS-зоны
В системе используются две DNS-зоны:
- Внутренняя зона
*.cluster.local, за обслуживание которой отвечаетkube-dns. - Внешняя зона
*.<домен кластера>.
Сравнение зон
Примеры записей
Внутренняя зона (*.cluster.local) |
Внешняя зона (*.<домен кластера>) |
|---|---|
kubernetes.default.svc.cluster.local |
api.sys.<домен кластера> |
storage.stackland-object-storage.svc.cluster.local |
storage.sys.<домен кластера> |
pg01-rw.my-namespace.svc.cluster.local |
pg01-rw.my-namespace.svc.<домен кластера> |
redmine.redmine.svc.cluster.local |
redmine.<домен кластера> |
Результат разрешения
Внутренняя зона (*.cluster.local) |
Внешняя зона (*.<домен кластера>) |
|---|---|
| IP-адрес в overlay-сети | IP-адрес из диапазона LoadBalancer |
Кто использует записи
Внутренняя зона (*.cluster.local) |
Внешняя зона (*.<домен кластера>) |
|---|---|
| Сервисы, запущенные в кластере | Приложения, запущенные снаружи кластера, или пользователи |