Политики Gwin
Gwin — инструмент для создания балансировщиков нагрузки Yandex Application Load Balancer и управления ими в кластерах Yandex Managed Service for Kubernetes.
Контроллер поддерживает спецификации Ingress
Дополнительные возможности, которые предоставляет Application Load Balancer:
- Логирование и настройка правил отбрасывания логов.
- Автомасштабирование с контролем ресурсных единиц.
- Зональное управление трафиком для обеспечения высокой доступности сервисов.
- Гибкие настройки балансировки, включающие локализацию трафика и режим паники.
- Ограничение скорости обработки запросов на уровне виртуальных хостов.
- Профили безопасности и WAF-защита.
- Использование групп безопасности.
- Интеграция с сервисами Yandex Cloud — Yandex Certificate Manager, Yandex Cloud Logging.
Механизм политик открывает доступ к этим возможностям. Он также позволяет:
- Расширять стандартные ресурсы с помощью аннотаций, не меняя спецификации этих ресурсов.
- Создавать сложные конфигурации из нескольких ресурсов политик.
- Объединять оба подхода для большей гибкости.
Конфигурирование политик
Конфигурировать политики можно двумя равнозначными способами — с помощью аннотаций и ресурсов политик.
-
Аннотации — быстрый способ добавить специфичные настройки к стандартным ресурсам. Аннотации поддерживают точечную нотацию, что позволяет создавать сложные вложенные конфигурации и записывать их в формате
ключ:значение.Пример:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress annotations: gwin.yandex.cloud/subnets: "subnet-1,subnet2" gwin.yandex.cloud/logs.logGroupId: "group-1" gwin.yandex.cloud/rules.backends.balancing.mode: "ROUND_ROBIN" spec: ... -
Ресурсы политик — политики оформляются в виде отдельных ресурсов.
Пример:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress spec: ... --- apiVersion: gwin.yandex.cloud/v1 kind: IngressPolicy metadata: name: example-ingress-policy spec: targetRefs: - kind: Ingress name: example-ingress policy: subnets: ["subnet-1", "subnet2"] logs: logGroupId: "group-1" rules: backends: balancing: mode: "ROUND_ROBIN"
Применение политик к целевым ресурсам
Политики можно применять к определенным ресурсам с помощью ссылок (targetRefs) или селекторов (selector).
Пример с использованием ссылки:
kind: IngressPolicy
spec:
targetRefs:
- kind: Ingress
name: my-app
...
Пример с использованием селектора:
kind: IngressPolicy
spec:
selector:
matchLabels:
environment: production
...
Примечание
Политики действуют только в пределах одного пространства имен Kubernetes.
Слияние конфигураций
Когда к одному ресурсу применяется несколько источников конфигурации, они объединяются. Настройки сливаются рекурсивно: вложенные объекты объединяются на всех уровнях.
При объединении конфигурации проверяются на конфликты: если в разных источниках будут обнаружены одинаковые поля с разными значениями, возникнет ошибка валидации ресурса.
Пример слияния
Ресурс Ingress с аннотациями:
kind: Ingress
metadata:
annotations:
gwin.yandex.cloud/subnets: "subnet-1,subnet-2"
gwin.yandex.cloud/logs.logGroupId: "group-1"
Ресурс политики IngressPolicy:
kind: IngressPolicy
spec:
policy:
securityGroups: ["sg-1"]
rules:
backends:
balancing:
mode: "ROUND_ROBIN"
Результат слияния настроек в единую конфигурацию:
securityGroups: ["sg-1"]
logs:
subnets: ["subnet-1", "subnet-2"]
securityGroups: ["sg-1"]
logGroupId: "group-1"
rules:
backends:
balancing:
mode: "ROUND_ROBIN"
Слияние глобальных и специфичных настроек
Некоторые параметры можно задать как для всех объектов определенного типа, так и для конкретного объекта. Параметры для конкретного объекта не перезаписывают глобальные параметры и может возникнуть конфликт, если в разных источниках конфигурации в одном поле заданы разные значения.
Пример конфликтующих конфигураций:
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: my-gateway
annotations:
# Параметр задан для всех обработчиков:
gwin.yandex.cloud/listeners.http.protocolSettings.allowHTTP10: "true"
spec:
...
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: my-gateway
annotations:
# Параметр задан для конкретного обработчика «api»:
gwin.yandex.cloud/listener.api.http.protocolSettings.allowHTTP10: "false"
spec:
...
Решение проблем
При возникновении проблем с политиками:
- Проверьте статус ресурсов. Ошибки валидации можно увидеть в поле
.status.conditionsописания объекта или в событиях Kubernetes. - Убедитесь, что указано нужное пространство имен.
- Убедитесь, что
targetRefsилиselectorуказывают на нужные ресурсы. - Если источников конфигурации несколько, убедитесь, что одинаковые поля в разных источниках имеют одинаковые значения.