В данном подразделе описана архитектура подсистемы Network (сетевой подсистемы) Deckhouse Kubernetes Platform (DKP).
В подсистему Network входят следующие модули:
Также в подразделе описаны:
Модуль ingress-nginx устанавливает и управляет Ingress NGINX Controller с помощью кастомного ресурса IngressNginxController.
Модуль может работать в режиме высокой доступности (HA) и предоставляет гибкие настройки размещения Ingress-контроллеров на узлах кластера, а также параметры работы контроллера с учетом особенностей реализации инфраструктуры.
Модуль поддерживает запуск и раздельную конфигурацию нескольких экземпляров Ingress NGINX Controller. Это позволяет, например, разделять внешние и внутренние (intranet) Ingress-ресурсы приложений.
Для упрощения схемы приняты следующие допущения: На схеме показано, что контейнеры разных подов взаимодействуют друг с другом напрямую. Фактически они взаимодействуют через соответствующие сервисы Kubernetes (внутренние балансировщики). Названия сервисов не указываются, если они очевидны из контекста. В остальных случаях название сервиса указано над стрелкой. Поды могут быть запущены в нескольких репликах, однако на схеме все поды изображены в одной реплике.
Архитектура модуля ingress-nginx на уровне 2 модели C4 и его взаимодействия с другими компонентами Deckhouse Kubernetes Platform (DKP) изображены на следующей диаграмме:
Модуль состоит из следующих компонентов:
1. Controller-nginx (Advanced DaemonSet) — нестандартный DaemonSet с продвинутыми возможностями, управляемый kruise-controller-manager.
Состоит из следующих контейнеров:
2. Validator-nginx (Deployment) — состоит из одного контейнера. Validator — это Ingress NGINX Controller, запущенный в режиме валидации и обладающий ограниченным набором привилегий. Реализует вебхук-сервер, используемый для проверки Ingress-ресурсов через механику Validating Admission Controllers.
3. Kruise-controller-manager (Deployment) — контроллер, управляющий кастомным ресурсом Advanced DaemonSet. Данное расширение DaemonSet позволяет использовать продвинутые возможности при обновлении Ingress NGINX controller, отсутствующие в стандартной реализации DaemonSet-контроллера Kubernetes.
Состоит из следующих контейнеров:
4. Failover-cleaner (DaemonSet) — развертывается на узлах кластера, на которых установлен лейбл ingress-nginx-controller.deckhouse.io/need-hostwithfailover-cleanup=true. Представляет собой bash-скрипт, который актуализирует правила iptables в зависимости от используемого инлета контроллера. При штатной работе ingress-controller компонент failover-cleaner не запущен ни на одном узле.
Модуль взаимодействует со следующими компонентами:
1. Kube-apiserver:
2. Dex-authenticator служебных сервисов и пользовательских приложений — используется для аутентификации запросов в dex через dex-authenticator, которые выполняют функции OAuth2 Proxy.
3. Служебные сервисы DKP (Console, Dashboard, Grafana и прочие) — модуль перенаправляет HTTP-запросы, прошедшие аутентификацию через Dex.
4. Пользовательские сервисы, развернутые в DKP — модуль перенаправляет на них внешние HTTP-запросы. Для этого пользователь должен создать соответствующие Ingress-ресурсы, а также кастомный ресурс DexAuthenticator, если требуется аутентификация через Dex.
Для упрощения схемы на ней изображены взаимодействия ingress-controller только c одним служебным сервисом DKP — компонентом frontend модуля console и соответствующим console-dex-authenticator.
С модулем взаимодействуют следующие внешние компоненты:
Способы приема трафика из внешней сети подробно описаны в параметре spec.inlet кастомного ресурса IngressNginxController.
Для инлетов вида LoadBalancer, LoadBalancerWithProxyProtocol и LoadBalancerWithSSLPassthrough указанный на схеме балансировщик нагрузки автоматически предоставляется облачным провайдером (при развертывании DKP в облаке), либо может быть реализован при помощи MetalLB-контроллера (при установке на bare-metal-хостах). С настройками модуля metallb можно ознакомиться в соответствующем разделе документации.
Для инлетов вида HostPort, HostPortWithProxyProtocol, HostPortWithSSLPassthrough и HostWithFailover балансировщик нагрузки разворачивается пользователем, либо может отсутствовать. В этом случае пользователь самостоятельно настраивает бэкенды балансировщика или обеспечивает сетевую связность до ingress-controller. Точкой входа в ingress-controller в этом случае являются порты на узлах кластера, на которых запущен контроллер.
Модуль metallb реализует механизм LoadBalancer для сервисов в bare-metal-кластерах.
Поддерживаются следующие режимы работы:
Для упрощения схемы приняты следующие допущения: На схеме показано, что контейнеры разных подов взаимодействуют друг с другом напрямую. Фактически они взаимодействуют через соответствующие сервисы Kubernetes (внутренние балансировщики). Названия сервисов не указываются, если они очевидны из контекста. В остальных случаях название сервиса указано над стрелкой. Поды могут быть запущены в нескольких репликах, однако на схеме все поды изображены в одной реплике.
Архитектура модуля metallb на уровне 2 модели C4 и его взаимодействия с другими компонентами Deckhouse Kubernetes Platform (DKP) изображены на следующих диаграммах.
MetalLB в режиме Layer 2:
MetalLB в режиме BGP:
Модуль состоит из следующих компонентов:
1. Controller/l2lb-controller (Deployment) — контроллер MetalLB, отвечающий за назначение IP-адресов сервисам типа LoadBalancer.
Контроллер отслеживает изменения в сервисах Kubernetes и применяет конфигурацию IP-адресов, основываясь на заранее определённом пуле адресов, указанных в настройках.
Состоит из следующих контейнеров:
2. Speaker/l2lb-speaker (DaemonSet) — спикер MetalLB, запускаемый на каждом узле кластера, входящем в группу балансировки. Отвечает за реализацию протокола балансировки нагрузки на уровне сети.
В зависимости от режима работы выполняет следующие функции:
Состоит из следующих контейнеров:
Модуль взаимодействует со следующими компонентами:
1. Kube-apiserver:
2. Сетевое оборудование — обеспечивает доступность виртуальных IP-адресов за пределами кластера:
С модулем взаимодействуют следующие внешние компоненты:
Компоненты Istio делятся на две категории:
Все сервисы из data plane группируются в сервис-меш (service mesh). Его характеристики:
Элементы control plane:
- Непрерывная связь с API Kubernetes и сбор информации о прикладных сервисах.
- Обработка и валидация с помощью механизма Kubernetes Validating Webhook всех кастомных ресурсов, которые связаны с Istio.
- Компоновка конфигурации для каждого sidecar-proxy индивидуально:
- внедрение дополнительного служебного контейнера sidecar-proxy;
- внедрение дополнительного init-контейнера для адаптации сетевой подсистемы (настройка DNAT для перехвата прикладного трафика);
- перенаправление readiness- и liveness-проб через sidecar-proxy.
- визуализация связей между сервисами;
- диагностика проблемных связей;
- диагностика состояния control plane.
С включенным Istio поведение Ingress-контроллера изменяется следующим образом:
Внедрение Istio повлечёт за собой дополнительные расходы ресурсов, как для control plane (контроллер istiod), так и для data plane (istio-сайдкары приложений).
Контроллер istiod непрерывно наблюдает за конфигурацией кластера, компонует настройки для istio-сайдкаров data plane и рассылает их по сети. Соответственно, чем больше приложений и их экземпляров, чем больше сервисов и чем чаще эта конфигурация меняется, тем больше требуется вычислительных ресурсов и больше нагрузка на сеть.
Поддерживается два подхода к снижению нагрузки на экземпляры контроллеров:
Примерная оценка накладных расходов для экземпляра control plane, который обслуживает 1000 сервисов и 2000 istio-сайдкаров — 1 vCPU и 1,5 ГБ RAM.
На потребление ресурсов data plane (istio-сайдкары) влияет множество факторов:
Примерная оценка накладных расходов для экземпляра istio-сайдкара — 0,5 vCPU на 1000 запросов/сек и 50 МБ RAM.
Istio-сайдкары также вносят задержку в сетевые запросы — примерно 2,5 мс на запрос.
- Envoy — проксирует прикладной трафик и реализует все функции, которые предоставляет Istio, включая маршрутизацию, аутентификацию, авторизацию и пр.
- Pilot-agent — часть Istio, отвечающая за поддержание конфигурации Envoy в актуальном состоянии. Включает в себя кеширующий DNS-сервер.
- В каждом поде с помощью дополнительного init-контейнера настраивается DNAT входящих и исходящих прикладных запросов в sidecar-proxy. В результате трафик будет перехватываться прозрачно для приложений.
- Поскольку входящий трафик перенаправляется в sidecar-proxy, это касается и readiness/liveness-проб. Так как подсистема Kubernetes не поддерживает пробы в формате Mutual TLS, все существующие пробы перенастраиваются на порт в sidecar-proxy, который передает их приложению без изменений.
- Каждый под Ingress-контроллера также включает sidecar-proxy, который обрабатывает трафик между контроллером и сервисами.
- Входящий трафик от пользователей обрабатывается непосредственно контроллером.
- nginx.ingress.kubernetes.io/service-upstream: "true" — Ingress-контроллер в качестве upstream будет использовать ClusterIP сервиса вместо адресов подов. Балансировкой трафика между подами теперь занимается sidecar-proxy. Используйте эту опцию только если у вашего сервиса есть ClusterIP.
- nginx.ingress.kubernetes.io/upstream-vhost: "myservice.myns.svc" — sidecar-proxy Ingress-контроллера принимает решения о маршрутизации на основе заголовка Host. Без данной аннотации контроллер оставит заголовок с адресом сайта, например Host: example.com.
- Ресурсы типа Service не требуют изменений и продолжают работать без адаптации. Приложениям все так же доступны адреса сервисов вида servicename, servicename.myns.svc и пр.
В стандартной работе DNS в Kubernetes существует ряд проблем, которые могут привести к неоправданному снижению ключевых показателей работы сервиса:
При появлении небольших сетевых задержек качество сервиса может значительно деградировать из-за приведенных выше проблем.
Одно из решений — установить DNS-сервер на каждый узел. В Deckhouse Kubernetes Platform это реализуется с помощью модуля node-local-dns.
При использовании кеширующего DNS-сервера внешние запросы (но только отсутствующие в кеше) также будут сначала пытаться разрешаться по цепочке внутренних зон. При большой нагрузке (при большом количестве запросов на одни и те же записи в секунду, как это часто и бывает) кеширования достаточно для значительного улучшения DNS-резолвинга.
При разворачивании кеширующего DNS-сервера модуль node-local-dns выполняет на каждом узле кластера следующие настройки:
Основные характеристики конфигурации CoreDNS:
Дашборд Kubernetes / DNS (node local) отображает:
Опишите вашу задачу, и мы поможем вам ее решить