Руководство по установке#
В руководстве приведены инструкции по установке компонента Synapse Rate Limiter (SRLS) продукта Synapse Enterprise Integration (SEI).
Термины и определения#
Термин/Аббревиатура |
Определение |
|---|---|
API |
Application Programming Interface |
CPU |
Central Processing Unit, центральный процессор |
Endpoint |
Сетевая точка, обеспечивающая взаимодействие с поставщиком |
gRPC |
Современная высокопроизводительная платформа, которая используется для развития устаревшего протокола удаленного вызова процедур (RPC) |
Ingress Gateway |
Ресурс Istio, который описывает правила маршрутизации и балансировки входящих запросов. Альтернатива K8s Ingress, настраивается через ресурсы Gateway, Virtual Service и при необходимости DestinationRule |
K8s |
Kubernetes, платформа с открытым исходным кодом для управления кластерами приложений и сервисами на основе контейнеров |
OpenSSL |
Криптографическая библиотека с открытым исходным кодом и инструментарий SSL |
OS |
OpenShift, открытая и расширяемая платформа приложений-контейнеров |
RL Operator |
Компонент SRLS, обеспечивающий конфигурирование Ingress Gateway в соответствии с CRD в runtime |
RL Service |
Компонент SRLS, сервис расчета лимитов, принимает gRPC-запросы от Ingress Gateway в прикладных namespace, содержащих информацию о домене (в качестве домена используется название namespace), о вызываемом сервисе и данные из заголовка synapse-consumerid |
Runtime |
Время выполнения |
SRLS (SRL) |
Программный компонент Synapse Rate Limiter Service (Synapse Rate Limit), сервис ограничения (квотирования) входящих запросов, необходим для ограничения прикладной нагрузки (payload) со стороны потребителя на защищаемые сервисы, исполняемые в рамках Synapse Service Mesh |
TPS |
Transactions per second, транзакций в секунду |
Deploy Tools |
Программный компонент, предназначенный для автоматизации развертывания и автоматической установки технологических сервисов и бизнес-приложений на тестовых и промышленных стендах (CDJE), программного продукта Platform V DevOps Tools (DOT) |
Unimon |
Программный компонент Объединенный мониторинг Unimon (MONA) программного продукта Platform V Monitor (OPM) |
Децентрализованный Rate Limit |
Компонент Rate Limit, специфичный для одного namespace |
Pod |
Набор контейнеров внутри узла кластера Kubernetes или Red Hat OpenShift (опционально) |
ТУЗ |
Технологическая учётная запись |
SecMan |
Система управления секретами Secret Management System |
Системные требования#
Настройки безопасности окружения и перечень платформенных (дополнительных внешних) продуктов, используемых для установки, настройки и контроля в конечной информационной системе (далее — ИС), выбираются клиентом при разработке конечной ИС, исходя из характера обрабатываемой в ней информации и иных требований информационной безопасности (далее — ИБ), предъявляемых к ней.
Системное программное обеспечение#
Ниже представлены категории системного программного обеспечения (далее — ПО), которые обязательны или опциональны для установки, настройки, контроля и функционирования компонента. В каждой категории перечислены все поддерживаемые продукты сторонних правообладателей. Отдельно обозначены варианты, которые рекомендует АО «СберТех» (маркировка «Рекомендовано» в столбце «Продукт, функциональная совместимость с которым подтверждена»). Клиенту необходимо выбрать один из продуктов в каждой категории, исходя из условий использования конечной ИС.
Категория ПО |
Обязательность установки (да/нет) |
Наименование ПО |
Версия |
Продукт, функциональная совместимость с которым подтверждена |
Описание |
|---|---|---|---|---|---|
Операционная система |
Да |
ОС Альт 8 СП |
10.0 и выше |
Рекомендовано. Правообладателем АО «СберТех» также рекомендована ОС – Platform V SberLinux OS Server), см. раздел «Платформенные зависимости» |
ОС контейнеров для запуска модулей компонента |
Red Hat Enterprise Linux |
7.9.9 и выше |
Опционально |
|||
Среда контейнеризации |
Да |
1.24 и выше |
Рекомендовано. Правообладателем АО «СберТех» также рекомендована среда контейнеризации – Platform V DropApp, см. раздел «Платформенные зависимости» |
Платформа контейнеризации для запуска компонентов сервиса |
|
Red Hat OpenShift |
4.8 и выше |
Опционально |
|||
Средство контейнеризации |
Да |
1.13.1 и выше |
Рекомендовано |
Инструмент для автоматизации работы с контейнерами |
|
Инструмент сборки, тестирования, развертывания контейнеризированных приложений |
Нет |
2.346.0 и выше |
Рекомендовано |
Сервер автоматизации, используемый для внедрения непрерывной интеграции и непрерывной доставки (CI/CD) для проектов программного обеспечения |
|
Сервис интеграции и оркестрации микросервисов в облаке |
Да |
1.12 и выше |
Рекомендовано. Правообладателем АО «СберТех» также рекомендован сервис интеграции и оркестрации микросервисов в облаке, основанный на Istio, – Platform V Synapse Service Mesh, см. раздел «Платформенные зависимости» |
Сервис интеграции микросервисов в облаке |
|
Хранилище данных |
Да |
6.2.7 и выше |
Рекомендовано. Образы, с которыми была проверена работоспособность компонента SRLS: docker.io/library/redis:6.0.9, docker.io/library/redis:6.2.11, docker.io/library/redis:7.0.10 |
Внешний распределенный кеш используется для корректного подсчета лимитов для сервиса, запущенного более чем в одном экземпляре |
|
Система мониторинга (сбор и хранение метрик) |
Нет |
2.37.0 и выше |
Рекомендовано. Правообладателем АО «СберТех» также рекомендован Сервис для сбора прикладных и инфраструктурных метрик и отправки их в целевую систему хранения – Объединенный мониторинг Unimon Platform V Monitor, см. раздел «Платформенные зависимости» |
Система для сбора и хранения численных метрик |
|
Система мониторинга (визуализация) |
Нет |
9.5 и выше |
Рекомендовано |
Система для визуализации численных метрик (предоставленных, например, Prometheus) |
|
Система управления секретами |
Нет |
Secret Management System |
1.10.0 и выше |
Рекомендовано |
Система управления аутентификационными данными сервисных аккаунтов или учетных записей |
Здесь и далее поддерживаемой системой приложений-контейнеров является Kubernetes (использование Red Hat OpenShift – опционально). В именах и параметрах системы, в названиях переменных, настроек могут встречаться названия (в т.ч. сокращения) систем контейнеризации, которые одинаково применимы для обеих сред контейнеризации.
Примечание:
*
Да — категория ПО обязательна для функционирования сервиса (это означает, что сервис не может выполнять свои основные функции без установки данной категории ПО).
Нет — категория ПО необязательна для функционирования сервиса (это означает, что сервис может выполнять свои основные функции без установки данной категории ПО).
**
Рекомендовано — рекомендованный правообладателем АО «СберТех» продукт.
Опционально — альтернативный по отношению к рекомендованному правообладателем АО «СберТех» продукт.
Платформенные зависимости#
Для настройки, контроля и функционирования компонента реализована интеграция с программными продуктами, правообладателем которых является АО «СберТех»:
Наименование продукта |
Код |
Версия продукта |
Код и наименование компонента |
Обязательность установки (да/нет) |
Описание |
Аналог других производителей |
|---|---|---|---|---|---|---|
Platform V Monitor |
OPM |
1.2 и выше до потери обратной совместимости |
LOGA Журналирование |
Нет |
Сервис для хранения лог-файлов |
Любой сервис сбора записей о событиях, совместимый с fluent-bit, например: Elasticsearch, InfluxDB |
MONA Объединенный мониторинг Unimon |
Нет |
Сервис для сбора прикладных и инфраструктурных метрик и отправки их в целевую систему хранения |
Prometheus 2.37.0 |
|||
INDA Indicator |
Нет |
Сервис контроля качества работы сервисов платформы, обеспечивающий представление информации о состоянии сервисов посредством обработки значений метрик с последующей визуализацией метрик на различных типах панелей |
Grafana 7.5 |
|||
Platform V DevOps Tools |
DOT |
1.3 |
CDJE Deploy tools |
Нет |
Сервис для развертывания и обновления компонентов Платформы и приложений потребителей, для настройки и обслуживания инфраструктуры Платформы |
Ручное развертывание |
Platform V Synapse Service Mesh |
SSM |
3.8 |
POLM Управление политиками |
Нет |
Панель управления с открытым исходным кодом, служащая для взаимодействия, мониторинга и обеспечения безопасности контейнеров в среде контейнеризации Kubernetes |
Istio control plane 1.12 |
Platform V SberLinux OS Server |
SLO |
8.7 |
INST Операционная система |
Нет |
ОС контейнеров для запуска модулей компонента |
ОС Альт 8 СП |
Platform V DropApp |
K8S |
1.1 и выше |
K8SC K8S Core |
Нет |
Дистрибутив Kubernetes со встроенными механизмами мультитенантности и бессерверным исполнением |
Kubernetes, Red Hat OpenShift Container Platform |
Примечание:
***
Да — компонент или продукт необходим для функционирования сервиса (это означает, что сервис не может выполнять свои основные функции без установки данного компонента).
Нет — необязательный для функционирования сервиса компонент или продукт (это означает, что сервис может выполнять свои основные функции без установки данного компонента).
**** Рекомендуется установка программного продукта, правообладателем которого является АО «СберТех», при этом не исключена возможность (допускается правообладателем) использования аналога других производителей. Аналоги, в отношении которых продукт успешно прошел испытания и подтвердил свою работоспособность, указаны в разделе «Системное программное обеспечение».
Аппаратные требования#
Для установки компонента требуется следующая конфигурация аппаратного обеспечения:
Квота для установки централизованного варианта SRLS:
количество ядер процессора — 5 ядер;
объем оперативной памяти — 10 ГБ.
Квота для установки централизованного варианта SRLS c TLS шифрованием:
количество ядер процессора — 7 ядер;
объем оперативной памяти — 12 ГБ.
Квота для установки децентрализованного варианта SRLS:
количество ядер процессора — 3 ядра;
объем оперативной памяти — 8 ГБ.
Для работы программного компонента в среде контейнеризации Kubernetes или Red Hat OpenShift 4.8 (опционально) необходимы следующие ресурсы:
для компонента RL Operator (на 1 Pod, без учета fluent-bit sidecar и istio sidecar):
CPU |
Memory |
|
|---|---|---|
Limits |
200m |
200Mi |
Requests |
100m |
100Mi |
для компонента RL Service (на 1 Pod, без учета fluent-bit sidecar и istio sidecar):
CPU |
Memory |
|
|---|---|---|
Limits |
500m |
300Mi |
Requests |
250m |
150Mi |
для Redis (на 1 Pod):
Redis/Redis Sentinel |
CPU |
Memory |
|---|---|---|
Limits |
300m/200m |
500Mi/200Mi |
Requests |
150m/100m |
250Mi/100Mi |
для Ingress Gateway (на 1 Pod) — при централизованном варианте SRLS:
CPU |
Memory |
|
|---|---|---|
Limits |
600m |
900Mi |
Requests |
400m |
700Mi |
для Egress Gateway (на 1 Pod) — при централизованном варианте SRLS c TLS-шифрованием:
CPU |
Memory |
|
|---|---|---|
Limits |
600m |
900Mi |
Requests |
400m |
700Mi |
Методика расчета сайзинга#
Оценить производительность программного компонента SRLS можно по результатам нагрузочного тестирования. Были проведены тесты. Результаты:
Централизованный SRLS
CPU |
Memory |
|||
|---|---|---|---|---|
TPS |
Ingress |
RLS |
Ingress |
RLS |
200 |
290 |
220 |
360 |
20 |
500 |
540 |
370 |
363 |
21 |
800 |
820 |
530 |
366 |
21 |
1100 |
1010 |
670 |
367 |
22 |
1400 |
1260 |
820 |
368 |
24 |
Децентрализованный SRLS
CPU |
Memory |
|||
|---|---|---|---|---|
TPS |
Ingress |
RLS |
Ingress |
RLS |
300 |
480 |
360 |
350 |
28 |
800 |
870 |
530 |
354 |
29 |
1100 |
1270 |
690 |
371 |
32 |
1700 |
1600 |
930 |
389 |
31 |
На промежутке TPS, который был выбран для тестирования, отличие от линейной функции будет незначительное, поэтому по полученным результатам тестирования на основе линейной функции (x*a+b) аппроксимировали следующие формулы для расчета требуемых ресурсов CPU и Memory для Ingress и RLS в зависимости от интенсивности нагрузки (TPS):
Централизованный SRLS
CPU
Ingress = Целевой TPS*0,8+141RLS= Целевой TPS*0,5+122
Memory
Ingress = Целевой TPS*0,01+359,5RLS= Целевой TPS*0,003+19,2
Децентрализованный SRLS
CPU
Ingress = Целевой TPS*0,82+255RLS= Целевой TPS*0,41+224
Memory
Ingress = Целевой TPS*0,03+337RLS= Целевой TPS*0,0024+28
Необходимые ресурсы для централизованного SRLS:
CPU |
Memory |
|||
|---|---|---|---|---|
Целевой TPS |
RLS |
Ingress Gateway |
RLS |
Ingress Gateway |
500 |
372 |
541 |
20,7 |
364,5 |
1100 |
672 |
1021 |
22,5 |
370,5 |
1700 |
972 |
1501 |
24,3 |
376,5 |
Необходимые ресурсы для децентрализованного SRLS:
CPU |
Memory |
|||
|---|---|---|---|---|
Целевой TPS |
RLS |
Ingress Gateway |
RLS |
Ingress Gateway |
500 |
429 |
665 |
29,2 |
352 |
1100 |
675 |
1157 |
30,64 |
370 |
1700 |
921 |
1649 |
32,08 |
388 |
Состав дистрибутива#
Элемент дистрибутива |
Описание |
|---|---|
./bh/ratelimit |
Исполняемый файл RL Service |
./bh/rloperator |
Исполняемый файл RL Operator |
Выбор способа установки#
В зависимости от способа развертывания сервиса воспользуйтесь одной из инструкций:
ручная установка сервиса;
автоматизированная установка сервиса с использованием Deploy Tools;
автоматическая установка по агентской схеме;
автоматизированная установка сервиса с использованием Synapse Installer.
Подготовка окружения#
Namespace, в который требуется установить компонент SRLS, должен быть подключен к Istio: убедиться, что в namespace существуют стандартные Config Map Istio с именами istio-ca-root-cert, istio-basic (если нет, то добавить).
Убедиться, что в namespace существует ServiceAccount c именем default (если нет, то добавить).
Для доступа к образам из среды контейнеризации к Docker-registry требуется создать ImagePullSecret (
<дистрибутив>/openshift/other/rls-image-pull-secret.yaml), для этого нужно подготовить JSON вида:
{"auths":{"registry.local.host.ru":{"username":"user","password":"pass","auth":"auth-b64","email":""}}}
Здесь:
user — учетная запись для доступа к registry.local.host.ru;
pass — пароль учетной записи;
auth-b64 — base64 от строки в формате user:pass.
Заполнить поле .dockerconfigjson получившимся JSON:
kind: Secret
apiVersion: v1
metadata:
name: rls-image-pull-secret
namespace: ${rls_namespace}
data:
.dockerconfigjson: >-
type: kubernetes.io/dockerconfigjson
Связать секрет rls-image-pull-secret с ServiceAccount, который используется для скачивания образов. Пример команды для Kubernetes:
kubectl secrets link default rls-image-pull-secret --for=pull -n <namespace>
Здесь namespace — уникальное имя пространства.
Пример команды для OpenShift:
oc secrets link default rls-image-pull-secret --for=pull
Создать или обновить артефакт CustomResourceDefinition в среде контейнеризации Kubernetes или Red Hat OpenShift (опционально).
Пользовательские ресурсы являются расширением API Kubernetes. Артефакт CustomResourceDefinition (сокращенно CRD) позволяет определять пользовательские ресурсы — указать тип и схему ресурса. Добавление артефакта CRD позволяет затем использовать новые пользовательские ресурсы.
В нашем случае для артефактов типа GlobalRateLimit необходимо добавить следующий СRD:
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.9.2
creationTimestamp: null
name: globalratelimits.ratelimit.service
spec:
group: ratelimit.service
names:
kind: GlobalRateLimit
listKind: GlobalRateLimitList
plural: globalratelimits
singular: globalratelimit
scope: Namespaced
versions:
- name: v1alpha1
schema:
openAPIV3Schema:
description: GlobalRateLimit is the Schema for the globalratelimits API
properties:
apiVersion:
description: 'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type: string
kind:
description: 'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
metadata:
type: object
spec:
description: GlobalRateLimitSpec defines the desired state of GlobalRateLimit
properties:
endpoints:
items:
properties:
by_header:
nullable: true
properties:
anon_value:
description: Specifies limit for request without header
format: int64
nullable: true
type: integer
header:
default: synapse-consumerid
description: Specifies header to be used
type: string
invokers:
items:
properties:
header_value:
description: Specifies particular consumer
type: string
name:
description: Human-readable consumer description
type: string
schedule:
description: Specifies unnamed schedule for quota
nullable: true
properties:
soft:
description: Specifies soft quota
nullable: true
properties:
step:
default: 1
description: Resource soft quota increment
value
type: integer
value:
default: 1
description: The current soft quota value
of a resource
type: integer
type: object
start:
description: Time to start schedule for quota
nullable: true
properties:
day:
description: Specifies day (1-31)
type: string
hour:
description: Specifies hour (0-24)
type: string
minute:
description: Specifies minutes (0-59)
type: string
month:
description: Specifies month (1-12, 1-january)
type: string
second:
description: Specifies seconds (0-59)
type: string
weekday:
description: Specifies weekday (0-6, 0-sunday)
type: string
type: object
stop:
description: Time to stop schedule for quota
nullable: true
properties:
day:
description: Specifies day (1-31)
type: string
hour:
description: Specifies hour (0-24)
type: string
minute:
description: Specifies minutes (0-59)
type: string
month:
description: Specifies month (1-12, 1-january)
type: string
second:
description: Specifies seconds (0-59)
type: string
weekday:
description: Specifies weekday (0-6, 0-sunday)
type: string
type: object
unit:
default: second
description: Specifies time unit
enum:
- second
- minute
- hour
- day
type: string
value:
default: 1
description: Specifies limit
type: integer
required:
- start
- stop
type: object
soft:
description: Specifies soft quota
nullable: true
properties:
step:
default: 1
description: Resource soft quota increment value
type: integer
value:
default: 1
description: The current soft quota value of a
resource
type: integer
type: object
unit:
default: second
description: Specifies time unit
enum:
- second
- minute
- hour
- day
type: string
value:
default: 1
description: Specifies limit
type: integer
type: object
nullable: true
type: array
modify_header:
description: Specifies how the header will be modified
nullable: true
properties:
rule:
description: Specifies the rule of modify
type: string
type:
default: cert
description: Specifies the type of modify
enum:
- cert
type: string
type: object
schedule:
description: Specifies unnamed schedule for quota
nullable: true
properties:
soft:
description: Specifies soft quota
nullable: true
properties:
step:
default: 1
description: Resource soft quota increment value
type: integer
value:
default: 1
description: The current soft quota value of a resource
type: integer
type: object
start:
description: Time to start schedule for quota
nullable: true
properties:
day:
description: Specifies day (1-31)
type: string
hour:
description: Specifies hour (0-24)
type: string
minute:
description: Specifies minutes (0-59)
type: string
month:
description: Specifies month (1-12, 1-january)
type: string
second:
description: Specifies seconds (0-59)
type: string
weekday:
description: Specifies weekday (0-6, 0-sunday)
type: string
type: object
stop:
description: Time to stop schedule for quota
nullable: true
properties:
day:
description: Specifies day (1-31)
type: string
hour:
description: Specifies hour (0-24)
type: string
minute:
description: Specifies minutes (0-59)
type: string
month:
description: Specifies month (1-12, 1-january)
type: string
second:
description: Specifies seconds (0-59)
type: string
weekday:
description: Specifies weekday (0-6, 0-sunday)
type: string
type: object
unit:
default: second
description: Specifies time unit
enum:
- second
- minute
- hour
- day
type: string
value:
default: 1
description: Specifies limit
type: integer
required:
- start
- stop
type: object
soft:
description: Specifies soft quota
nullable: true
properties:
step:
default: 1
description: Resource soft quota increment value
type: integer
value:
default: 1
description: The current soft quota value of a resource
type: integer
type: object
unit:
default: second
description: Specifies time unit
enum:
- second
- minute
- hour
- day
type: string
uri_prefixes:
items:
properties:
anon_value:
description: Specifies limit for request without header
format: int64
nullable: true
type: integer
invokers:
items:
properties:
header_value:
description: Specifies particular consumer
type: string
name:
description: Human-readable consumer description
type: string
schedule:
description: Specifies unnamed schedule for
quota
nullable: true
properties:
soft:
description: Specifies soft quota
nullable: true
properties:
step:
default: 1
description: Resource soft quota increment
value
type: integer
value:
default: 1
description: The current soft quota
value of a resource
type: integer
type: object
start:
description: Time to start schedule for
quota
nullable: true
properties:
day:
description: Specifies day (1-31)
type: string
hour:
description: Specifies hour (0-24)
type: string
minute:
description: Specifies minutes (0-59)
type: string
month:
description: Specifies month (1-12,
1-january)
type: string
second:
description: Specifies seconds (0-59)
type: string
weekday:
description: Specifies weekday (0-6,
0-sunday)
type: string
type: object
stop:
description: Time to stop schedule for quota
nullable: true
properties:
day:
description: Specifies day (1-31)
type: string
hour:
description: Specifies hour (0-24)
type: string
minute:
description: Specifies minutes (0-59)
type: string
month:
description: Specifies month (1-12,
1-january)
type: string
second:
description: Specifies seconds (0-59)
type: string
weekday:
description: Specifies weekday (0-6,
0-sunday)
type: string
type: object
unit:
default: second
description: Specifies time unit
enum:
- second
- minute
- hour
- day
type: string
value:
default: 1
description: Specifies limit
type: integer
required:
- start
- stop
type: object
soft:
description: Specifies soft quota
nullable: true
properties:
step:
default: 1
description: Resource soft quota increment
value
type: integer
value:
default: 1
description: The current soft quota value
of a resource
type: integer
type: object
unit:
default: second
description: Specifies time unit
enum:
- second
- minute
- hour
- day
type: string
value:
default: 1
description: Specifies limit
type: integer
type: object
nullable: true
type: array
schedule:
description: Specifies unnamed schedule for quota
nullable: true
properties:
soft:
description: Specifies soft quota
nullable: true
properties:
step:
default: 1
description: Resource soft quota increment
value
type: integer
value:
default: 1
description: The current soft quota value
of a resource
type: integer
type: object
start:
description: Time to start schedule for quota
nullable: true
properties:
day:
description: Specifies day (1-31)
type: string
hour:
description: Specifies hour (0-24)
type: string
minute:
description: Specifies minutes (0-59)
type: string
month:
description: Specifies month (1-12, 1-january)
type: string
second:
description: Specifies seconds (0-59)
type: string
weekday:
description: Specifies weekday (0-6, 0-sunday)
type: string
type: object
stop:
description: Time to stop schedule for quota
nullable: true
properties:
day:
description: Specifies day (1-31)
type: string
hour:
description: Specifies hour (0-24)
type: string
minute:
description: Specifies minutes (0-59)
type: string
month:
description: Specifies month (1-12, 1-january)
type: string
second:
description: Specifies seconds (0-59)
type: string
weekday:
description: Specifies weekday (0-6, 0-sunday)
type: string
type: object
unit:
default: second
description: Specifies time unit
enum:
- second
- minute
- hour
- day
type: string
value:
default: 1
description: Specifies limit
type: integer
required:
- start
- stop
type: object
soft:
description: Specifies soft quota
nullable: true
properties:
step:
default: 1
description: Resource soft quota increment value
type: integer
value:
default: 1
description: The current soft quota value of a
resource
type: integer
type: object
unit:
default: second
description: Specifies time unit
enum:
- second
- minute
- hour
- day
type: string
uri_prefix:
description: Specifies particular prefix in url
type: string
value:
default: 1
description: Specifies limit
format: int64
type: integer
type: object
nullable: true
type: array
value:
default: 1
description: Specifies limit
format: int64
type: integer
type: object
by_path:
nullable: true
properties:
mask:
default: rn/*:*:*
description: Regular expression to parse path rn/account-id:project-id:resource-id
type: string
quotas:
description: Specifies resource quotas SRLSv2
nullable: true
properties:
flat:
default: 1
description: The current flat quota value of a resource
type: integer
soft:
description: Specifies soft quota
nullable: true
properties:
step:
default: 1
description: Resource soft quota increment value
type: integer
value:
default: 1
description: The current soft quota value of a resource
type: integer
type: object
required:
- flat
type: object
schedule:
description: Specifies unnamed schedule for quota
nullable: true
properties:
soft:
description: Specifies soft quota
nullable: true
properties:
step:
default: 1
description: Resource soft quota increment value
type: integer
value:
default: 1
description: The current soft quota value of a resource
type: integer
type: object
start:
description: Time to start schedule for quota
nullable: true
properties:
day:
description: Specifies day (1-31)
type: string
hour:
description: Specifies hour (0-24)
type: string
minute:
description: Specifies minutes (0-59)
type: string
month:
description: Specifies month (1-12, 1-january)
type: string
second:
description: Specifies seconds (0-59)
type: string
weekday:
description: Specifies weekday (0-6, 0-sunday)
type: string
type: object
stop:
description: Time to stop schedule for quota
nullable: true
properties:
day:
description: Specifies day (1-31)
type: string
hour:
description: Specifies hour (0-24)
type: string
minute:
description: Specifies minutes (0-59)
type: string
month:
description: Specifies month (1-12, 1-january)
type: string
second:
description: Specifies seconds (0-59)
type: string
weekday:
description: Specifies weekday (0-6, 0-sunday)
type: string
type: object
unit:
default: second
description: Specifies time unit
enum:
- second
- minute
- hour
- day
type: string
value:
default: 1
description: Specifies limit
type: integer
required:
- start
- stop
type: object
tenants:
items:
properties:
name:
description: Human-readable consumer description
type: string
quotas:
description: Specifies resource quotas SRLSv2
properties:
flat:
default: 1
description: The current flat quota value of a
resource
type: integer
soft:
description: Specifies soft quota
nullable: true
properties:
step:
default: 1
description: Resource soft quota increment
value
type: integer
value:
default: 1
description: The current soft quota value
of a resource
type: integer
type: object
required:
- flat
type: object
resourceName:
description: Specifies particular consumer
type: string
schedule:
description: Specifies unnamed schedule for quota
nullable: true
properties:
soft:
description: Specifies soft quota
nullable: true
properties:
step:
default: 1
description: Resource soft quota increment
value
type: integer
value:
default: 1
description: The current soft quota value
of a resource
type: integer
type: object
start:
description: Time to start schedule for quota
nullable: true
properties:
day:
description: Specifies day (1-31)
type: string
hour:
description: Specifies hour (0-24)
type: string
minute:
description: Specifies minutes (0-59)
type: string
month:
description: Specifies month (1-12, 1-january)
type: string
second:
description: Specifies seconds (0-59)
type: string
weekday:
description: Specifies weekday (0-6, 0-sunday)
type: string
type: object
stop:
description: Time to stop schedule for quota
nullable: true
properties:
day:
description: Specifies day (1-31)
type: string
hour:
description: Specifies hour (0-24)
type: string
minute:
description: Specifies minutes (0-59)
type: string
month:
description: Specifies month (1-12, 1-january)
type: string
second:
description: Specifies seconds (0-59)
type: string
weekday:
description: Specifies weekday (0-6, 0-sunday)
type: string
type: object
unit:
default: second
description: Specifies time unit
enum:
- second
- minute
- hour
- day
type: string
value:
default: 1
description: Specifies limit
type: integer
required:
- start
- stop
type: object
unit:
default: second
description: Specifies time unit
enum:
- second
- minute
- hour
- day
type: string
required:
- quotas
type: object
nullable: true
type: array
unit:
default: second
description: Specifies time unit
enum:
- second
- minute
- hour
- day
type: string
type: object
endpoint:
description: Represents target host
minLength: 1
type: string
header:
description: Specifies header to be used
enum:
- synapse-invoker-namespace
- synapse-consumerid
type: string
invokers:
items:
properties:
header_value:
description: Specifies particular consumer
type: string
name:
description: Human-readable consumer description
type: string
schedule:
description: Specifies unnamed schedule for quota
nullable: true
properties:
soft:
description: Specifies soft quota
nullable: true
properties:
step:
default: 1
description: Resource soft quota increment value
type: integer
value:
default: 1
description: The current soft quota value of a
resource
type: integer
type: object
start:
description: Time to start schedule for quota
nullable: true
properties:
day:
description: Specifies day (1-31)
type: string
hour:
description: Specifies hour (0-24)
type: string
minute:
description: Specifies minutes (0-59)
type: string
month:
description: Specifies month (1-12, 1-january)
type: string
second:
description: Specifies seconds (0-59)
type: string
weekday:
description: Specifies weekday (0-6, 0-sunday)
type: string
type: object
stop:
description: Time to stop schedule for quota
nullable: true
properties:
day:
description: Specifies day (1-31)
type: string
hour:
description: Specifies hour (0-24)
type: string
minute:
description: Specifies minutes (0-59)
type: string
month:
description: Specifies month (1-12, 1-january)
type: string
second:
description: Specifies seconds (0-59)
type: string
weekday:
description: Specifies weekday (0-6, 0-sunday)
type: string
type: object
unit:
default: second
description: Specifies time unit
enum:
- second
- minute
- hour
- day
type: string
value:
default: 1
description: Specifies limit
type: integer
required:
- start
- stop
type: object
soft:
description: Specifies soft quota
nullable: true
properties:
step:
default: 1
description: Resource soft quota increment value
type: integer
value:
default: 1
description: The current soft quota value of a resource
type: integer
type: object
unit:
default: second
description: Specifies time unit
enum:
- second
- minute
- hour
- day
type: string
value:
default: 1
description: Specifies limit
type: integer
type: object
nullable: true
type: array
name:
description: Human-readable description of target host
type: string
overall_limit:
description: Overall limit per endpoint. Value 0 - block all
requests, negative value - unlimited
format: int64
nullable: true
type: integer
overall_schedule:
description: Specifies unnamed schedule for quota
nullable: true
properties:
soft:
description: Specifies soft quota
nullable: true
properties:
step:
default: 1
description: Resource soft quota increment value
type: integer
value:
default: 1
description: The current soft quota value of a resource
type: integer
type: object
start:
description: Time to start schedule for quota
nullable: true
properties:
day:
description: Specifies day (1-31)
type: string
hour:
description: Specifies hour (0-24)
type: string
minute:
description: Specifies minutes (0-59)
type: string
month:
description: Specifies month (1-12, 1-january)
type: string
second:
description: Specifies seconds (0-59)
type: string
weekday:
description: Specifies weekday (0-6, 0-sunday)
type: string
type: object
stop:
description: Time to stop schedule for quota
nullable: true
properties:
day:
description: Specifies day (1-31)
type: string
hour:
description: Specifies hour (0-24)
type: string
minute:
description: Specifies minutes (0-59)
type: string
month:
description: Specifies month (1-12, 1-january)
type: string
second:
description: Specifies seconds (0-59)
type: string
weekday:
description: Specifies weekday (0-6, 0-sunday)
type: string
type: object
unit:
default: second
description: Specifies time unit
enum:
- second
- minute
- hour
- day
type: string
value:
default: 1
description: Specifies limit
type: integer
required:
- start
- stop
type: object
shortname:
description: Short description of target host without spaces,
special characters, 3-10 English letter
pattern: ^[a-z]{3,10}$
type: string
unit:
description: Specifies time unit
enum:
- second
- minute
- hour
- day
type: string
value:
description: Specifies limit
format: int64
nullable: true
type: integer
required:
- endpoint
- shortname
type: object
nullable: true
type: array
envoyVersion:
description: Version of the used Envoy
type: string
rlnamespace:
description: Specifies Rate Limit Namespace, this allow to have multiple
SRLS Operators in same cluster
nullable: true
type: string
rlserver:
description: Specifies Rate Limiter service to be used
type: string
rlservercert:
nullable: true
properties:
cert:
description: Path to certificate chain
minLength: 1
type: string
key:
description: Path to private key
minLength: 1
type: string
trust_ca:
description: Path to trusted CA cert
minLength: 1
type: string
required:
- cert
- key
- trust_ca
type: object
rlserverport:
default: 12001
description: Specifies Rate Limiter service port to be used
format: int32
maximum: 65000
minimum: 1
type: integer
type_mode:
default: full
description: Specifies current quota allocation mode
enum:
- full
- share
type: string
visibility:
default: cluster
description: Specifies current settings visibility
enum:
- namespace
- cluster
type: string
workloadSelector:
description: Selector used to find ingress gateway in provider namespace
properties:
labels:
additionalProperties:
type: string
nullable: true
type: object
type: object
type: object
status:
description: GlobalRateLimitStatus defines the observed state of GlobalRateLimit
properties:
applied:
description: Is applied successfully or not
type: boolean
attempt:
description: number of attempts
type: integer
message:
description: Response message from Rate Limiter operator
type: string
operator_version:
description: operator version
type: string
statuses:
description: List with statuses
items:
properties:
name:
description: Status of settings loading on the RateLimiterService
type: string
reason:
description: Reason represents the cause of particular status
type: string
status:
description: Status of adding EnvoyFilter's
type: string
type: object
nullable: true
type: array
timestamp:
description: Last status update timestamp
type: string
type: object
type: object
served: true
storage: true
subresources:
status: {}
В некоторых случаях для добавления CRD администраторы требуют артефакт типа CRDProxy, где в поле data размещен непосредственно CRD.
apiVersion: apps.firepaws.io/v1
kind: CRDProxy
metadata:
name: crdproxy-globalratelimits-ratelimit-service
namespace: ${rls_namespace}
serviceAccount:
- rate-limiter-service
data: |-
< содержимое нашего артефакта СRD >
Далее описаны подготовительные шаги, специфичные для конкретного варианта развертывания: централизованный, децентрализованный.
Централизованный вариант развертывания#
Сертификаты для Ingress Gateway#
Необходимо подготовить сертификаты для Ingress Gateway (ca-root.pem, ingress.key, ingress.pem), рекомендуемая утилита для генерации и выпуска сертификатов — OpenSSL.
Для хранения «чувствительной» информации с точки зрения безопасности целевым подходом является интеграция с Secret Management System (далее SecMan).
Вариант установки с SecMan.
Добавить необходимые сертификаты в Key-Value хранилище. Структура секрета в хранилище в формате JSON:
{
"ca": "-----BEGIN CERTIFICATE-----<...>-----END CERTIFICATE-----\n",
"crt": "-----BEGIN CERTIFICATE-----<...>-----END CERTIFICATE-----\n",
"key": "-----BEGIN RSA PRIVATE KEY-----<...>-----END RSA PRIVATE KEY-----\n"
"ttl": "3m"
}
Ключи в хранилище должны соответствовать указанным:
Название ключа |
Описание |
|---|---|
ca |
Ключ для корневого сертификата (ca-root.pem) |
crt |
Ключ для серверного сертификата (ingress.pem) |
key |
Ключ для приватного ключа сертификата (ingress.key) |
ttl |
Ключ для времени жизни секрета (определяет период обновления в реальном времени секрета в Pod) |
Вариант установки без SecMan.
Добавить в Kubernetes или Red Hat OpenShift (опционально) секрет ingress-secrets.
Секрет может быть создан с помощью инструмента командной строки или через файл манифеста Secret
Пример команды для Kubernetes:
kubectl create secret generic ingress-secrets \
--from-file=ca-root.pem=ca-root.pem \
--from-file=ingress.key=ingress.key \
--from-file=ingress.pem=ingress.pem \
-n <namespace>
Здесь namespace — уникальное имя пространства.
Пример команды для OpenShift:
oc create secret generic ingress-secrets \
--from-file=ca-root.pem=ca-root.pem \
--from-file=ingress.key=ingress.key \
--from-file=ingress.pem=ingress.pem
Пример манифеста:
kind: Secret
apiVersion: v1
metadata:
name: ingress-secrets
namespace: ${rls_namespace}
data:
ca-root.pem: >-
ingress.key: >-
ingress.pem: >-
type: Opaque
Здесь поля ca-root.pem, ingress.key, ingress.pem должны быть заполнены данными из соответствующих файлов в base64 кодировке.
Пример команды для получения данных в формате base64:
base64 -w 0 ca-root.pem
Сертификаты для Egress Gateway#
Необходимо подготовить сертификаты для Egress Gateway (ca-root.pem, egress.key, egress.pem), рекомендуемая утилита для генерации и выпуска сертификатов — OpenSSL.
Для хранения «чувствительной» информации с точки зрения безопасности целевым подходом является интеграция с Secret Management System (далее SecMan).
Вариант установки с SecMan.
Добавить необходимые сертификаты в Key-Value хранилище. Структура секрета в хранилище в формате JSON:
{
"ca": "-----BEGIN CERTIFICATE-----<...>-----END CERTIFICATE-----\n",
"crt": "-----BEGIN CERTIFICATE-----<...>-----END CERTIFICATE-----\n",
"key": "-----BEGIN RSA PRIVATE KEY-----<...>-----END RSA PRIVATE KEY-----\n"
"ttl": "3m"
}
Ключи в хранилище должны соответствовать указанным:
Название ключа |
Описание |
|---|---|
ca |
Ключ для корневого сертификата (ca-root.pem) |
crt |
Ключ для серверного сертификата (egress.pem) |
key |
Ключ для приватного ключа сертификата (egress.key) |
ttl |
Ключ для времени жизни секрета (определяет период обновления в реальном времени секрета в Pod) |
Вариант установки без SecMan.
Добавить в Kubernetes или Red Hat OpenShift (опционально) секрет egress-secrets.
Секрет может быть создан с помощью инструмента командной строки или через файл манифеста Secret.
Пример команды для Kubernetes:
kubectl create secret generic egress-secrets \
--from-file=ca-root.pem=ca-root.pem \
--from-file=egress.key=ingress.key \
--from-file=egress.pem=ingress.pem \
-n <namespace>
Здесь namespace — уникальное имя пространства.
Пример команды для OpenShift:
oc create secret generic egress-secrets \
--from-file=ca-root.pem=ca-root.pem \
--from-file=egress.key=ingress.key \
--from-file=egress.pem=ingress.pem
Пример манифеста:
kind: Secret
apiVersion: v1
metadata:
name: egress-secrets
namespace: ${rls_namespace}
data:
ca-root.pem: >-
egress.key: >-
egress.pem: >-
type: Opaque
Здесь поля ca-root.pem, egress.key, egress.pem должны быть заполнены данными из соответствующих файлов в base64-кодировке.
Пример команды для получения данных в формате base64:
base64 -w 0 ca-root.pem
Сертификаты для RL Service#
Если планируется использование шифрования трафика между граничным прокси и централизованным RL Service, необходимо подготовить сертификаты для RL Service (ca-root.pem, server.key, server.pem). Рекомендуемая утилита для генерации и выпуска сертификатов — OpenSSL.
Для хранения «чувствительной» информации с точки зрения безопасности целевым подходом является интеграция с Secret Management System (далее SecMan).
Вариант установки с SecMan.
Добавить необходимые сертификаты в Key-Value хранилище. Структура секрета в хранилище в формате JSON:
{
"ca": "-----BEGIN CERTIFICATE-----<...>-----END CERTIFICATE-----\n",
"crt": "-----BEGIN CERTIFICATE-----<...>-----END CERTIFICATE-----\n",
"key": "-----BEGIN RSA PRIVATE KEY-----<...>-----END RSA PRIVATE KEY-----\n"
"ttl": "3m"
}
Ключи в хранилище должны соответствовать указанным:
Название ключа |
Описание |
|---|---|
ca |
Ключ для корневого сертификата (ca-root.pem) |
crt |
Ключ для серверного сертификата (server.pem) |
key |
Ключ для приватного ключа сертификата (server.key) |
ttl |
Ключ для времени жизни секрета (определяет период обновления в реальном времени секрета в Pod) |
Вариант установки без SecMan.
Добавить в Kubernetes или Red Hat OpenShift (опционально) секрет rate-limiter-secrets.
Секрет может быть создан с помощью инструмента командной строки или через файл манифеста Secret.
Пример команды для Kubernetes:
kubectl create secret generic rate-limiter-secrets \
--from-file=ca-root.pem=ca-root.pem \
--from-file=egress.key=server.key \
--from-file=egress.pem=server.pem \
-n <namespace>
Здесь namespace — уникальное имя пространства.
Пример команды для OpenShift:
oc create secret generic rate-limiter-secrets \
--from-file=ca-root.pem=ca-root.pem \
--from-file=egress.key=server.key \
--from-file=egress.pem=server.pem
Пример манифеста:
kind: Secret
apiVersion: v1
metadata:
name: rate-limiter-secrets
namespace: ${rls_namespace}
data:
ca-root.pem: >-
server.key: >-
server.pem: >-
type: Opaque
Здесь поля ca-root.pem, server.key, server.pem должны быть заполнены данными из соответствующих файлов в base64-кодировке.
Пример команды для получения данных в формате base64:
base64 -w 0 ca-root.pem
Ролевая модель централизованного варианта развертывания#
Для корректной работы компонента в централизованном варианте развертывания необходимо предоставление следующих прав на артефакты k8s:
Артефакт |
API группа |
Права |
Описание |
|---|---|---|---|
globalratelimits |
ratelimit.service |
- get - list - watch |
Права предоставляются на уровне кластера K8s |
globalratelimits/status globalratelimits/finalizers |
ratelimit.service |
- get - list - watch - update - patch |
Права предоставляются на уровне кластера K8s |
namespaces |
- list |
Права предоставляются на уровне кластера K8s |
|
leases |
coordination.k8s.io |
- get - update - patch |
Права предоставляются на уровне namespace, в котором развертывается централизованный SRLS |
events |
- create |
Права предоставляются на уровне namespace, в котором развертывается централизованный SRLS |
|
envoyfilters |
networking.istio.io |
- get - list - watch - create - update - patch - delete |
Права предоставляются на уровне namespace, в котором развертывается прикладной дистрибутив; в артефакте RoleBinding необходимо указать ServiceAccount в namespace централизованного SRLS |
Ниже приведены артефакты, необходимые для настройки прав доступа (актуальные артефакты доступны в <дистрибутив>/conf/k8s/base/other/operator-role):
ServiceAccount
kind: ServiceAccount
apiVersion: v1
metadata:
name: rate-limiter-service
namespace: ${rls_namespace}
ClusterRole
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: rate-limiter-service-operator
rules:
- verbs:
- get
- list
- watch
apiGroups:
- ratelimit.service
resources:
- globalratelimits
- verbs:
- get
- list
- watch
- update
- patch
apiGroups:
- ratelimit.service
resources:
- globalratelimits/status
- globalratelimits/finalizers
- verbs:
- list
apiGroups:
- ''
resources:
- namespaces
ClusterRoleBinding
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: rloperator-crb-${rls_namespace}
subjects:
- kind: ServiceAccount
name: rate-limiter-service
namespace: ${rls_namespace}
roleRef:
kind: ClusterRole
name: rate-limiter-service-operator
apiGroup: rbac.authorization.k8s.io
Lease (если не создается в рамках установки через Deploy Tools)
apiVersion: coordination.k8s.io/v1
kind: Lease
metadata:
name: srls-operator-lock
namespace: ${rls_namespace}
labels:
app: rloperator
proj: synapse-rls
agent: srls
Role
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: srls-operator-role
namespace: ${rls_namespace}
rules:
- verbs:
- get
- update
- patch
apiGroups:
- 'coordination.k8s.io'
resources:
- leases
resourceNames:
- srls-operator-lock
- apiGroups:
- ""
resources:
- events
verbs:
- create
RoleBinding
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: rloperator-rb
namespace: ${rls_namespace}
subjects:
- kind: ServiceAccount
name: rate-limiter-service
namespace: ${rls_namespace}
roleRef:
kind: Role
name: srls-operator-role
apiGroup: rbac.authorization.k8s.io
ClusterRole
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: srls-role
rules:
- verbs:
- get
- list
- watch
- create
- update
- patch
- delete
apiGroups:
- networking.istio.io
resources:
- envoyfilters
Артефакт, который необходимо создать команде сопровождения прикладного namespace для подключения к централизованному SRLS:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: srls-role-binding
namespace: ${namespace}
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: srls-role
subjects:
- kind: ServiceAccount
name: rate-limiter-service
namespace: ${rls_namespace}
Сетевая видимость RL Service в рамках кластера#
Для обеспечения возможности подключения к Pod RL Service из других namespace необходимо создать артефакт (актуальный шаблон артефакта расположен в <дистрибутив>/k8s/base/other/network-policy.yaml):
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: rlservice
namespace: ${rls-namespace}
spec:
podSelector:
matchLabels:
app: rls
proj: synapse-rls
ingress:
- ports:
- protocol: TCP
port: 8081
from:
- podSelector:
matchLabels:
srls: ratelimit
namespaceSelector: {}
policyTypes:
- Ingress
Артефакт разрешает входящий трафик в namespace централизованного SRLS к Pod RL Service по порту 8081 из других namespace, но только для Pod, у которых есть label srls: ratelimit. Данный подход позволяет сократить время на запрос к RL Service за счет прямого обращения, минуя Egress Gateway и Ingress Gateway.
Децентрализованный вариант развертывания#
Ролевая модель децентрализованного варианта развертывания#
Для корректной работы компонента в децентрализованном варианте развертывания необходимо предоставление следующих прав на артефакты k8s:
Артефакт |
API группа |
Права |
Описание |
|---|---|---|---|
globalratelimits |
ratelimit.service |
- get - list - watch |
Права предоставляются на уровне прикладного namespace |
globalratelimits/status globalratelimits/finalizers |
ratelimit.service |
- get - list - watch - update - patch |
Права предоставляются на уровне прикладного namespace |
namespaces |
- list |
Права предоставляются на уровне прикладного namespace |
|
leases |
coordination.k8s.io |
- get - update - patch |
Права предоставляются на уровне прикладного namespace |
events |
- create |
Права предоставляются на уровне прикладного namespace |
|
envoyfilters |
networking.istio.io |
- get - list - watch - create - update - patch - delete |
Права предоставляются на уровне прикладного namespace |
Возможен вариант развертывания, при котором не производится автоматизированное создание артефакта EnvoyFilter компонентом RL Operator в процессе обработки артефакта GlobaLRateLimit. В этом случае необходимо выбрать соответствующий артефакт Role, установить значение true стендозависимого параметра disable_envoy_filter_automation и создать необходимые для работы артефакты EnvoyFilter самостоятельно. Инструкция по созданию артефакта EnvoyFilter описана в документе «Руководство прикладного разработчика» в разделе «Конфигурирование артефактов среды контейнеризации и Istio для децентрализованного варианта развертывания».
Ниже приведены артефакты, необходимые для настройки прав доступа (актуальные артефакты доступны в <дистрибутив>/conf/k8s/base/operator-role/other):
ServiceAccount
kind: ServiceAccount
apiVersion: v1
metadata:
name: rate-limiter-service
namespace: ${namespace}
Role с поддержкой автоматизированного создания артефакта EnvoyFilter
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: srls-decentr-operator-role
namespace: ${namespace}
rules:
- verbs:
- get
- list
- watch
apiGroups:
- ratelimit.service
resources:
- globalratelimits
- verbs:
- get
- list
- watch
- update
- patch
apiGroups:
- ratelimit.service
resources:
- globalratelimits/status
- globalratelimits/finalizers
- verbs:
- get
- list
- watch
- create
- update
- patch
- delete
apiGroups:
- networking.istio.io
resources:
- envoyfilters
- verbs:
- get
- update
- patch
apiGroups:
- 'coordination.k8s.io'
resources:
- leases
resourceNames:
- srls-operator-lock
- apiGroups:
- ""
resources:
- events
verbs:
- create
Role без поддержки автоматизированного создания артефакта EnvoyFilter (опционально)
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: srls-decentr-operator-role
namespace: ${namespace}
rules:
- verbs:
- get
- list
- watch
apiGroups:
- ratelimit.service
resources:
- globalratelimits
- verbs:
- get
- list
- watch
- update
- patch
apiGroups:
- ratelimit.service
resources:
- globalratelimits/status
- globalratelimits/finalizers
- verbs:
- get
- update
- patch
apiGroups:
- 'coordination.k8s.io'
resources:
- leases
resourceNames:
- srls-operator-lock
- apiGroups:
- ""
resources:
- events
verbs:
- create
Lease (если не создается в рамках установки через Deploy Tools)
apiVersion: coordination.k8s.io/v1
kind: Lease
metadata:
name: srls-operator-lock
namespace: ${namespace}
labels:
app: rloperator
proj: synapse-rls
agent: srls
RoleBinding
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: rloperator
namespace: ${namespace}
subjects:
- kind: ServiceAccount
name: rate-limiter-service
namespace: ${namespace}
roleRef:
kind: Role
name: srls-decentr-operator-role
apiGroup: rbac.authorization.k8s.io
Установка#
Параметры установки#
Параметры шаблонизации расположены в <дистрибутив>/conf/custom_property.conf.yml.
Название |
Описание |
Значение по умолчанию |
|---|---|---|
srls_registry |
ссылка до registry, если не задано администратором в настройках инструмента развертывания/распаковки |
docker-registy.mydomain.com |
srls_registry_path |
базовый путь до каталога с образами, если не задано администратором в настройках инструмента развертывания/распаковки |
/public |
FLUENT_BIT_SIDECAR_ENABLED |
Если |
False |
TENANT_CODE |
Код тенанта, используемый в конфигурации fluent-bit ufs-logger, определяется в настройках инструмента развертывания/распаковки |
- |
SRLS_TLS_ENABLED |
Включить TLS-шифрование на RL Service |
False |
SRLS_TENANT_CODE |
Код тенанта, используемый в конфигурации fluent-bit ufs-logger, если в настройках инструмента развертывания/распаковки не задан параметр TENANT_CODE |
SRLS |
POD_DISRUPTION_BUDGET_ENABLED |
Если |
True |
DEPLOY_TO_KUBERNETES |
Для совместимости с Kubernetes и Platform V DropApp |
False |
DEPLOY_LEASE_ENABLED |
Разворачивать или нет артефакт Lease в составе дистрибутива |
False |
SECMAN_ENABLED |
Если |
True |
SECMAN_NAMESPACE_ENABLED |
Поддержка пространств в хранилище SecMan |
False |
SECRET_ENABLED |
Если |
False |
SSM_ENABLED |
Если |
True |
DEPLOY_ACCOUNT |
Если |
False |
DEPLOY_CENTR |
Если |
False |
DEPLOY_DECENTR |
Если |
True |
DEPLOY_LIMITS |
Если |
False |
endpoints |
Если значение параметра DEPLOY_LIMITS выставлено в |
Пример значения параметра endpoints:
[{"endpoint": "test-server2-endpoint:8080","name": "test service2","shortname": "server2","overall_limit": 100,"by_header": {"header": "synapse-consumerid","uri_prefixes": [{"uri_prefix": "/service","unit":"second","value": 5,"soft": {"step": 2,"value": 1},"anon_value": 10,"invokers": [{"header_value": "test-client-namespace2","name": "invoker_prefix_2","unit": "second","value": 10,"soft": {"step": 2,"value": 1}},{"header_value": "test-client-namespace1","name": "invoker_prefix_1","unit": "second","value": 5}]}]}},{"endpoint": "test-server-endpoint:8080","name": "test service","shortname": "server","overall_limit": -1,"by_header": {"header": "synapse-consumerid","unit": "minute","value": 5,"soft": {"step": 2,"value": 1},"anon_value": 10,"invokers": [{"header_value": "test-client-namespace2","name": "invoker2","unit": "second","value": 10,"soft": {"step": 2,"value": 1}},{"header_value": "test-client-namespace1","name": "invoker1","unit": "second","value": 5}]}},{"endpoint": "test-server3-endpoint:8080","name": "test service","shortname": "server","overall_limit": -1,"by_path": {"mask": "mask","unit": "second","quotas": {"flat": 7,"soft": {"step": 2,"value": 4}},"tenants": [{"name": "tenant1","resourceName": "rntenant1","unit": "second","quotas": {"soft": {"step": 1,"value": 2}}},{"name": "tenant2","resourceName": "rntenant2","unit": "second","quotas": {"flat": 1}}]}}]
Список стендозависимых параметров (указываются в конфигурации job) для установки и их описание представлены в таблице «Список и описание параметров». Стендозависимые параметры расположены в <дистрибутив>/conf/config/parameters.
ВАЖНО!
Названия стендозависимых параметров, начиная с версии компонента SRLS 2.6, отличаются от названий в предыдущих версиях.
Список и описание параметров:
Название |
Описание |
Пример |
Примечание |
|---|---|---|---|
rls_namespace |
Имя пространства, в котором разворачиваются RL Service, RL Operator и Ingress Gateway |
synapse-dev-sandbox |
|
rls_redisUrl |
Адрес подключения к Redis |
mymaster,redis-sentinel-0.redis-sentinel:26379,redis-sentinel-1.redis-sentinel:26379,redis-sentinel-2.redis-sentinel:26379 |
Для standalone развертывания с Redis с режимом подключения SINGLE можно указать один адрес |
rls_redisType |
Тип работы Redis |
SENTINEL |
Для подключения к Redis с одной нодой нужно указать SINGLE |
rls_localCacheSizeInBytes |
Размер локального кеша |
524288 |
|
rls_backend |
Тип хранилища key-value для RL Service |
redis |
|
rls_logLevel |
Уровень логирования для RL Service |
info |
|
rls_tls_enable |
Включение/выключение шифрования TLS |
false |
|
rls_tls_client_auth |
Запрос и валидация сертификатов пользователей: none — не запрашивать; must — запрашивать; want — запрашивать и валидировать |
none |
|
rls_tls_cert_path |
Путь до сертификатов в контейнере RL Service |
/cert |
|
rls_tls_cert_pem |
Имя файла сертификата в контейнере RL Service |
server.pem |
|
rls_tls_cert_key |
Имя файла с ключом сертификата в контейнере RL Service |
server.key |
|
rls_tls_cert_ca_pem |
Имя файла CA сертификата в контейнере RL Service |
ca-root.pem |
|
envoy_filter_grpc_timeout |
Тайм-аут на обращение к сервису Rate Limit |
1s |
|
ingress_image |
Полное название образа ingress |
registry.redhat.io/openshift-service-mesh/proxyv2-rhel8@sha256:dbb1f724333f6892d53f13c9619dcf3eff572b06c944c28fe6ad12fa18a7dc7b |
|
istiod_svc |
Адрес подключения к istiod |
istiod-basic.synapse-smcp20-control-plane.svc:15012 |
|
tracing_collector |
Адрес подключения к сервису публикации данных о трассировке запросов |
jaeger-collector.sbt-devpub-controlplanev2.svc:9411 |
|
redis_image |
Ссылка на образ с Redis 6 |
docker.registry.host/registry_redhat_io/rhel8/redis-6@sha256:fe10fcc7b9734d22a18d5c96c219b2e25d7fdddd19c6292b8b2cb38b0f2f6037 |
|
redis_fsgroup |
Идентификатор дополнительной группы для запуска Pod Redis и Redis Sentinel |
1337 |
|
redis_run_as_user |
Идентификатор пользователя для запуска Pod Redis и Redis Sentinel |
1337 |
|
operator_backend |
Тип хранилища key-value для RL Operator |
redis |
|
operator_redisType |
Тип работы Redis |
SENTINEL |
Для подключения к Redis с одной нодой нужно указать SINGLE |
operator_redisUrl |
Адрес подключения к Redis |
mymaster,redis-sentinel-0.redis-sentinel:26379,redis-sentinel-1.redis-sentinel:26379,redis-sentinel-2.redis-sentinel:26379 |
Для standalone развертывания с Redis с режимом подключения SINGLE можно указать один адрес |
operator_scope |
Режим работы оператора |
namespace |
Для централизованного режима — cluster, для децентрализованного — namespace |
operator_logLevel |
Уровень логирования RL Operator |
info |
|
rls_hostname |
Имя host в Route для подключения к namespace централизованного SRLS |
||
global.common.poddisruptionbudget.minAvailable |
Глобальный параметр среды для PodDistributionBudget |
Параметр, который гарантирует, что как минимум столько реплик будет гарантировано доступны при работе Machine Config, при обновлении кластера OpenShift и других работах, требующих переезд Pod с одной ноды на другую |
|
rloperator_ose_poddisruptionbudget_spec_minAvailable |
Параметр среды для RL Operator PodDistributionBudget |
1 |
Параметр задается в файле конфигурации operator.srls.conf |
ratelimiter_ose_poddisruptionbudget_spec_minAvailable |
Параметр среды для RateLimiter PodDistributionBudget |
1 |
Параметр задается в файле конфигурации rls.srls.conf |
ingress_ose_poddisruptionbudget_spec_minAvailable |
Параметр среды для Ingress Gateway PodDistributionBudget |
1 |
Параметр задается в файле конфигурации ingress.srls.conf |
redis_ose_poddisruptionbudget_spec_minAvailable |
Параметр среды для Redis PodDistributionBudget |
1 |
Параметр задается в файле конфигурации redis.srls.conf |
sentinel_ose_poddisruptionbudget_spec_minAvailable |
Параметр среды для Sentinel PodDistributionBudget |
1 |
Параметр задается в файле конфигурации sentinel.srls.conf |
egress_ose_poddisruptionbudget_spec_minAvailable |
Параметр среды для Egress Gateway PodDistributionBudget |
1 |
Параметр задается в файле конфигурации egress.srls.conf |
whiteList_headers_regular |
Список заголовков с регулярным выражением для реализации белого списка |
|
Данный пример для пропуска сертификата с CN=someCN.local.host.ru, больше примеров представлено в таблице «Варианты конфигурации белых списков» |
secman_role |
Роль в SecMan, получаемая при подключении к хранилищу |
role |
|
secman_namespace |
Пространство в хранилище SecMan |
CI01234567_CI76543210 |
Указывать, если в хранилище поддерживаются пространства имён. При этом должен быть задан параметр шаблонизации SECMAN_NAMESPACE_ENABLED |
secman_full_path_to_secret |
Полный путь до секрета в SecMan для Ingress Gateway |
DEV/TEST/FS/KV/ingress-secrets |
|
secman_full_path_to_secret_egress |
Полный путь до секрета в SecMan для Egress Gateway |
DEV/TEST/FS/KV/egress-secrets |
|
secman_full_path_to_rls_secret |
Полный путь до секрета в SecMan для RL Service |
DEV/TEST/FS/KV/rls-secrets |
|
secman_host |
Host для SecMan |
secman.solution.ru |
|
secman_port |
Port для SecMan |
8443 |
|
egress_secman_port |
Порт для сервиса SecMan на egress |
8550 |
|
kubernetes_service_host |
Cервис kubernetes |
kubernetes.default.svc.cluster.local |
|
kubernetes_service_port |
Порт сервиса kubernetes |
443 |
|
kube_ip |
IP-адрес сервиса kubernetes |
||
egress_kubeapi_port |
Порт для сервиса kubernetes на egress |
4443 |
|
egress_selectors |
Селекторы egress, установленного в прикладном namespace |
{"istio":"egress-my_namespace"} |
|
ufs_logger_kafka_bootstrap_servers |
Список адресов кластера брокеров Kafka для журналирования |
{ IP_ADDRESS }:9092 |
|
ufs_logger_kafka_topic |
Название топика для журналирования |
eventlog |
|
ufs_logger_kafka_security_protocol |
Конфигурация закрытого соединения с Kafka |
plaintext / ssl |
|
loggerOpenshiftRegistry |
Docker registry для образа платформенного Logger |
docker-registy.mydomain.com/public/efs |
|
logger_pl_sidecar_cpuLimit |
fluent-bit sidecar cpu limit |
200m |
|
logger_pl_sidecar_memLimit |
fluent-bit sidecar memory limit |
200Mi |
|
logger_pl_sidecar_cpuRequest |
fluent-bit sidecar cpu request |
100m |
|
logger_pl_sidecar_memRequest |
fluent-bit sidecar memory request |
100Mi |
|
logger_pl_sidecar_run_as_user |
fluent-bit sidecar securityContext runAsUser |
1001560000 |
Для k8s – 1001 |
logger_pl_sidecar_run_as_group |
fluent-bit sidecar securityContext runAsGroup |
1001560000 |
Для k8s – 2000 |
logger_pl_sidecar_cert_ca_root |
Значение в base64-кодировке logger_cacerts.cer для secret (fluent-bit-kafka-cert) fluent-bit sidecar |
||
logger_pl_sidecar_cert |
Значение в base64-кодировке logger_cert.pem для secret (fluent-bit-kafka-cert) fluent-bit sidecar |
||
logger_pl_sidecar_cert_key |
Значение в base64-кодировке logger_private-key.pem для secret (fluent-bit-kafka-cert) fluent-bit sidecar |
||
secman_sidecar_cpuLimit |
secman sidecar cpu limit |
100m |
|
secman_sidecar_cpuRequest |
secman sidecar cpu request |
50m |
|
secman_sidecar_memRequest |
secman sidecar memory request |
64Mi |
|
secman_sidecar_memLimit |
secman sidecar memory limit |
128Mi |
|
disable_envoy_filter_automation |
Если выставлено значение |
false |
|
ingress_cert_ca_root |
Значение в base64-кодировке ca-root.pem для secret (ingress-secrets) Ingress Gateway |
||
ingress_cert |
Значение в base64-кодировке ingress.pem для secret (ingress-secrets) Ingress Gateway |
||
ingress_cert_key |
Значение в base64-кодировке ingress.key для secret (ingress-secrets) Ingress Gateway |
||
egress_cert_ca_root |
Значение в base64-кодировке ca-root.pem для secret (egress-secrets) Egress Gateway |
||
egress_cert |
Значение в base64-кодировке egress.pem для secret (egress-secrets) Egress Gateway |
||
egress_cert_key |
Значение в base64-кодировке egress.key для secret (egress-secrets) Egress Gateway |
||
rls_cert_ca_root |
Значение в base64-кодировке ca-root.pem для secret (rate-limiter-secrets) RL Service |
||
rls_cert |
Значение в base64-кодировке server.pem для secret (rate-limiter-secrets) RL Service |
||
rls_cert_key |
Значение в base64-кодировке server.key для secret (rate-limiter-secrets) RL Service |
||
igeg_fsgroup |
Идентификатор дополнительной группы для запуска Pod Ingress и Egress |
1337 |
|
igeg_run_as_user |
Идентификатор пользователя для запуска Pod Ingress и Egress |
1337 |
|
igeg_run_as_group |
Идентификатор группы для запуска Pod Ingress и Egress |
1337 |
|
redis_fsgroup |
Идентификатор дополнительной группы для запуска Pod Redis и Sentinel |
1001 |
|
redis_run_as_user |
Идентификатор пользователя для запуска Pod Redis и Sentinel |
1001 |
|
redis_run_as_group |
Идентификатор группы для запуска Pod Redis и Sentinel |
1001 |
|
secman_sidecar_run_as_user |
Идентификатор пользователя для запуска secman sidecar |
1001 |
|
secman_sidecar_as_group |
Идентификатор группы для запуска secman sidecar |
1001 |
|
rls_fsgroup |
Идентификатор дополнительной группы для запуска Pod RL Operator и RL Service |
1001 |
|
rls_run_as_user |
Идентификатор пользователя для запуска Pod RL Operator и RL Service |
1001 |
|
rls_run_as_group |
Идентификатор группы для запуска Pod RL Operator и RL Service |
1001 |
Параметры числа реплик Pod:
Название |
Описание |
Значение по умолчанию |
|---|---|---|
srls_ingress_deployment_replicas |
Число реплик Ingress Gateway |
2 |
srls_egress_deployment_replicas |
Число реплик Egress Gateway |
2 |
srls_rloperator_deployment_replicas |
Число реплик RL Operator |
2 |
srls_ratelimiter_deployment_replicas |
Число реплик RL Service |
2 |
srls_redis_deployment_replicas |
Число реплик Redis |
3 |
srls_sentinel_deployment_replicas |
Число реплик Redis Sentinel |
3 |
Параметры лимитов и запросов ресурсов для Ingress Gateway:
Название |
Значение по умолчанию |
|---|---|
srls_ingress_deployment_cpuLimit |
600m |
srls_ingress_deployment_memLimit |
900Mi |
srls_ingress_deployment_cpuRequest |
400m |
srls_ingress_deployment_memRequest |
700Mi |
Параметры лимитов и запросов ресурсов для Egress Gateway:
Название |
Значение по умолчанию |
|---|---|
srls_egress_deployment_cpuLimit |
600m |
srls_egress_deployment_memLimit |
900Mi |
srls_egress_deployment_cpuRequest |
400m |
srls_egress_deployment_memRequest |
700Mi |
Параметры лимитов и запросов ресурсов для RL Operator:
Название |
Значение по умолчанию |
|---|---|
srls_rloperator_deployment_cpuLimit |
200m |
srls_rloperator_deployment_memLimit |
200Mi |
srls_rloperator_deployment_cpuRequest |
100m |
srls_rloperator_deployment_memRequest |
100Mi |
Параметры лимитов и запросов ресурсов для Istio Sidecar RL Operator:
Название |
Значение по умолчанию |
|---|---|
srls_rloperator_deployment_istio_cpuLimit |
100m |
srls_rloperator_deployment_istio_memLimit |
200Mi |
srls_rloperator_deployment_istio_cpuRequest |
50m |
srls_rloperator_deployment_istio_memRequest |
100Mi |
Параметры лимитов и запросов ресурсов для RL Service:
Название |
Значение по умолчанию |
|---|---|
srls_ratelimiter_deployment_cpuLimit |
500m |
srls_ratelimiter_deployment_memLimit |
300Mi |
srls_ratelimiter_deployment_cpuRequest |
250m |
srls_ratelimiter_deployment_memRequest |
150Mi |
Параметры лимитов и запросов ресурсов для Istio Sidecar RL Service (объём ресурсов зависит от потребителя, рекомендуется определять по результатам нагрузочного тестирования):
Название |
Значение по умолчанию |
|---|---|
srls_ratelimiter_deployment_istio_cpuLimit |
300m |
srls_ratelimiter_deployment_istio_memLimit |
500Mi |
srls_ratelimiter_deployment_istio_cpuRequest |
200m |
srls_ratelimiter_deployment_istio_memRequest |
300Mi |
Параметры лимитов и запросов ресурсов для Redis:
Название |
Значение по умолчанию |
|---|---|
srls_redis_deployment_cpuLimit |
300m |
srls_redis_deployment_memLimit |
500Mi |
srls_redis_deployment_cpuRequest |
150m |
srls_redis_deployment_memRequest |
250Mi |
Параметры лимитов и запросов ресурсов для Redis Sentinel:
Название |
Значение по умолчанию |
|---|---|
srls_sentinel_deployment_cpuLimit |
200m |
srls_sentinel_deployment_memLimit |
200Mi |
srls_sentinel_deployment_cpuRequest |
100m |
srls_sentinel_deployment_memRequest |
100Mi |
Параметры конфигурирования классов приоритетов:
Название |
Значение по умолчанию |
|---|---|
srls_rloperator_deployment_priorityClassName |
Пустое значение |
srls_ratelimiter_deployment_priorityClassName |
Пустое значение |
srls_ingress_deployment_priorityClassName |
Пустое значение |
srls_egress_deployment_priorityClassName |
Пустое значение |
srls_redis_deployment_priorityClassName |
Пустое значение |
srls_sentinel_deployment_priorityClassName |
Пустое значение |
Параметры конфигурирования стратегии RollingUpdate:
Название |
Значение по умолчанию |
|---|---|
srls_rloperator_deployment_maxUnavailable |
25% |
srls_ratelimiter_deployment_maxUnavailable |
25% |
srls_ingress_deployment_maxUnavailable |
25% |
srls_egress_deployment_maxUnavailable |
25% |
srls_rloperator_deployment_maxSurge |
25% |
srls_ratelimiter_deployment_maxSurge |
25% |
srls_ingress_deployment_maxSurge |
25% |
Варианты конфигурации белых списков:
Описание |
Значение |
|---|---|
Доступ разрешен с любым сертификатом |
|
Доступ разрешен для сертификата с CN=someCN.local.host.ru |
|
Доступ разрешен для сертификатов с CN=someCN.local.host.ru и CN=anotherCN.local.host.ru |
|
Доступ разрешен для сертификата с указанным хешем |
|
Для получения хеша сертификата выполните:
openssl x509 -in <путь до сертификата>/client.crt -outform DER | openssl dgst -sha256 | cut -d" " -f2
Пример:
Команда: openssl x509 -in tls.crt -outform DER | openssl dgst -sha256 | cut -d" " -f2
Результат: c8ce13ba08c1c7003b81cd3ff8025f0e39ca0357346cca5f9f28e4174f23cfbc
Список параметров для настройки артефакта GlobalRateLimit при развертывании по агентской схеме.
Название |
Описание |
Значение по умолчанию |
|---|---|---|
limits_srls_config_name |
Название экземпляра артефакта GlobalRateLimit |
rate-limit-config |
limits_srls_config_namespace |
Идентификатор namespace |
<class 'jinja2.utils.Namespace'> |
limits_envoy_version |
Используемая версия Envoy в Ingress Gateway |
1.14 |
limits_ose_istio_all_common_ingressAppSelector |
Лейбл «app» для определения Pod Ingress Gateway |
|
limits_ose_istio_all_common_ingressIstioSelector |
Лейбл «istio» для определения Pod Ingress Gateway |
|
limits_visibility |
Отвечает за область видимости данного CRD ( |
namespace |
limits_rlservice |
Значение зависит от выбранного варианта инсталляции SRLS, централизованный — в качестве хоста должен быть указан Headless Service, указывающий на Pod Egress Gateway, децентрализованный — rate-limiter-headless-service |
rate-limiter-headless-service |
limits_rls_serverport |
Значение зависит от выбранного варианта инсталляции SRLS, централизованный — 12001, децентрализованный — 8081 |
8081 |
limits_srls_namespace |
Идентификатор namespace, в котором развернут централизованный SRLS, используется только для централизованного варианта инсталляции |
<class 'jinja2.utils.Namespace'> |
Значения по умолчанию, приведенные в двойных фигурных скобках, указывают на стандартные переменные Job CDJE DevTools.
Параметры установки, специфичные для выбранного варианта развертывания#
Централизованный вариант развертывания:
Название |
Тип параметра |
Значение |
|---|---|---|
DEPLOY_CENTR |
Параметр шаблонизации |
|
DEPLOY_DECENTR |
Параметр шаблонизации |
|
operator_scope |
Стендозависимый параметр |
|
rls_typeMod |
Стендозависимый параметр |
|
Централизованный вариант (c шифрованием TLS) развертывания:
Название |
Тип параметра |
Значение |
|---|---|---|
SRLS_TLS_ENABLED |
Параметр шаблонизации |
|
DEPLOY_CENTR |
Параметр шаблонизации |
|
DEPLOY_DECENTR |
Параметр шаблонизации |
|
operator_scope |
Стендозависимый параметр |
|
rls_typeMod |
Стендозависимый параметр |
|
rls_tls_enable |
Стендозависимый параметр |
|
Децентрализованный вариант развертывания:
Название |
Тип параметра |
Значение |
|---|---|---|
DEPLOY_CENTR |
Параметр шаблонизации |
|
DEPLOY_DECENTR |
Параметр шаблонизации |
|
operator_scope |
Стендозависимый параметр |
|
rls_typeMod |
Стендозависимый параметр |
|
Ручная установка сервиса#
В зависимости от того, какой компонент Synapse Rate Limiter требуется установить: централизованный или децентрализованный, необходимо обратиться к соответствующему подразделу данного раздела
Примечание — при добавлении артефактов все параметры, обозначенные ${<параметр>}, заменить на необходимые значения. Описание параметров представлено в разделе «Параметры установки».
Установка централизованного Synapse Rate Limiter#
Установка RL Operator#
Для установки RL Operator в необходимый namespace добавить следующие артефакты (актуальные артефакты доступны в <дистрибутив>/conf/k8s/base/):
Deployment (здесь приведен без fluent-bit sidecar)
kind: Deployment
apiVersion: apps/v1
metadata:
name: rloperator
namespace: ${rls_namespace}
labels:
app: rloperator
proj: synapse-rls
agent: srls
version: ${jenkins_env.fp_artifact_version}
platformv.sber.ru/componentCode: SRLS
platformv.sber.ru/productCode: SEI
spec:
replicas: ${srls_rloperator_deployment_replicas}
selector:
matchLabels:
app: rloperator
proj: synapse-rls
template:
metadata:
labels:
app: rloperator
proj: synapse-rls
agent: srls
platformv.sber.ru/binVersion: ${jenkins_env.fp_artifact_version}
platformv.sber.ru/cfgVersion: ${jenkins_env.fp_artifact_version}
annotations:
sidecar.istio.io/inject: 'false'
spec:
restartPolicy: Always
serviceAccountName: rate-limiter-service
imagePullSecrets:
- name: ${rls_image_pull_secret}
schedulerName: default-scheduler
terminationGracePeriodSeconds: 30
volumes:
- name: logsshare
emptyDir: {}
- name: fluent-bit-tmp
emptyDir: {}
- name: fluent-bit-sidecar
configMap:
name: operator-fluent-bit-sidecar
defaultMode: 256
optional: true
- name: fluent-bit-kafka-cert
secret:
defaultMode: 256
secretName: fluent-bit-kafka-cert
optional: true
priorityClassName: ${srls_rloperator_deployment_priorityClassName}
containers:
- resources:
limits:
cpu: ${srls_rloperator_deployment_cpuLimit}
memory: ${srls_rloperator_deployment_memLimit}
requests:
cpu: ${srls_rloperator_deployment_cpuRequest}
memory: ${srls_rloperator_deployment_memRequest}
readinessProbe:
httpGet:
path: /readyz
port: 8080
scheme: HTTP
initialDelaySeconds: 5
timeoutSeconds: 1
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
terminationMessagePath: /dev/termination-log
name: rloperator
livenessProbe:
httpGet:
path: /healthz
port: 8080
scheme: HTTP
initialDelaySeconds: 5
timeoutSeconds: 1
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
securityContext:
readOnlyRootFilesystem: true
runAsNonRoot: true
privileged: false
capabilities:
drop:
- ALL
ports:
- containerPort: 8080
protocol: TCP
- containerPort: 8081
protocol: TCP
imagePullPolicy: Always
terminationMessagePolicy: File
env:
- name: POD_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
- name: NODE_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: spec.nodeName
- name: POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
envFrom:
- configMapRef:
name: operator-config
image: {{ registry | default(srls_registry) }}{{ registry_path | default(srls_registry_path) }}/srls/operator@${jenkins_env.fp_image_hash}
args:
- env
volumeMounts:
- mountPath: '/var/synapse/logs'
name: logsshare
serviceAccount: rate-limiter-service
dnsPolicy: ClusterFirst
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: ${srls_rloperator_deployment_maxUnavailable}
maxSurge: ${srls_rloperator_deployment_maxSurge}
revisionHistoryLimit: 1
progressDeadlineSeconds: 600
ConfigMap
kind: ConfigMap
apiVersion: v1
metadata:
name: operator-config
namespace: ${rls_namespace}
labels:
app: rloperator
proj: synapse-rls
agent: srls
data:
TZ: Europe/Moscow
IS_IN_CLUSTER: 'true'
OPERATOR_NAMESPACE: '${rls_namespace}'
OPERATION_SCOPE: '${operator_scope}'
ENVOY_FILTER_GRPC_TIMEOUT: '${envoy_filter_grpc_timeout}'
OPERATOR_METRICS_PORT: '8081'
CONFIG_MANAGER_GRPC_HOST: '${operator_serviceUrl}'
CONFIG_MANAGER_GRPC_PORT: '${operator_servicePort}'
LOG_LEVEL: '${operator_logLevel}'
DISABLE_ENVOY_FILTER_AUTOMATION: '${disable_envoy_filter_automation}'
ELECTION_ENABLED: '${operator_election_enabled}'
KUBERNETES_SERVICE_HOST: '${kubernetes_service_host}'
KUBERNETES_SERVICE_PORT: '${kubernetes_service_port}'
Примечание — все возможные настройки для установки в ConfigMap перечислены в таблице ниже.
Настройки RL Operator
Название |
Описание |
Значение по умолчанию |
|---|---|---|
IS_IN_CLUSTER |
Режим запуска: Внутри кластера K8s/Вне кластера |
false |
OPERATOR_NAMESPACE |
Имя пространства, в котором разворачивается оператор |
rlservice-ns |
OPERATION_SCOPE |
Область работы оператора: cluster, namespace |
cluster |
OPERATOR_METRICS_PORT |
Порт для публикации метрик |
8081 |
OPERATOR_HEALTHZ_PORT |
Порт для healthcheck |
8080 |
LOG_LEVEL |
Переключение уровня логирования: info, debug, trace |
info |
LOG_CHANGE_LEVEL_PORT |
Порт для изменения уровня логирования в runtime |
9080 |
CONFIG_MANAGER_GRPC_HOST |
Host для подключения к RLS для загрузки конфигурации Limit |
rate-limiter-service |
CONFIG_MANAGER_GRPC_PORT |
Порт для подключения к RLS для загрузки конфигурации Limit |
8082 |
ENVOY_FILTER_GRPC_TIMEOUT |
gRPC тайм-аут подключения к RateLimiterService |
1s |
ELECTION_ENABLED |
Включение/отключение механизма leader election |
true |
ELECTION_RESOURCE_ID |
Название артефакта Lease для механизма leader election |
srls-operator-lock |
ELECTION_LEASE_DURATION |
Продолжительность взятия lock |
30 |
ELECTION_RENEW_DEADLINE |
Максимальное время, в течение которого необходимо обновить lock |
15 |
ELECTION_RETRY_PERIOD |
Задержка между попытками взять lock |
5 |
ELECTION_CHECK_TIMEOUT |
Тайм-аут на проверку взятия lock |
20 |
KUBERNETES_SERVICE_HOST |
Cервис kubernetes |
|
KUBERNETES_SERVICE_PORT |
Порт сервиса kubernetes |
Примеры значений ENVOY_FILTER_GRPC_TIMEOUT:
Заданное |
Установленное |
Примечание |
|---|---|---|
10s |
10s |
Значение используется без преобразования |
0.1s |
0.1s |
-//- |
200 |
0.2s |
Значение, указанное без символа «s», считается заданным в миллисекундах |
30 |
0.03s |
-//- |
30ds |
1s |
Значение, не попадающее под шаблон число + символ «s», заменяется значением по умолчанию |
Service
kind: Service
apiVersion: v1
metadata:
name: rloperator
namespace: ${rls_namespace}
labels:
app: rloperator
proj: synapse-rls
agent: srls
annotations:
prometheus.io.path: /metrics
prometheus.io.port: '8081'
prometheus.io.scrape: 'true'
spec:
selector:
app: rloperator
proj: synapse-rls
ports:
- name: http
protocol: TCP
port: 8080
targetPort: 8080
- name: metric-port
protocol: TCP
port: 8081
targetPort: 8081
PodDisruptionBudget
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: rloperator-pdb
namespace: ${rls_namespace}
labels:
app: rloperator
proj: synapse-rls
agent: srls
spec:
minAvailable: ${rloperator_ose_poddisruptionbudget_spec_minAvailable}
selector:
matchLabels:
app: rloperator
Установка RL Service#
Для установки RL Service в необходимый namespace добавить следующие артефакты:
Deployment (здесь приведен без fluent-bit, secman sidecar)
kind: Deployment
apiVersion: apps/v1
metadata:
name: rate-limiter-service
namespace: ${rls_namespace}
labels:
app: rls
proj: synapse-rls
agent: srls
version: ${jenkins_env.fp_artifact_version}
platformv.sber.ru/componentCode: SRLS
platformv.sber.ru/productCode: SEI
spec:
replicas: ${srls_ratelimiter_deployment_replicas}
selector:
matchLabels:
app: rls
proj: synapse-rls
template:
metadata:
labels:
app: rls
proj: synapse-rls
agent: srls
platformv.sber.ru/binVersion: ${jenkins_env.fp_artifact_version}
platformv.sber.ru/cfgVersion: ${jenkins_env.fp_artifact_version}
annotations:
sidecar.istio.io/inject: 'false'
spec:
volumes:
- name: logsshare
emptyDir: {}
- name: fluent-bit-tmp
emptyDir: {}
- name: fluent-bit-sidecar
configMap:
name: rlservice-fluent-bit-sidecar
defaultMode: 256
optional: true
- name: fluent-bit-kafka-cert
secret:
defaultMode: 256
secretName: fluent-bit-kafka-cert
optional: true
priorityClassName: ${srls_ratelimiter_deployment_priorityClassName}
containers:
- resources:
limits:
cpu: ${srls_ratelimiter_deployment_cpuLimit}
memory: ${srls_ratelimiter_deployment_memLimit}
requests:
cpu: ${srls_ratelimiter_deployment_cpuRequest}
memory: ${srls_ratelimiter_deployment_memRequest}
terminationMessagePath: /dev/termination-log
name: rate-limiter-service
securityContext:
readOnlyRootFilesystem: true
runAsNonRoot: true
privileged: false
capabilities:
drop:
- ALL
readinessProbe:
httpGet:
path: /ready
port: 8080
scheme: HTTP
initialDelaySeconds: 5
timeoutSeconds: 1
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
livenessProbe:
httpGet:
path: /healthcheck
port: 8080
scheme: HTTP
initialDelaySeconds: 5
timeoutSeconds: 1
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
ports:
- name: prom-2112
protocol: TCP
containerPort: 2112
- name: http-debug-port
containerPort: 15021
protocol: TCP
- name: http
containerPort: 8080
protocol: TCP
- name: grpc
containerPort: 8081
protocol: TCP
imagePullPolicy: Always
terminationMessagePolicy: File
env:
- name: POD_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
- name: NODE_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: spec.nodeName
- name: POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
volumeMounts:
- name: logsshare
mountPath: /var/ratelimiter/logs
envFrom:
- configMapRef:
name: rls-config
image: {{ registry | default(srls_registry) }}{{ registry_path | default(srls_registry_path) }}/srls/rls@${jenkins_env.fp_image_hash}
restartPolicy: Always
terminationGracePeriodSeconds: 30
dnsPolicy: ClusterFirst
imagePullSecrets:
- name: ${rls_image_pull_secret}
schedulerName: default-scheduler
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: ${srls_ratelimiter_deployment_maxUnavailable}
maxSurge: ${srls_ratelimiter_deployment_maxSurge}
revisionHistoryLimit: 1
progressDeadlineSeconds: 600
ConfigMap
kind: ConfigMap
apiVersion: v1
metadata:
name: rls-config
namespace: ${rls_namespace}
labels:
app: rls
proj: synapse-rls
agent: srls
data:
REDIS_SOCKET_TYPE: tcp
REDIS_URL: '${rls_redisUrl}'
REDIS_TYPE: '${rls_redisType}'
CONFIG_MANAGER_REDIS_URL: '${rls_redisUrl}'
CONFIG_MANAGER_REDIS_TYPE: '${rls_redisType}'
REDIS_HEALTH_CHECK_ACTIVE_CONNECTION: 'true'
LOG_LEVEL: '${rls_logLevel}'
LOCAL_CACHE_SIZE_IN_BYTES: '${rls_localCacheSizeInBytes}'
TZ: Europe/Moscow
BACKEND_TYPE: '${rls_backend}'
GRPC_TLS_ENABLE: '${rls_tls_enable}'
GRPC_TLS_CLIENT_AUTH: '${rls_tls_client_auth}'
GRPC_CERTIFICATE_PATH: '${rls_tls_cert_path}'
GRPC_CERTIFICATE_PEM: '${rls_tls_cert_pem}'
GRPC_CERTIFICATE_KEY: '${rls_tls_cert_key}'
GRPC_CERTIFICATE_CA_PEM: '${rls_tls_cert_ca_pem}'
Примечание — здесь указаны минимально необходимые настройки. Все возможные параметры RateLimiterService можно посмотреть в таблице ниже.
Настройки RateLimiterService
Название |
Значение по умолчанию |
|---|---|
Конфигурация адреса и портов сервера |
|
HOST |
0.0.0.0 |
PORT |
8080 |
GRPC_HOST |
0.0.0.0 |
GRPC_PORT |
8081 |
DEBUG_HOST |
0.0.0.0 |
DEBUG_PORT |
6070 |
CONFIG_MANAGER_GRPC_HOST |
0.0.0.0 |
CONFIG_MANAGER_GRPC_PORT |
8082 |
CONFIG_CLIENT_GRPC_HOST |
0.0.0.0 |
CONFIG_CLIENT_GRPC_PORT |
8091 |
Настройки логирования |
|
LOG_LEVEL |
WARN |
LOG_FORMAT |
text |
Настройки конфигурирования RateLimiter |
|
REDIS_HEALTH_CHECK_ACTIVE_CONNECTION |
false |
TYPE_MOD |
client |
Настройки для всех типов кеша |
|
EXPIRATION_JITTER_MAX_SECONDS |
300 |
LOCAL_CACHE_SIZE_IN_BYTES |
0 |
NEAR_LIMIT_RATIO |
0.8 |
CACHE_KEY_PREFIX |
- |
BACKEND_TYPE |
redis |
Настройки Redis |
|
REDIS_SOCKET_TYPE |
unix |
REDIS_TYPE |
SINGLE |
REDIS_URL |
/var/run/nutcracker/ratelimit.sock |
REDIS_POOL_SIZE |
10 |
REDIS_AUTH |
- |
REDIS_TLS |
false |
REDIS_PIPELINE_WINDOW |
0 |
REDIS_PIPELINE_LIMIT |
0 |
REDIS_PERSECOND |
false |
REDIS_PERSECOND_SOCKET_TYPE |
unix |
REDIS_PERSECOND_TYPE |
SINGLE |
REDIS_PERSECOND_URL |
/var/run/nutcracker/ratelimitpersecond.sock |
REDIS_PERSECOND_POOL_SIZE |
10 |
REDIS_PERSECOND_AUTH |
- |
REDIS_PERSECOND_TLS |
false |
REDIS_PERSECOND_PIPELINE_WINDOW |
0 |
REDIS_PERSECOND_PIPELINE_LIMIT |
0 |
Настройки ConfigManager Redis |
|
CONFIG_MANAGER_REDIS_TYPE |
SINGLE |
CONFIG_MANAGER_REDIS_URL |
/var/run/nutcracker/ratelimit.sock |
CONFIG_MANAGER_REDIS_POOL_SIZE |
1 |
CONFIG_MANAGER_REDIS_AUTH |
- |
CONFIG_MANAGER_REDIS_TLS |
false |
Настройки Prometheus |
|
PROMETHEUS_ENDPOINT |
/prometheus/metrics |
PROMETHEUS_ADDRESS |
:2112 |
PROMETHEUS_CACHE_STATS_FLUSH_INTERVAL_SEC |
5 |
Настройки TLS |
|
GRPC_TLS_ENABLE |
false |
GRPC_TLS_CLIENT_AUTH |
none |
GRPC_CERTIFICATE_PATH |
/cert |
GRPC_CERTIFICATE_PEM |
server.pem |
GRPC_CERTIFICATE_KEY |
server.key |
GRPC_CERTIFICATE_CA_PEM |
ca-root.pem |
Service
kind: Service
apiVersion: v1
metadata:
name: rate-limiter-service
namespace: ${rls_namespace}
labels:
app: rls
proj: synapse-rls
agent: srls
annotations:
prometheus.io.path: /prometheus/metrics
prometheus.io.port: '2112'
prometheus.io.scrape: 'true'
spec:
selector:
app: rls
proj: synapse-rls
ports:
- name: metric-port
protocol: TCP
port: 2112
targetPort: 2112
- name: http-8080
protocol: TCP
port: 8080
targetPort: 8080
- name: debug-port
protocol: TCP
port: 6070
targetPort: 6070
- name: grpc-8081
protocol: TCP
port: 8081
targetPort: 8081
- name: grpc-8082
protocol: TCP
port: 8082
targetPort: 8082
Headless Service
kind: Service
apiVersion: v1
metadata:
name: rate-limiter-headless-service
namespace: ${rls_namespace}
labels:
app: rls
proj: synapse-rls
agent: srls
spec:
clusterIP: None
selector:
app: rls
proj: synapse-rls
ports:
- name: grpc-8081
protocol: TCP
port: 8081
targetPort: 8081
PodDisruptionBudget
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: rls-pdb
namespace: ${rls_namespace}
labels:
app: rls
proj: synapse-rls
agent: srls
spec:
minAvailable: ${ratelimiter_ose_poddisruptionbudget_spec_minAvailable}
selector:
matchLabels:
app: rls
Установка Ingress Gateway#
Для установки Ingress Gateway в необходимый namespace добавить следующие артефакты:
Deployment
Если выбран вариант установки без SecMan:
kind: Deployment
apiVersion: apps/v1
metadata:
name: ingress-${rls_namespace}
namespace: ${rls_namespace}
labels:
app: ingress-${rls_namespace}
istio: ingress-${rls_namespace}
proj: synapse-rls
agent: srls
spec:
replicas: 2
selector:
matchLabels:
app: ingress-${rls_namespace}
istio: ingress-${rls_namespace}
template:
metadata:
creationTimestamp: null
labels:
app: ingress-${rls_namespace}
proj: synapse-rls
chart: gateways
heritage: Tiller
istio: ingress-${rls_namespace}
release: istio
agent: srls
annotations:
sidecar.istio.io/inject: 'false'
spec:
restartPolicy: Always
serviceAccountName: default
imagePullSecrets:
- name: rls-image-pull-secret
schedulerName: default-scheduler
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: beta.kubernetes.io/arch
operator: In
values:
- amd64
- ppc64le
- s390x
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 2
preference:
matchExpressions:
- key: beta.kubernetes.io/arch
operator: In
values:
- amd64
- weight: 2
preference:
matchExpressions:
- key: beta.kubernetes.io/arch
operator: In
values:
- ppc64le
- weight: 2
preference:
matchExpressions:
- key: beta.kubernetes.io/arch
operator: In
values:
- s390x
terminationGracePeriodSeconds: 60
securityContext: {}
priorityClassName: ${srls_ingress_deployment_priorityClassName}
containers:
- resources:
limits:
cpu: 600m
memory: 900Mi
requests:
cpu: 400m
memory: 700Mi
readinessProbe:
httpGet:
path: /healthz/ready
port: 15021
scheme: HTTP
initialDelaySeconds: 1
timeoutSeconds: 5
periodSeconds: 2
successThreshold: 1
failureThreshold: 30
securityContext:
readOnlyRootFilesystem: true
runAsNonRoot: true
privileged: false
capabilities:
drop:
- ALL
terminationMessagePath: /dev/termination-log
name: istio-proxy
env:
- name: ISTIO_META_UNPRIVILEGED_POD
value: 'true'
- name: JWT_POLICY
value: first-party-jwt
- name: PILOT_CERT_PROVIDER
value: istiod
- name: CA_ADDR
value: '${istiod_svc}'
- name: PROXY_CONFIG
value: >
{"discoveryAddress":"${istiod_svc}","tracing":{"zipkin":{"address":"${tracing_collector}"},"tlsSettings":{"subjectAltNames":[]}},"proxyMetadata":{"DNS_AGENT":""}}
- name: NODE_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: spec.nodeName
- name: POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
- name: INSTANCE_IP
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: status.podIP
- name: HOST_IP
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: status.hostIP
- name: SERVICE_ACCOUNT
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: spec.serviceAccountName
- name: CANONICAL_SERVICE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: 'metadata.labels[''service.istio.io/canonical-name'']'
- name: CANONICAL_REVISION
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: 'metadata.labels[''service.istio.io/canonical-revision'']'
- name: ISTIO_META_WORKLOAD_NAME
value: ingress-${rls_namespace}
- name: ISTIO_META_OWNER
value: >-
kubernetes://apis/apps/v1/namespaces/${rls_namespace}/deployments/ingress-${rls_namespace}
- name: ISTIO_META_MESH_ID
value: cluster.local
- name: ISTIO_META_ROUTER_MODE
value: sni-dnat
- name: ISTIO_META_CLUSTER_ID
value: Kubernetes
ports:
- name: status-port
containerPort: 15021
protocol: TCP
- name: https-8443
containerPort: 8443
protocol: TCP
imagePullPolicy: Always
volumeMounts:
- name: istio-envoy
mountPath: /etc/istio/proxy
- name: config-volume
mountPath: /etc/istio/config
- name: istiod-ca-cert
mountPath: /var/run/secrets/istio
- name: podinfo
mountPath: /etc/istio/pod
- name: val-uds-socket
mountPath: /tmp/val-uds-socket
- name: rls-ingress-certs
readOnly: true
mountPath: /etc/rls/ingress
terminationMessagePolicy: File
image: ${ingress_image}
args:
- proxy
- router
- '--domain'
- $(POD_NAMESPACE).svc.cluster.local
- '--proxyLogLevel=warning'
- '--proxyComponentLogLevel=misc:error'
- '--log_output_level=default:info'
- '--serviceCluster'
- ingress-${rls_namespace}
- '--trust-domain=cluster.local'
serviceAccount: default
volumes:
- name: istiod-ca-cert
configMap:
name: istio-ca-root-cert
defaultMode: 0400
- name: podinfo
downwardAPI:
items:
- path: labels
fieldRef:
apiVersion: v1
fieldPath: metadata.labels
- path: annotations
fieldRef:
apiVersion: v1
fieldPath: metadata.annotations
defaultMode: 0400
- name: istio-envoy
emptyDir: {}
- name: config-volume
configMap:
name: istio-basic
defaultMode: 0400
optional: true
- name: val-uds-socket
emptyDir: {}
- name: rls-ingress-certs
secret:
secretName: ingress-secrets
defaultMode: 0400
optional: true
dnsPolicy: ClusterFirst
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: ${srls_ingress_deployment_maxUnavailable}
maxSurge: ${srls_ingress_deployment_maxSurge}
revisionHistoryLimit: 10
progressDeadlineSeconds: 1200
Если выбран вариант установки с SecMan:
kind: Deployment
apiVersion: apps/v1
metadata:
name: ingress-${rls_namespace}
namespace: ${rls_namespace}
labels:
app: ingress-${rls_namespace}
istio: ingress-${rls_namespace}
proj: synapse-rls
agent: srls
spec:
replicas: 2
selector:
matchLabels:
app: ingress-${rls_namespace}
istio: ingress-${rls_namespace}
template:
metadata:
creationTimestamp: null
labels:
app: ingress-${rls_namespace}
proj: synapse-rls
chart: gateways
heritage: Tiller
istio: ingress-${rls_namespace}
release: istio
secman-injector: enabled
agent: srls
annotations:
sidecar.istio.io/inject: 'false'
vault.hashicorp.com/agent-init-first: "true"
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/agent-inject-secret-ca-root.pem: "true"
vault.hashicorp.com/agent-inject-secret-ingress.pem: "true"
vault.hashicorp.com/agent-inject-secret-ingress.key: "true"
vault.hashicorp.com/agent-inject-template-ca-root.pem: |
{{- with secret "${secman_full_path_to_secret}" -}}
{{ .Data.ca }}
{{- end }}
vault.hashicorp.com/agent-inject-template-ingress.pem: |
{{- with secret "${secman_full_path_to_secret}" -}}
{{ .Data.crt }}
{{- end }}
vault.hashicorp.com/agent-inject-template-ingress.key: |
{{- with secret "${secman_full_path_to_secret}" -}}
{{ .Data.key }}
{{- end }}
vault.hashicorp.com/agent-pre-populate: "true"
vault.hashicorp.com/role: ${secman_role}
vault.hashicorp.com/secret-volume-path: /etc/rls/ingress
vault.hashicorp.com/agent-limits-cpu: 500m
vault.hashicorp.com/agent-limits-mem: 128Mi
vault.hashicorp.com/agent-requests-cpu: 250m
vault.hashicorp.com/agent-requests-mem: 64Mi
spec:
restartPolicy: Always
serviceAccountName: default
imagePullSecrets:
- name: rls-image-pull-secret
schedulerName: default-scheduler
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: beta.kubernetes.io/arch
operator: In
values:
- amd64
- ppc64le
- s390x
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 2
preference:
matchExpressions:
- key: beta.kubernetes.io/arch
operator: In
values:
- amd64
- weight: 2
preference:
matchExpressions:
- key: beta.kubernetes.io/arch
operator: In
values:
- ppc64le
- weight: 2
preference:
matchExpressions:
- key: beta.kubernetes.io/arch
operator: In
values:
- s390x
terminationGracePeriodSeconds: 60
securityContext: {}
containers:
- resources:
limits:
cpu: 600m
memory: 900Mi
requests:
cpu: 400m
memory: 700Mi
readinessProbe:
httpGet:
path: /healthz/ready
port: 15021
scheme: HTTP
initialDelaySeconds: 1
timeoutSeconds: 5
periodSeconds: 2
successThreshold: 1
failureThreshold: 30
securityContext:
readOnlyRootFilesystem: true
runAsNonRoot: true
privileged: false
capabilities:
drop:
- ALL
terminationMessagePath: /dev/termination-log
name: istio-proxy
env:
- name: ISTIO_META_UNPRIVILEGED_POD
value: 'true'
- name: JWT_POLICY
value: first-party-jwt
- name: PILOT_CERT_PROVIDER
value: istiod
- name: CA_ADDR
value: '${istiod_svc}'
- name: PROXY_CONFIG
value: >
{"discoveryAddress":"${istiod_svc}","tracing":{"zipkin":{"address":"${tracing_collector}"},"tlsSettings":{"subjectAltNames":[]}},"proxyMetadata":{"DNS_AGENT":""}}
- name: NODE_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: spec.nodeName
- name: POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
- name: INSTANCE_IP
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: status.podIP
- name: HOST_IP
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: status.hostIP
- name: SERVICE_ACCOUNT
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: spec.serviceAccountName
- name: CANONICAL_SERVICE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: 'metadata.labels[''service.istio.io/canonical-name'']'
- name: CANONICAL_REVISION
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: 'metadata.labels[''service.istio.io/canonical-revision'']'
- name: ISTIO_META_WORKLOAD_NAME
value: ingress-${rls_namespace}
- name: ISTIO_META_OWNER
value: >-
kubernetes://apis/apps/v1/namespaces/${rls_namespace}/deployments/ingress-${rls_namespace}
- name: ISTIO_META_MESH_ID
value: cluster.local
- name: ISTIO_META_ROUTER_MODE
value: sni-dnat
- name: ISTIO_META_CLUSTER_ID
value: Kubernetes
ports:
- name: status-port
containerPort: 15021
protocol: TCP
- name: https-8443
containerPort: 8443
protocol: TCP
imagePullPolicy: Always
volumeMounts:
- name: istio-envoy
mountPath: /etc/istio/proxy
- name: config-volume
mountPath: /etc/istio/config
- name: istiod-ca-cert
mountPath: /var/run/secrets/istio
- name: podinfo
mountPath: /etc/istio/pod
- name: val-uds-socket
mountPath: /tmp/val-uds-socket
terminationMessagePolicy: File
image: ${ingress_image}
args:
- proxy
- router
- '--domain'
- $(POD_NAMESPACE).svc.cluster.local
- '--proxyLogLevel=warning'
- '--proxyComponentLogLevel=misc:error'
- '--log_output_level=default:info'
- '--serviceCluster'
- ingress-${rls_namespace}
- '--trust-domain=cluster.local'
serviceAccount: default
volumes:
- name: istiod-ca-cert
configMap:
name: istio-ca-root-cert
defaultMode: 0400
- name: podinfo
downwardAPI:
items:
- path: labels
fieldRef:
apiVersion: v1
fieldPath: metadata.labels
- path: annotations
fieldRef:
apiVersion: v1
fieldPath: metadata.annotations
defaultMode: 0400
- name: istio-envoy
emptyDir: {}
- name: config-volume
configMap:
name: istio-basic
defaultMode: 0400
optional: true
- name: val-uds-socket
emptyDir: {}
dnsPolicy: ClusterFirst
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
revisionHistoryLimit: 10
progressDeadlineSeconds: 1200
Если в хранилище секретов поддерживаются пространства, то в аннотациях дополнительно указать свой namespace.
vault.hashicorp.com/namespace: ${secman_namespace}
Gateway
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: ingress-rate-limiter
namespace: ${rls_namespace}
labels:
app: ingress-${rls_namespace}
istio: ingress-${rls_namespace}
proj: synapse-rls
agent: srls
spec:
selector:
app: ingress-${rls_namespace}
istio: ingress-${rls_namespace}
servers:
- hosts:
- '*'
port:
name: grpc-8443
number: 8443
protocol: HTTPS
tls:
minProtocolVersion: TLSV1_2
maxProtocolVersion: TLSV1_2
caCertificates: /etc/rls/ingress/ca-root.pem
mode: MUTUAL
privateKey: /etc/rls/ingress/ingress.key
serverCertificate: /etc/rls/ingress/ingress.pem
Service
kind: Service
apiVersion: v1
metadata:
name: ingressgateway-svc
namespace: ${rls_namespace}
labels:
app: ingress-${rls_namespace}
istio: ingress-${rls_namespace}
proj: synapse-rls
agent: srls
spec:
ports:
- name: status-port
protocol: TCP
port: 15020
targetPort: 15020
- name: grpc-443
protocol: TCP
port: 443
targetPort: 8443
selector:
app: ingress-${rls_namespace}
istio: ingress-${rls_namespace}
Route
kind: Route
apiVersion: route.openshift.io/v1
metadata:
name: ingress-route
namespace: ${rls_namespace}
labels:
app: ingress-${rls_namespace}
istio: ingress-${rls_namespace}
proj: synapse-rls
agent: srls
spec:
host: ${rls_hostname}
to:
kind: Service
name: ingressgateway-svc
weight: 100
port:
targetPort: grpc-443
tls:
termination: passthrough
wildcardPolicy: None
VirtualService
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: rls-virtual-service
namespace: ${rls_namespace}
labels:
app: ingress-${rls_namespace}
istio: ingress-${rls_namespace}
proj: synapse-rls
agent: srls
spec:
exportTo:
- .
gateways:
- ${rls_namespace}/ingress-rate-limiter
hosts:
- '*'
http:
- match:
- gateways:
- ${rls_namespace}/ingress-rate-limiter
port: 8443
route:
- destination:
host: rate-limiter-headless-service.${rls_namespace}.svc.cluster.local
port:
number: 8081
EnvoyFilter
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: ingress-filter
namespace: ${rls_namespace}
labels:
app: ingress-${rls_namespace}
istio: ingress-${rls_namespace}
proj: synapse-rls
agent: srls
spec:
configPatches:
- applyTo: HTTP_FILTER
match:
context: GATEWAY
listener:
filterChain:
filter:
name: envoy.http_connection_manager
portNumber: 8443
patch:
operation: INSERT_BEFORE
value:
config:
rules:
action: ALLOW
policies:
batman_policy:
permissions:
and_rules:
rules:
- destination_port: 8443
principals:
or_ids:
ids: ${whiteList_headers_regular}
name: envoy.filters.http.rbac
workloadSelector:
labels:
app: ingress-${rls_namespace}
istio: ingress-${rls_namespace}
EnvoyFilter – требуется добавлять при интеграции с SecMan для настройки бесшовного применения обновляемых сертификатов (чтобы не требовалось перезапускать Ingress Gateway после обновления секретов)
Примечание – данный подход работает с Istio 1.6, 1.9 или RedHat Service Mesh 2.0, 2.1 (опционально)
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: ingress-secman-listener-tls-filter
namespace: ${rls_namespace}
labels:
app: ingress-${rls_namespace}
istio: ingress-${rls_namespace}
proj: synapse-rls
agent: srls
spec:
configPatches:
- applyTo: FILTER_CHAIN
match:
context: GATEWAY
listener:
filterChain:
filter:
name: envoy.transport_sockets.tls
portNumber: 8443
patch:
operation: MERGE
value:
metadata:
filterMetadata:
istio:
config: >-
/apis/networking.istio.io/v1alpha3/namespaces/${rls_namespace}/envoyfilter/ingress-secman-listener-tls-filter
transportSocket:
name: envoy.transport_sockets.tls
typedConfig:
'@type': >-
type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
commonTlsContext:
alpnProtocols:
- h2
- http/1.1
combinedValidationContext:
defaultValidationContext: {}
validationContextSdsSecretConfig:
name: 'file-root:/etc/rls/ingress/ca-root.pem'
sdsConfig:
apiConfigSource:
apiType: GRPC
grpcServices:
- envoyGrpc:
clusterName: sds-grpc
setNodeOnFirstMessageOnly: true
tlsCertificateSdsSecretConfigs:
- name: >-
file-cert:/etc/rls/ingress/ingress.pem~/etc/rls/ingress/ingress.key
sdsConfig:
apiConfigSource:
apiType: GRPC
grpcServices:
- envoyGrpc:
clusterName: sds-grpc
setNodeOnFirstMessageOnly: true
requireClientCertificate: false
workloadSelector:
labels:
app: ingress-${rls_namespace}
istio: ingress-${rls_namespace}
PodDisruptionBudget
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: ingress-pdb
namespace: ${rls_namespace}
labels:
app: ingress-${rls_namespace}
istio: ingress-${rls_namespace}
proj: synapse-rls
agent: srls
spec:
minAvailable: ${ingress_ose_poddisruptionbudget_spec_minAvailable}
selector:
matchLabels:
app: ingress-${rls_namespace}
Установка Redis#
В качестве базового образа используется registry.redhat.io/rhel8/redis-6:1-8. Развертывание кластера Redis в режиме Sentinel:
Headless Service для Redis
kind: Service
apiVersion: v1
metadata:
name: redis
namespace: ${rls_namespace}
labels:
app: redis
proj: synapse-rls
agent: srls
spec:
type: ClusterIP
ports:
- name: redis
port: 6379
targetPort: redis
clusterIP: None
publishNotReadyAddresses: true
sessionAffinity: None
selector:
app: redis
Headless Service для Redis Sentinel
kind: Service
apiVersion: v1
metadata:
name: redis-sentinel
namespace: ${rls_namespace}
labels:
app: redis-sentinel
proj: synapse-rls
agent: srls
spec:
type: ClusterIP
ports:
- name: redis-sentinel
port: 26379
targetPort: redis-sentinel
clusterIP: None
publishNotReadyAddresses: true
sessionAffinity: None
selector:
app: redis-sentinel
ConfigMap для Redis
apiVersion: v1
kind: ConfigMap
metadata:
name: redis
namespace: ${rls_namespace}
labels:
app: redis
proj: synapse-rls
agent: srls
version: ${jenkins_env.fp_artifact_version}
data:
TZ: 'Europe/Moscow'
REPLICAS: '${srls_redis_deployment_replicas}'
master.conf: |
bind 0.0.0.0
protected-mode no
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
dbfilename dump.rdb
dir /data
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ''
ConfigMap для Redis Sentinel
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-sentinel
namespace: ${rls_namespace}
labels:
app: redis-sentinel
proj: synapse-rls
agent: srls
version: ${jenkins_env.fp_artifact_version}
data:
TZ: 'Europe/Moscow'
REPLICAS: '${srls_sentinel_deployment_replicas}'
sentinel.conf: |
sentinel monitor mymaster REPLACE 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1
StatefulSet для Redis
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis
namespace: ${rls_namespace}
labels:
app: redis
proj: synapse-rls
agent: srls
version: ${jenkins_env.fp_artifact_version}
spec:
serviceName: "redis"
replicas: ${srls_redis_deployment_replicas}
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
proj: synapse-rls
agent: srls
annotations:
sidecar.istio.io/inject: 'false'
spec:
initContainers:
- resources:
limits:
cpu: ${srls_redis_scripts_deployment_cpuLimit}
memory: ${srls_redis_scripts_deployment_memLimit}
requests:
cpu: ${srls_redis_scripts_deployment_cpuRequest}
memory: ${srls_redis_scripts_deployment_memRequest}
terminationMessagePath: /dev/termination-log
name: scripts-sidecar
env:
- name: pod
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
securityContext:
capabilities:
drop:
- ALL
privileged: false
runAsNonRoot: true
readOnlyRootFilesystem: true
imagePullPolicy: Always
volumeMounts:
- name: scriptshare
mountPath: /share
terminationMessagePolicy: File
image: {{ registry | default(srls_registry) }}{{ registry_path | default(srls_registry_path) }}/srls/redis@${jenkins_env.fp_image_hash}
priorityClassName: ${srls_redis_deployment_priorityClassName}
containers:
- name: redis
image: ${redis_image}
command:
- /scripts/redis/start.sh
env:
- name: ALLOW_EMPTY_PASSWORD
value: "yes"
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
- name: TZ
valueFrom:
configMapKeyRef:
name: redis
key: TZ
- name: REPLICAS
valueFrom:
configMapKeyRef:
name: redis
key: REPLICAS
resources:
limits:
cpu: ${srls_redis_deployment_cpuLimit}
memory: ${srls_redis_deployment_memLimit}
requests:
cpu: ${srls_redis_deployment_cpuRequest}
memory: ${srls_redis_deployment_memRequest}
ports:
- name: redis
containerPort: 6379
securityContext:
readOnlyRootFilesystem: true
runAsNonRoot: true
privileged: false
capabilities:
drop:
- ALL
imagePullPolicy: Always
readinessProbe:
exec:
command:
- /scripts/redis/readinessProbe.sh
initialDelaySeconds: 10
timeoutSeconds: 1
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
livenessProbe:
exec:
command:
- /scripts/redis/livenessProbe.sh
initialDelaySeconds: 10
timeoutSeconds: 1
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
volumeMounts:
- name: redis-data
mountPath: /data
- name: config-map
mountPath: /mnt/config-map
- name: redis-conf
mountPath: /conf
- name: scriptshare
mountPath: /scripts
terminationGracePeriodSeconds: 10
dnsPolicy: ClusterFirstWithHostNet
imagePullSecrets:
- name: ${rls_image_pull_secret}
volumes:
- name: config-map
configMap:
name: redis
defaultMode: 256
- name: redis-data
emptyDir: {}
- name: redis-log
emptyDir: {}
- name: redis-conf
emptyDir: {}
- name: scriptshare
emptyDir: {}
StatefulSet для Redis Sentinel
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis-sentinel
namespace: ${rls_namespace}
labels:
app: redis-sentinel
proj: synapse-rls
agent: srls
version: ${jenkins_env.fp_artifact_version}
spec:
serviceName: "redis-sentinel"
replicas: ${srls_sentinel_deployment_replicas}
selector:
matchLabels:
app: redis-sentinel
template:
metadata:
labels:
app: redis-sentinel
proj: synapse-rls
agent: srls
annotations:
sidecar.istio.io/inject: 'false'
spec:
initContainers:
- resources:
limits:
cpu: ${srls_sentinel_scripts_deployment_cpuLimit}
memory: ${srls_sentinel_scripts_deployment_memLimit}
requests:
cpu: ${srls_sentinel_scripts_deployment_cpuRequest}
memory: ${srls_sentinel_scripts_deployment_memRequest}
terminationMessagePath: /dev/termination-log
name: scripts-sidecar
env:
- name: pod
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
securityContext:
capabilities:
drop:
- ALL
privileged: false
runAsNonRoot: true
readOnlyRootFilesystem: true
imagePullPolicy: Always
volumeMounts:
- name: scriptshare
mountPath: /share
terminationMessagePolicy: File
image: {{ registry | default(srls_registry) }}{{ registry_path | default(srls_registry_path) }}/srls/sentinel@${jenkins_env.fp_image_hash}
priorityClassName: ${srls_sentinel_deployment_priorityClassName}
containers:
- name: redis-sentinel
image: ${redis_image}
command:
- /scripts/sentinel/start.sh
env:
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
- name: TZ
valueFrom:
configMapKeyRef:
name: redis-sentinel
key: TZ
- name: REPLICAS
valueFrom:
configMapKeyRef:
name: redis
key: REPLICAS
resources:
limits:
cpu: ${srls_sentinel_deployment_cpuLimit}
memory: ${srls_sentinel_deployment_memLimit}
requests:
cpu: ${srls_sentinel_deployment_cpuRequest}
memory: ${srls_sentinel_deployment_memRequest}
ports:
- name: redis-sentinel
containerPort: 26379
securityContext:
readOnlyRootFilesystem: true
runAsNonRoot: true
privileged: false
capabilities:
drop:
- ALL
imagePullPolicy: Always
readinessProbe:
exec:
command:
- /scripts/sentinel/readinessProbe.sh
initialDelaySeconds: 10
timeoutSeconds: 1
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
livenessProbe:
exec:
command:
- /scripts/sentinel/livenessProbe.sh
initialDelaySeconds: 10
timeoutSeconds: 1
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
volumeMounts:
- name: config-map
mountPath: /mnt/config-map
- name: redis-conf
mountPath: /conf
- name: scriptshare
mountPath: /scripts
terminationGracePeriodSeconds: 10
dnsPolicy: ClusterFirstWithHostNet
imagePullSecrets:
- name: ${rls_image_pull_secret}
volumes:
- name: config-map
configMap:
name: redis-sentinel
defaultMode: 256
- name: redis-data
emptyDir: {}
- name: redis-log
emptyDir: {}
- name: redis-conf
emptyDir: {}
- name: scriptshare
emptyDir: {}
PodDisruptionBudget для Redis
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: redis-pdb
namespace: ${rls_namespace}
labels:
app: redis
proj: synapse-rls
agent: srls
spec:
minAvailable: ${redis_ose_poddisruptionbudget_spec_minAvailable}
selector:
matchLabels:
app: redis
PodDisruptionBudget для Redis Sentinel
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: redis-sentinel-pdb
namespace: ${rls_namespace}
labels:
app: redis-sentinel
proj: synapse-rls
agent: srls
spec:
minAvailable: ${sentinel_ose_poddisruptionbudget_spec_minAvailable}
selector:
matchLabels:
app: redis-sentinel
Установка Egress Gateway#
Для установки Egress Gateway в необходимый namespace добавить следующие артефакты:
Deployment
kind: Deployment
apiVersion: apps/v1
metadata:
name: egress-${rls_namespace}
namespace: ${rls_namespace}
labels:
app: egress-${rls_namespace}
istio: egress-${rls_namespace}
proj: synapse-rls
agent: srls
version: ${jenkins_env.fp_artifact_version}
platformv.sber.ru/componentCode: SRLS
platformv.sber.ru/productCode: SEI
spec:
replicas: ${srls_egress_deployment_replicas}
selector:
matchLabels:
app: egress-${rls_namespace}
istio: egress-${rls_namespace}
template:
metadata:
labels:
app: egress-${rls_namespace}
istio: egress-${rls_namespace}
proj: synapse-rls
chart: gateways
heritage: Tiller
release: istio
platformv.sber.ru/binVersion: ${jenkins_env.fp_artifact_version}
platformv.sber.ru/cfgVersion: ${jenkins_env.fp_artifact_version}
agent: srls
annotations:
prometheus.io/path: /stats/prometheus
prometheus.io/port: '15020'
prometheus.io/scrape: 'true'
sidecar.istio.io/inject: 'false'
spec:
restartPolicy: Always
imagePullSecrets:
- name: ${rls_image_pull_secret}
schedulerName: default-scheduler
terminationGracePeriodSeconds: 30
priorityClassName: ${srls_egress_deployment_priorityClassName}
containers:
- resources:
limits:
cpu: ${srls_egress_deployment_cpuLimit}
memory: ${srls_egress_deployment_memLimit}
requests:
cpu: ${srls_egress_deployment_cpuRequest}
memory: ${srls_egress_deployment_memRequest}
readinessProbe:
httpGet:
path: /healthz/ready
port: 15021
scheme: HTTP
initialDelaySeconds: 1
timeoutSeconds: 1
periodSeconds: 2
successThreshold: 1
failureThreshold: 30
terminationMessagePath: /dev/termination-log
name: istio-proxy
env:
- name: PROXY_CONFIG
value: |
{"discoveryAddress":"${istiod_svc}"}
- name: JWT_POLICY
value: ${egress_jwt_policy}
- name: PILOT_CERT_PROVIDER
value: istiod
- name: CA_ADDR
value: '${istiod_svc}'
- name: NODE_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: spec.nodeName
- name: POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
- name: INSTANCE_IP
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: status.podIP
- name: HOST_IP
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: status.hostIP
- name: SERVICE_ACCOUNT
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: spec.serviceAccountName
- name: ISTIO_META_WORKLOAD_NAME
value: egress-${rls_namespace}
- name: ISTIO_META_OWNER
value: >-
kubernetes://apis/apps/v1/namespaces/${rls_namespace}/deployments/egress-${rls_namespace}
- name: ISTIO_META_MESH_ID
value: cluster.local
- name: TRUST_DOMAIN
value: cluster.local
- name: ISTIO_META_UNPRIVILEGED_POD
value: 'true'
- name: ISTIO_META_CLUSTER_ID
value: Kubernetes
securityContext:
capabilities:
drop:
- ALL
privileged: false
readOnlyRootFilesystem: true
allowPrivilegeEscalation: false
ports:
- containerPort: ${egress_secman_port}
protocol: TCP
name: tls-${egress_secman_port}
imagePullPolicy: Always
volumeMounts:
- name: istio-envoy
mountPath: /etc/istio/proxy
- name: istiod-ca-cert
mountPath: /var/run/secrets/istio
- name: istio-token
readOnly: true
mountPath: /var/run/secrets/tokens
- name: istio-data
mountPath: /var/lib/istio/data
- name: podinfo
mountPath: /etc/istio/pod
terminationMessagePolicy: File
image: ${egress_image}
args:
- proxy
- router
- '--domain'
- $(POD_NAMESPACE).svc.cluster.local
- '--proxyLogLevel=warning'
- '--proxyComponentLogLevel=misc:error'
- '--log_output_level=default:info'
volumes:
- name: istiod-ca-cert
configMap:
name: istio-ca-root-cert
defaultMode: 0400
- name: podinfo
downwardAPI:
items:
- path: labels
fieldRef:
apiVersion: v1
fieldPath: metadata.labels
- path: annotations
fieldRef:
apiVersion: v1
fieldPath: metadata.annotations
defaultMode: 0400
- name: istio-envoy
emptyDir: {}
- name: istio-data
emptyDir: {}
- name: istio-token
projected:
sources:
- serviceAccountToken:
audience: istio-ca
expirationSeconds: 43200
path: istio-token
defaultMode: 0400
dnsPolicy: ClusterFirst
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: ${srls_egress_deployment_maxUnavailable}
maxSurge: ${srls_egress_deployment_maxSurge}
revisionHistoryLimit: 10
progressDeadlineSeconds: 1200
Gateway
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: egress-kubeapi-gw
spec:
selector:
app: egress-${rls_namespace}
istio: egress-${rls_namespace}
servers:
- hosts:
- ${kubernetes_service_host}
port:
name: tls-${egress_kubeapi_port}
number: ${egress_kubeapi_port}
protocol: TLS
tls:
cipherSuites:
- ECDHE-RSA-AES256-GCM-SHA384
- ECDHE-ECDSA-AES256-GCM-SHA384
minProtocolVersion: TLSV1_2
mode: PASSTHROUGH
ServiceEntry
apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
name: egress-kubeapi-se
spec:
addresses:
- ${kube_ip}
endpoints:
- address: ${kube_ip}
exportTo:
- .
hosts:
- ${kubernetes_service_host}
location: MESH_INTERNAL
ports:
- name: tls-${kubernetes_service_port}
number: ${kubernetes_service_port}
protocol: TLS
resolution: STATIC
VirtualService
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: egress-kubeapi-vs
spec:
exportTo:
- .
gateways:
- mesh
- egress-kubeapi-gw
hosts:
- ${kubernetes_service_host}
tls:
- match:
- port: ${kubernetes_service_port}
sniHosts:
- ${kubernetes_service_host}
route:
- destination:
host: egressgateway-rls-svc
port:
number: ${egress_kubeapi_port}
- match:
- gateways:
- egress-kubeapi-gw
port: ${egress_kubeapi_port}
sniHosts:
- ${kubernetes_service_host}
route:
- destination:
host: ${kubernetes_service_host}
port:
number: ${kubernetes_service_port}
Service
kind: Service
apiVersion: v1
metadata:
name: egressgateway-rls-svc
namespace: ${rls_namespace}
labels:
app: egress-${rls_namespace}
istio: egress-${rls_namespace}
proj: synapse-rls
agent: srls
version: ${jenkins_env.fp_artifact_version}
spec:
ports:
- name: tls-${egress_secman_port}
protocol: TCP
port: ${egress_secman_port}
targetPort: ${egress_secman_port}
- name: tls-${egress_kubeapi_port}
protocol: TCP
port: ${egress_kubeapi_port}
targetPort: ${egress_kubeapi_port}
selector:
app: egress-${rls_namespace}
istio: egress-${rls_namespace}
PodDisruptionBudget
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: egress-pdb
namespace: ${rls_namespace}
labels:
app: egress-${rls_namespace}
istio: egress-${rls_namespace}
proj: synapse-rls
agent: srls
version: ${jenkins_env.fp_artifact_version}
spec:
minAvailable: ${egress_ose_poddisruptionbudget_spec_minAvailable}
selector:
matchLabels:
app: egress-${rls_namespace}
Артефакты, представленные ниже, необходимо добавлять в случае установки RL Service c TLS (обеспечивает подключение агента SecMan в Pod RL Service к серверу SecMan через Egress Gateway).
DestinationRule
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: egress-secman-dr
spec:
exportTo:
- .
host: egressgateway-rls-svc
trafficPolicy:
portLevelSettings:
- port:
number: ${egress_secman_port}
tls:
mode: DISABLE
Gateway
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: egress-secman-gw
spec:
selector:
app: egress-${rls_namespace}
istio: egress-${rls_namespace}
servers:
- hosts:
- ${secman_host}
port:
name: tls-${egress_secman_port}
number: ${egress_secman_port}
protocol: TLS
tls:
mode: PASSTHROUGH
PeerAuthentication
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: egress-pa
spec:
portLevelMtls:
'${egress_secman_port}':
mode: DISABLE
selector:
matchLabels:
app: egress-${rls_namespace}
istio: egress-${rls_namespace}
ServiceEntry
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: egress-secman-se
spec:
exportTo:
- .
hosts:
- ${secman_host}
location: MESH_EXTERNAL
ports:
- name: tls-${secman_port}
number: ${secman_port}
protocol: TLS
resolution: DNS
VirtualService
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: egress-secman-vs
spec:
exportTo:
- .
gateways:
- egress-secman-gw
- mesh
hosts:
- ${secman_host}
tls:
- match:
- gateways:
- mesh
port: ${secman_port}
sniHosts:
- ${secman_host}
route:
- destination:
host: egressgateway-rls-svc
port:
number: ${egress_secman_port}
- match:
- gateways:
- egress-secman-gw
port: ${egress_secman_port}
sniHosts:
- ${secman_host}
route:
- destination:
host: ${secman_host}
port:
number: ${secman_port}
Установка децентрализованного Synapse Rate Limiter#
Установка RL Operator#
Для установки RL Operator в необходимый namespace добавить следующие артефакты:
Deployment (здесь приведен без fluent-bit sidecar)
kind: Deployment
apiVersion: apps/v1
metadata:
name: rloperator
namespace: ${rls_namespace}
labels:
app: rloperator
proj: synapse-rls
agent: srls
spec:
replicas: 2
selector:
matchLabels:
app: rloperator
proj: synapse-rls
template:
metadata:
labels:
app: rloperator
proj: synapse-rls
agent: srls
annotations:
sidecar.istio.io/inject: 'false'
spec:
restartPolicy: Always
serviceAccountName: rate-limiter-service
imagePullSecrets:
- name: rls-image-pull-secret
schedulerName: default-scheduler
terminationGracePeriodSeconds: 30
volumes:
- name: logsshare
emptyDir: {}
- name: fluent-bit-tmp
emptyDir: {}
- name: fluent-bit-sidecar
configMap:
name: operator-fluent-bit-sidecar
defaultMode: 256
optional: true
- name: fluent-bit-kafka-cert
secret:
defaultMode: 256
secretName: fluent-bit-kafka-cert
optional: true
priorityClassName: ${srls_rloperator_deployment_priorityClassName}
containers:
- resources:
limits:
cpu: 200m
memory: 200Mi
requests:
cpu: 100m
memory: 100Mi
readinessProbe:
httpGet:
path: /readyz
port: 8080
scheme: HTTP
initialDelaySeconds: 5
timeoutSeconds: 1
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
terminationMessagePath: /dev/termination-log
name: rloperator
livenessProbe:
httpGet:
path: /healthz
port: 8080
scheme: HTTP
initialDelaySeconds: 5
timeoutSeconds: 1
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
securityContext:
readOnlyRootFilesystem: true
runAsNonRoot: true
privileged: false
capabilities:
drop:
- ALL
ports:
- containerPort: 8080
protocol: TCP
- containerPort: 8081
protocol: TCP
imagePullPolicy: Always
terminationMessagePolicy: File
env:
- name: POD_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
- name: NODE_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: spec.nodeName
- name: POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
envFrom:
- configMapRef:
name: operator-config
image: {{ registry | default(srls_registry) }}{{ registry_path | default(srls_registry_path) }}/ci90000055_srls/operator@${jenkins_env.fp_image_hash}
args:
- env
volumeMounts:
- mountPath: '/var/operator/logs'
name: logsshare
serviceAccount: rate-limiter-service
dnsPolicy: ClusterFirst
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: ${srls_rloperator_deployment_maxUnavailable}
maxSurge: ${srls_rloperator_deployment_maxSurge}
revisionHistoryLimit: 1
progressDeadlineSeconds: 600
ConfigMap
kind: ConfigMap
apiVersion: v1
metadata:
name: operator-config
namespace: ${rls_namespace}
labels:
app: rloperator
proj: synapse-rls
agent: srls
data:
TZ: Europe/Moscow
IS_IN_CLUSTER: 'true'
OPERATOR_NAMESPACE: '${rls_namespace}'
OPERATION_SCOPE: '${operator_scope}'
ENVOY_FILTER_GRPC_TIMEOUT: '${envoy_filter_grpc_timeout}'
OPERATOR_METRICS_PORT: '8081'
CONFIG_MANAGER_GRPC_HOST: '${operator_serviceUrl}'
CONFIG_MANAGER_GRPC_PORT: '${operator_servicePort}'
LOG_LEVEL: '${operator_logLevel}'
DISABLE_ENVOY_FILTER_AUTOMATION: '${disable_envoy_filter_automation}'
ELECTION_ENABLED: '${operator_election_enabled}'
Примечание — все возможные настройки для установки в ConfigMap перечислены в таблице ниже.
Настройки RL Operator
Название |
Описание |
Значение по умолчанию |
|---|---|---|
IS_IN_CLUSTER |
Режим запуска: Внутри кластера K8s/Вне кластера |
false |
OPERATOR_NAMESPACE |
Имя пространства, в котором разворачивается оператор |
rlservice-ns |
OPERATION_SCOPE |
Область работы оператора: cluster, namespace |
cluster |
OPERATOR_METRICS_PORT |
Порт для публикации метрик |
8081 |
OPERATOR_HEALTHZ_PORT |
Порт для healthcheck |
8080 |
LOG_LEVEL |
Переключение уровня логирования: info, debug, trace |
info |
LOG_CHANGE_LEVEL_PORT |
Порт для изменения уровня логирования в runtime |
9080 |
CONFIG_MANAGER_GRPC_HOST |
Host для подключения к RLS для загрузки конфигурации Limit |
rate-limiter-service |
CONFIG_MANAGER_GRPC_PORT |
Порт для подключения к RLS для загрузки конфигурации Limit |
8082 |
ENVOY_FILTER_GRPC_TIMEOUT |
gRPC тайм-аут подключения к RateLimiterService |
1s |
ELECTION_ENABLED |
Включение/отключение механизма leader election |
true |
ELECTION_RESOURCE_ID |
Название артефакта Lease для механизма leader election |
srls-operator-lock |
ELECTION_LEASE_DURATION |
Продолжительность взятия lock |
30 |
ELECTION_RENEW_DEADLINE |
Максимальное время, в течение которого необходимо обновить lock |
15 |
ELECTION_RETRY_PERIOD |
Задержка между попытками взять lock |
5 |
ELECTION_CHECK_TIMEOUT |
Тайм-аут на проверку взятия lock |
20 |
Примеры значений ENVOY_FILTER_GRPC_TIMEOUT:
Заданное |
Установленное |
Примечание |
|---|---|---|
10s |
10s |
Значение используется без преобразования |
0.1s |
0.1s |
-//- |
200 |
0.2s |
Значение, указанное без символа «s», считается заданным в миллисекундах |
30 |
0.03s |
-//- |
30ds |
1s |
Значение, не попадающее под шаблон число + символ «s», заменяется значением по умолчанию |
Service
kind: Service
apiVersion: v1
metadata:
name: rloperator
namespace: ${rls_namespace}
labels:
app: rloperator
proj: synapse-rls
agent: srls
annotations:
prometheus.io.path: /metrics
prometheus.io.port: '8081'
prometheus.io.scrape: 'true'
spec:
selector:
app: rloperator
proj: synapse-rls
ports:
- name: http
protocol: TCP
port: 8080
targetPort: 8080
- name: metric-port
protocol: TCP
port: 8081
targetPort: 8081
PodDisruptionBudget
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: rloperator-pdb
namespace: ${rls_namespace}
labels:
app: rloperator
proj: synapse-rls
agent: srls
spec:
minAvailable: ${rloperator_ose_poddisruptionbudget_spec_minAvailable}
selector:
matchLabels:
app: rloperator
Установка RL Service#
Для установки RL Service в необходимый namespace добавить следующие артефакты:
Deployment (здесь приведен без fluent-bit sidecar)
kind: Deployment
apiVersion: apps/v1
metadata:
name: rate-limiter-service
namespace: ${rls_namespace}
labels:
app: rls
proj: synapse-rls
agent: srls
spec:
replicas: 2
selector:
matchLabels:
app: rls
proj: synapse-rls
template:
metadata:
labels:
app: rls
proj: synapse-rls
agent: srls
annotations:
sidecar.istio.io/inject: 'false'
spec:
volumes:
- name: logsshare
emptyDir: {}
- name: fluent-bit-tmp
emptyDir: {}
- name: fluent-bit-sidecar
configMap:
name: rlservice-fluent-bit-sidecar
defaultMode: 256
optional: true
- name: fluent-bit-kafka-cert
secret:
defaultMode: 256
secretName: fluent-bit-kafka-cert
optional: true
priorityClassName: ${srls_ratelimiter_deployment_priorityClassName}
containers:
- resources:
limits:
cpu: 500m
memory: 300Mi
requests:
cpu: 250m
memory: 150Mi
terminationMessagePath: /dev/termination-log
name: rate-limiter-service
securityContext:
readOnlyRootFilesystem: true
runAsNonRoot: true
privileged: false
capabilities:
drop:
- ALL
readinessProbe:
httpGet:
path: /ready
port: 8080
scheme: HTTP
initialDelaySeconds: 5
timeoutSeconds: 1
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
livenessProbe:
httpGet:
path: /healthcheck
port: 8080
scheme: HTTP
initialDelaySeconds: 5
timeoutSeconds: 1
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
ports:
- name: prom-2112
protocol: TCP
containerPort: 2112
- name: http-debug-port
containerPort: 15021
protocol: TCP
- name: http
containerPort: 8080
protocol: TCP
- name: grpc
containerPort: 8081
protocol: TCP
imagePullPolicy: Always
terminationMessagePolicy: File
volumeMounts:
- name: logsshare
mountPath: /var/ratelimiter/logs
envFrom:
- configMapRef:
name: rls-config
image: {{ registry | default(srls_registry) }}{{ registry_path | default(srls_registry_path) }}/ci90000055_srls/rls@${jenkins_env.fp_image_hash}
restartPolicy: Always
terminationGracePeriodSeconds: 30
dnsPolicy: ClusterFirst
imagePullSecrets:
- name: rls-image-pull-secret
schedulerName: default-scheduler
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: ${srls_ratelimiter_deployment_maxUnavailable}
maxSurge: ${srls_ratelimiter_deployment_maxSurge}
revisionHistoryLimit: 1
progressDeadlineSeconds: 600
ConfigMap
kind: ConfigMap
apiVersion: v1
metadata:
name: rls-config
namespace: ${rls_namespace}
labels:
app: rls
proj: synapse-rls
agent: srls
data:
REDIS_SOCKET_TYPE: tcp
REDIS_URL: '${rls_redisUrl}'
REDIS_TYPE: '${rls_redisType}'
CONFIG_MANAGER_REDIS_URL: '${rls_redisUrl}'
CONFIG_MANAGER_REDIS_TYPE: '${rls_redisType}'
REDIS_HEALTH_CHECK_ACTIVE_CONNECTION: 'true'
LOG_LEVEL: '${rls_logLevel}'
LOCAL_CACHE_SIZE_IN_BYTES: '${rls_localCacheSizeInBytes}'
TZ: Europe/Moscow
BACKEND_TYPE: '${rls_backend}'
GRPC_TLS_ENABLE: '${rls_tls_enable}'
GRPC_TLS_CLIENT_AUTH: '${rls_tls_client_auth}'
GRPC_CERTIFICATE_PATH: '${rls_tls_cert_path}'
GRPC_CERTIFICATE_PEM: '${rls_tls_cert_pem}'
GRPC_CERTIFICATE_KEY: '${rls_tls_cert_key}'
GRPC_CERTIFICATE_CA_PEM: '${rls_tls_cert_ca_pem}'
Примечание — здесь указаны минимально необходимые настройки. Все возможные параметры RateLimiterService можно посмотреть в таблице ниже.
Настройки RateLimiterService
Название |
Значение по умолчанию |
|---|---|
Конфигурация адреса и портов сервера |
|
HOST |
0.0.0.0 |
PORT |
8080 |
GRPC_HOST |
0.0.0.0 |
GRPC_PORT |
8081 |
DEBUG_HOST |
0.0.0.0 |
DEBUG_PORT |
6070 |
CONFIG_MANAGER_GRPC_HOST |
0.0.0.0 |
CONFIG_MANAGER_GRPC_PORT |
8082 |
CONFIG_CLIENT_GRPC_HOST |
0.0.0.0 |
CONFIG_CLIENT_GRPC_PORT |
8091 |
Настройки логирования |
|
LOG_LEVEL |
WARN |
LOG_FORMAT |
text |
Настройки конфигурирования RateLimiter |
|
REDIS_HEALTH_CHECK_ACTIVE_CONNECTION |
false |
TYPE_MOD |
client |
Настройки для всех типов кеша |
|
EXPIRATION_JITTER_MAX_SECONDS |
300 |
LOCAL_CACHE_SIZE_IN_BYTES |
0 |
NEAR_LIMIT_RATIO |
0.8 |
CACHE_KEY_PREFIX |
- |
BACKEND_TYPE |
redis |
Настройки Redis |
|
REDIS_SOCKET_TYPE |
unix |
REDIS_TYPE |
SINGLE |
REDIS_URL |
/var/run/nutcracker/ratelimit.sock |
REDIS_POOL_SIZE |
10 |
REDIS_AUTH |
- |
REDIS_TLS |
false |
REDIS_PIPELINE_WINDOW |
0 |
REDIS_PIPELINE_LIMIT |
0 |
REDIS_PERSECOND |
false |
REDIS_PERSECOND_SOCKET_TYPE |
unix |
REDIS_PERSECOND_TYPE |
SINGLE |
REDIS_PERSECOND_URL |
/var/run/nutcracker/ratelimitpersecond.sock |
REDIS_PERSECOND_POOL_SIZE |
10 |
REDIS_PERSECOND_AUTH |
- |
REDIS_PERSECOND_TLS |
false |
REDIS_PERSECOND_PIPELINE_WINDOW |
0 |
REDIS_PERSECOND_PIPELINE_LIMIT |
0 |
Настройки ConfigManager Redis |
|
CONFIG_MANAGER_REDIS_TYPE |
SINGLE |
CONFIG_MANAGER_REDIS_URL |
/var/run/nutcracker/ratelimit.sock |
CONFIG_MANAGER_REDIS_POOL_SIZE |
1 |
CONFIG_MANAGER_REDIS_AUTH |
- |
CONFIG_MANAGER_REDIS_TLS |
false |
Настройки Prometheus |
|
PROMETHEUS_ENDPOINT |
/prometheus/metrics |
PROMETHEUS_ADDRESS |
:2112 |
PROMETHEUS_CACHE_STATS_FLUSH_INTERVAL_SEC |
5 |
Настройки TLS |
|
GRPC_TLS_ENABLE |
false |
GRPC_TLS_CLIENT_AUTH |
none |
GRPC_CERTIFICATE_PATH |
/cert |
GRPC_CERTIFICATE_PEM |
server.pem |
GRPC_CERTIFICATE_KEY |
server.key |
GRPC_CERTIFICATE_CA_PEM |
ca-root.pem |
Service
kind: Service
apiVersion: v1
metadata:
name: rate-limiter-service
namespace: ${rls_namespace}
labels:
app: rls
proj: synapse-rls
agent: srls
annotations:
prometheus.io.path: /prometheus/metrics
prometheus.io.port: '2112'
prometheus.io.scrape: 'true'
spec:
selector:
app: rls
proj: synapse-rls
ports:
- name: metric-port
protocol: TCP
port: 2112
targetPort: 2112
- name: http-8080
protocol: TCP
port: 8080
targetPort: 8080
- name: debug-port
protocol: TCP
port: 6070
targetPort: 6070
- name: grpc-8081
protocol: TCP
port: 8081
targetPort: 8081
- name: grpc-8082
protocol: TCP
port: 8082
targetPort: 8082
Headless Service
kind: Service
apiVersion: v1
metadata:
name: rate-limiter-headless-service
namespace: ${rls_namespace}
labels:
app: rls
proj: synapse-rls
agent: srls
spec:
clusterIP: None
selector:
app: rls
proj: synapse-rls
ports:
- name: grpc-8081
protocol: TCP
port: 8081
targetPort: 8081
PodDisruptionBudget
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: rls-pdb
namespace: ${rls_namespace}
labels:
app: rls
proj: synapse-rls
agent: srls
spec:
minAvailable: ${ratelimiter_ose_poddisruptionbudget_spec_minAvailable}
selector:
matchLabels:
app: rls
Установка Redis#
Развертывание кластера Redis в режиме Sentinel:
Headless Service для Redis
kind: Service
apiVersion: v1
metadata:
name: redis
namespace: ${rls_namespace}
labels:
app: redis
proj: synapse-rls
agent: srls
spec:
type: ClusterIP
ports:
- name: redis
port: 6379
targetPort: redis
clusterIP: None
publishNotReadyAddresses: true
sessionAffinity: None
selector:
app: redis
Headless Service для Redis Sentinel
kind: Service
apiVersion: v1
metadata:
name: redis-sentinel
namespace: ${rls_namespace}
labels:
app: redis-sentinel
proj: synapse-rls
agent: srls
spec:
type: ClusterIP
ports:
- name: redis-sentinel
port: 26379
targetPort: redis-sentinel
clusterIP: None
publishNotReadyAddresses: true
sessionAffinity: None
selector:
app: redis-sentinel
ConfigMap для Redis
apiVersion: v1
kind: ConfigMap
metadata:
name: redis
namespace: ${rls_namespace}
labels:
app: redis
proj: synapse-rls
agent: srls
version: ${jenkins_env.fp_artifact_version}
data:
TZ: 'Europe/Moscow'
REPLICAS: '${srls_redis_deployment_replicas}'
master.conf: |
bind 0.0.0.0
protected-mode no
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
dbfilename dump.rdb
dir /data
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ''
ConfigMap для Redis Sentinel
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-sentinel
namespace: ${rls_namespace}
labels:
app: redis-sentinel
proj: synapse-rls
agent: srls
data:
TZ: 'Europe/Moscow'
sentinel.conf: |
sentinel monitor mymaster REPLACE 6379 2
sentinel down-after-milliseconds mymaster 60000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
StatefulSet для Redis
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis
namespace: ${rls_namespace}
labels:
app: redis
proj: synapse-rls
agent: srls
version: ${jenkins_env.fp_artifact_version}
spec:
serviceName: "redis"
replicas: ${srls_redis_deployment_replicas}
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
proj: synapse-rls
agent: srls
annotations:
sidecar.istio.io/inject: 'false'
spec:
initContainers:
- resources:
limits:
cpu: ${srls_redis_scripts_deployment_cpuLimit}
memory: ${srls_redis_scripts_deployment_memLimit}
requests:
cpu: ${srls_redis_scripts_deployment_cpuRequest}
memory: ${srls_redis_scripts_deployment_memRequest}
terminationMessagePath: /dev/termination-log
name: scripts-sidecar
env:
- name: pod
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
securityContext:
securityContext:
runAsNonRoot: true
readOnlyRootFilesystem: true
privileged: false
securityContext:
runAsNonRoot: true
readOnlyRootFilesystem: true
privileged: false
capabilities:
drop:
- ALL
privileged: false
runAsNonRoot: true
readOnlyRootFilesystem: true
imagePullPolicy: Always
volumeMounts:
- name: scriptshare
mountPath: /share
terminationMessagePolicy: File
image: {{ registry | default(srls_registry) }}{{ registry_path | default(srls_registry_path) }}/srls/redis@${jenkins_env.fp_image_hash}
priorityClassName: ${srls_redis_deployment_priorityClassName}
containers:
- name: redis
image: ${redis_image}
command:
- /scripts/redis/start.sh
env:
- name: ALLOW_EMPTY_PASSWORD
value: "yes"
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
- name: TZ
valueFrom:
configMapKeyRef:
name: redis
key: TZ
- name: REPLICAS
valueFrom:
configMapKeyRef:
name: redis
key: REPLICAS
resources:
limits:
cpu: ${srls_redis_deployment_cpuLimit}
memory: ${srls_redis_deployment_memLimit}
requests:
cpu: ${srls_redis_deployment_cpuRequest}
memory: ${srls_redis_deployment_memRequest}
ports:
- name: redis
containerPort: 6379
securityContext:
readOnlyRootFilesystem: true
runAsNonRoot: true
privileged: false
capabilities:
drop:
- ALL
imagePullPolicy: Always
readinessProbe:
exec:
command:
- /scripts/redis/readinessProbe.sh
initialDelaySeconds: 10
timeoutSeconds: 1
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
livenessProbe:
exec:
command:
- /scripts/redis/livenessProbe.sh
initialDelaySeconds: 10
timeoutSeconds: 1
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
volumeMounts:
- name: redis-data
mountPath: /data
- name: config-map
mountPath: /mnt/config-map
- name: redis-conf
mountPath: /conf
- name: scriptshare
mountPath: /scripts
terminationGracePeriodSeconds: 10
dnsPolicy: ClusterFirstWithHostNet
imagePullSecrets:
- name: ${rls_image_pull_secret}
volumes:
- name: config-map
configMap:
name: redis
defaultMode: 256
- name: redis-data
emptyDir: {}
- name: redis-log
emptyDir: {}
- name: redis-conf
emptyDir: {}
- name: scriptshare
emptyDir: {}
StatefulSet для Redis Sentinel
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis-sentinel
namespace: ${rls_namespace}
labels:
app: redis-sentinel
proj: synapse-rls
agent: srls
version: ${jenkins_env.fp_artifact_version}
spec:
serviceName: "redis-sentinel"
replicas: ${srls_sentinel_deployment_replicas}
selector:
matchLabels:
app: redis-sentinel
template:
metadata:
labels:
app: redis-sentinel
proj: synapse-rls
agent: srls
annotations:
sidecar.istio.io/inject: 'false'
spec:
initContainers:
- resources:
limits:
cpu: ${srls_sentinel_scripts_deployment_cpuLimit}
memory: ${srls_sentinel_scripts_deployment_memLimit}
requests:
cpu: ${srls_sentinel_scripts_deployment_cpuRequest}
memory: ${srls_sentinel_scripts_deployment_memRequest}
terminationMessagePath: /dev/termination-log
name: scripts-sidecar
env:
- name: pod
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
securityContext:
securityContext:
runAsNonRoot: true
readOnlyRootFilesystem: true
privileged: false
securityContext:
runAsNonRoot: true
readOnlyRootFilesystem: true
privileged: false
capabilities:
drop:
- ALL
privileged: false
runAsNonRoot: true
readOnlyRootFilesystem: true
imagePullPolicy: Always
volumeMounts:
- name: scriptshare
mountPath: /share
terminationMessagePolicy: File
image: {{ registry | default(srls_registry) }}{{ registry_path | default(srls_registry_path) }}/srls/sentinel@${jenkins_env.fp_image_hash}
priorityClassName: ${srls_sentinel_deployment_priorityClassName}
containers:
- name: redis-sentinel
image: ${redis_image}
command:
- /scripts/sentinel/start.sh
env:
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
- name: TZ
valueFrom:
configMapKeyRef:
name: redis-sentinel
key: TZ
- name: REPLICAS
valueFrom:
configMapKeyRef:
name: redis
key: REPLICAS
resources:
limits:
cpu: ${srls_sentinel_deployment_cpuLimit}
memory: ${srls_sentinel_deployment_memLimit}
requests:
cpu: ${srls_sentinel_deployment_cpuRequest}
memory: ${srls_sentinel_deployment_memRequest}
ports:
- name: redis-sentinel
containerPort: 26379
securityContext:
readOnlyRootFilesystem: true
runAsNonRoot: true
privileged: false
capabilities:
drop:
- ALL
imagePullPolicy: Always
readinessProbe:
exec:
command:
- /scripts/sentinel/readinessProbe.sh
initialDelaySeconds: 10
timeoutSeconds: 1
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
livenessProbe:
exec:
command:
- /scripts/sentinel/livenessProbe.sh
initialDelaySeconds: 10
timeoutSeconds: 1
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
volumeMounts:
- name: config-map
mountPath: /mnt/config-map
- name: redis-conf
mountPath: /conf
- name: scriptshare
mountPath: /scripts
terminationGracePeriodSeconds: 10
dnsPolicy: ClusterFirstWithHostNet
imagePullSecrets:
- name: ${rls_image_pull_secret}
volumes:
- name: config-map
configMap:
name: redis-sentinel
defaultMode: 256
- name: redis-data
emptyDir: {}
- name: redis-log
emptyDir: {}
- name: redis-conf
emptyDir: {}
- name: scriptshare
emptyDir: {}
PodDisruptionBudget для Redis
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: redis-pdb
namespace: ${rls_namespace}
labels:
app: redis
proj: synapse-rls
agent: srls
spec:
minAvailable: ${redis_ose_poddisruptionbudget_spec_minAvailable}
selector:
matchLabels:
app: redis
PodDisruptionBudget для Redis Sentinel
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: redis-sentinel-pdb
namespace: ${rls_namespace}
labels:
app: redis-sentinel
proj: synapse-rls
agent: srls
spec:
minAvailable: ${redis_ose_poddisruptionbudget_spec_minAvailable}
selector:
matchLabels:
app: redis-sentinel
Настройка Egress Gateway#
Для подключения RL Operator к kube-api через Egress Gateway необходимо в прикладной namespace добавить следующие артефакты:
Gateway
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: egress-kubeapi-gw
namespace: ${rls_namespace}
spec:
selector: ${egress_selectors}
servers:
- hosts:
- ${kubernetes_service_host}
port:
name: tls-${egress_kubeapi_port}
number: ${egress_kubeapi_port}
protocol: TLS
tls:
cipherSuites:
- ECDHE-RSA-AES256-GCM-SHA384
- ECDHE-ECDSA-AES256-GCM-SHA384
minProtocolVersion: TLSV1_2
mode: PASSTHROUGH
ServiceEntry
apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
name: egress-kubeapi-se
namespace: ${rls_namespace}
spec:
addresses:
- ${kube_ip}
endpoints:
- address: ${kube_ip}
exportTo:
- .
hosts:
- ${kubernetes_service_host}
location: MESH_INTERNAL
ports:
- name: tls-${kubernetes_service_port}
number: ${kubernetes_service_port}
protocol: TLS
resolution: STATIC
VirtualService
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: egress-kubeapi-vs
namespace: ${rls_namespace}
spec:
exportTo:
- .
gateways:
- mesh
- egress-kubeapi-gw
hosts:
- ${kubernetes_service_host}
tls:
- match:
- port: ${kubernetes_service_port}
sniHosts:
- ${kubernetes_service_host}
route:
- destination:
host: egressgateway-rls-svc
port:
number: ${egress_kubeapi_port}
- match:
- gateways:
- egress-kubeapi-gw
port: ${egress_kubeapi_port}
sniHosts:
- ${kubernetes_service_host}
route:
- destination:
host: ${kubernetes_service_host}
port:
number: ${kubernetes_service_port}
Service
kind: Service
apiVersion: v1
metadata:
name: egressgateway-rls-svc
namespace: ${rls_namespace}
labels:
app: egress-${rls_namespace}
istio: egress-${rls_namespace}
proj: synapse-rls
agent: srls
version: ${jenkins_env.fp_artifact_version}
spec:
ports:
- name: tls-${egress_secman_port}
protocol: TCP
port: ${egress_secman_port}
targetPort: ${egress_secman_port}
- name: tls-${egress_kubeapi_port}
protocol: TCP
port: ${egress_kubeapi_port}
targetPort: ${egress_kubeapi_port}
selector: ${egress_selectors}
Артефакты, представленные ниже, необходимо добавлять в случае установки RL Service c TLS (обеспечивает подключение агента SecMan в Pod RL Service к серверу SecMan через Egress Gateway).
DestinationRule
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: egress-secman-dr
namespace: ${rls_namespace}
spec:
exportTo:
- .
host: egressgateway-rls-svc
trafficPolicy:
portLevelSettings:
- port:
number: ${egress_secman_port}
tls:
mode: DISABLE
Gateway
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: egress-secman-gw
namespace: ${rls_namespace}
spec:
selector: ${egress_selectors}
servers:
- hosts:
- ${secman_host}
port:
name: tls-${egress_secman_port}
number: ${egress_secman_port}
protocol: TLS
tls:
mode: PASSTHROUGH
PeerAuthentication
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: egress-pa
namespace: ${rls_namespace}
spec:
portLevelMtls:
'${egress_secman_port}':
mode: DISABLE
selector:
matchLabels:
${egress_selectors}
ServiceEntry
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: egress-secman-se
namespace: ${rls_namespace}
spec:
exportTo:
- .
hosts:
- ${secman_host}
location: MESH_EXTERNAL
ports:
- name: tls-${secman_port}
number: ${secman_port}
protocol: TLS
resolution: DNS
VirtualService
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: egress-secman-vs
namespace: ${rls_namespace}
spec:
exportTo:
- .
gateways:
- egress-secman-gw
- mesh
hosts:
- ${secman_host}
tls:
- match:
- gateways:
- mesh
port: ${secman_port}
sniHosts:
- ${secman_host}
route:
- destination:
host: egressgateway-rls-svc
port:
number: ${egress_secman_port}
- match:
- gateways:
- egress-secman-gw
port: ${egress_secman_port}
sniHosts:
- ${secman_host}
route:
- destination:
host: ${secman_host}
port:
number: ${secman_port}
Сборка образов для компонента SRLS из дистрибутива#
Разархивировать дистрибутив.
Открыть консоль и перейти в папку
package/дистрибутива.Собрать образы, выполнив команды:
docker build -f docker/operator/Dockerfile . -t {registry}/{registry_path}/srls/operator:{version}
docker build -f docker/rls/Dockerfile . -t {registry}/{registry_path}/srls/rls:{version}
docker build -f docker/redis/Dockerfile . -t {registry}/{registry_path}/srls/redis:{version}
docker build -f docker/sentinel/Dockerfile . -t {registry}/{registry_path}/srls/sentinel:{version}
Здесь:
registry– ссылка до registry;registry_path– базовый путь до каталога с образами;version– версия дистрибутива (например, 2.6).
Отправить образы в хранилище, выполнив команды:
docker push {registry}/{registry_path}/srls/operator@sha256:<hash>
docker push {registry}/{registry_path}/srls/rls@sha256:<hash>
docker push {registry}/{registry_path}/srls/redis@sha256:<hash>
docker push {registry}/{registry_path}/srls/sentinel@sha256:<hash>
Здесь:
registry– ссылка до registry;registry_path– базовый путь до каталога с образами;hash– sha256 хеш-сумма образа контейнера.
Предварительная настройка Deploy Tools#
Важно: для корректной установки необходимо использовать компонент CDJE Deploy Tools продукта Platform V DevOps Tools (DOT) версии 1.3 и выше. В Jenkins должен быть доступен
toolс kubectl версии не ниже 1.18. Настройка имениtoolзадается в параметреkubectlToolNameв environment.json.
В файле environment.json в блоке playbook_flexible должно быть следующее описание сценария. Если его нет, то необходимо добавить:
{
"playbooks_flexible": [
{
"name": "OPENSHIFT_DEPLOY_FP_KUBECTL",
"description": "Развертывание дистрибутива функциональной подсистемы",
"script": "runOSEKubectlDeploy.groovy",
"resources": {
"include": [
"package/conf/k8s/base/**/*.y?ml",
"package/conf/k8s/overrides/openshift/**/*.y?ml"
],
"exclude": [
"**/istio/**"
]
},
"args": {
"addLabels": true,
"secrets": {
"exclude": [
"mq.jks",
"ingress.*-certs$",
"egress.*-certs$"
]
}
}
}
]
}
Автоматизированная установка сервиса с использованием Deploy Tools#
Важно: Для корректной установки необходимо выполнить шаг «Предварительная настройка Deploy Tools», описанный выше.
Скачать необходимую версию дистрибутива.
Настроить Job (дистрибутив собран с поддержкой Deploy Tools).
Примечание — настройка заключается в указании для job параметров, описанных в разделе «Параметры установки» в таблицах «Параметры шаблонизации» и «Список и описание параметров».
Запустить миграцию конфигурационных файлов — набор сценариев MIGRATION_FP_CONF.
Скорректировать значения параметров шаблонизации и стендозависимых параметров.
Примечание — значение параметра DEPLOY_TO_KUBERNETES определяет платформу контейнеризации для запуска компонентов сервиса (для установки Kubernetes и Platform V DropApp значение
True).Запустить установку — сценарий OPENSHIFT_DEPLOY_FP_KUBECTL.
Автоматизированная установка по агентской схеме с использованием Deploy Tools#
Важно: Для корректной установки необходимо выполнить шаг «Предварительная настройка Deploy Tools», описанный выше.
Данный вариант развертывания позволяет одновременно с установкой дистрибутива бизнес-приложения или технологического сервиса произвести автоматическую установку компонента SRLS и создать артефакт GlobalRateLimit. Возможен вариант только с созданием артефакта GlobalRateLimit без установки компонента SRLS.
Настроить Job бизнес-приложения или технологического сервиса.
В схему справочника конфигураций развертывания (
subsystem.json) добавить секциюagentsдля определения конфигураций развертывания из дистрибутива SRLS:
agents: {
"SRLS_agent": {
"groupId": "",
"artifactId": "",
"version": "",
"fpi-name": "",
"classifier": "",
"packaging": "",
...
}
}
Запустить миграцию конфигурационных файлов, указав в поле параметров Job
COMPONENTSсконфигурированный агент — набор сценариев MIGRATION_FP_CONF.Настроечные параметры из дистрибутива SRLS будут подгружены в пространство конфигурирования бизнес-приложения или технологического сервиса.
Скорректировать значения параметров шаблонизации и стендозависимых параметров.
Для создания артефакта GlobalRateLimit необходимо выставить значение
Trueпараметра шаблонизации DEPLOY_LIMITS и заполнить параметр шаблонизации endpoints в соответствии с разделом «Параметры установки» настоящего документа.Если требуется установить дистрибутив в децентрализованном варианте развертывания SRLS, необходимо настроить соответствующие параметры, описанные в разделах «Параметры установки» и «Параметры установки, специфичные для выбранного варианта развертывания» настоящего документа.
Если установка не требуется, необходимо выставить значение
Falseпараметров шаблонизации DEPLOY_CENTR, DEPLOY_DECENTR.
Запустить установку бизнес-приложения или технологического сервиса, указав в поле параметров Job
COMPONENTSсконфигурированный агент — набор сценариев OPENSHIFT_DEPLOY_FP_KUBECTL.
Автоматизированная установка сервиса с использованием Synapse Installer#
Скачать необходимую версию дистрибутива.
Получить из дистрибутива конфигурационные файлы:
default.yaml,values.yaml.Поместить полученные в пункте выше файлы в git-репозиторий со стендозависимыми параметрами.
Скорректировать значения параметров шаблонизации и стендозависимых параметров.
Примечание — значение параметра DEPLOY_TO_KUBERNETES определяет платформу контейнеризации для запуска компонентов сервиса (для установки Kubernetes и Platform V DropApp значение
True).Запустить job с указанием git-репозитория с параметрами и указанием места установки.
Установка dashboard в программном компоненте Indicator (INDA) программного продукта Platform V Monitor (OPM)#
В поставку дистрибутива входят следующие dashboard:
SRLS.json — метрики работы сервиса srl;
SRLS Go Metrics.json — метрики потребления ресурсов srl;
SRLS Operator.json – метрики работы оператора RL Operator;
SRLS Operator Go Metrics.json — метрики потребления ресурсов RL Operator;
SRLS Client Metrics.json – метрики для биллинга потребителей;
Место хранения — папка /k8s/base/other/dashboard.
Для корректной работы Dashboard необходимо знать название таблицы в базе данных Druid, в которую осуществляется загрузка метрик от RL Service и RL Operator (узнать название таблицы можно у администраторов Platform V Monitor).
Для установки dashboard необходимо:
Выполнить вход в Indicator Platform V Monitor.
Перейти на вкладку «Dashboards» → «Manage» (1).
Нажать на кнопку «Import» (2).

Рисунок. Вкладка «Dashboards» компонента Indicator Platform V Monitor
Нажать на кнопку «Upload JSON file» (3).

Рисунок. Экран компонента Indicator Platform V Monitor, кнопка «Upload JSON file»
В появившемся окне выбрать файл с dashboard.
В окне выбрать источник базы данных для получения метрик «Indicator-Abyss» из выпадающего списка (4).
В поле «druidtable» изменить название (srlsunimon) таблицы в базе данных Druid на требуемое (5).

Рисунок. Экран компонента Indicator Platform V Monitor для настройки загруженного dashboard
Нажать на кнопку «Import».
Примеры dashboard:

Рисунок. Dashboard SRLS.json

Рисунок. Dashboard SRLS Operator.json

Рисунок. Dashboard SRLS Go Metrics.json, SRLS Operator Go Metrics.json

Рисунок. Dashboard SRLS Client Metrics.json
Dashboard «SRLS Client Metrics» позволяет выбрать namespace, в котором развернут компонент SRLS, и уникальное название метрики (ratelimiterservice_rate_limit_*key*_over_limit), сформированное из CRD GlobalRatelimit в этом namespace. Для синхронизации данных с метриками, полученными в namespace с различных Pod компонентов SRLS, в dashboard используется параметр «rounding time» — период агрегации данных (1M,2M,5M,15M,30M,1H,2H).
Первая панель на dashboard отображает набор метрик, общих для всех потребителей. График Over limit indicators отображает набор лимитов и окрашивает в красный цвет соответствующий шестигранник при превышении установленной квоты за выбранный период отображения. График Soft limit events отображает события превышения установленных soft-квот. Графики Requests to SRLS и Requests to Endpoint '$key' отображают количество всех (красным) и одобренных SRLS (зелёным) запросов соответственно на весь SRLS и на endpoint (endpoint определяется на основе выбранной метрики ratelimiterservice_rate_limit_*key*_over_limit).
Панель «Request» отображает количество запросов за выбранный период агрегации для выбранной метрики ratelimiterservice_rate_limit_*key*_over_limit (график Requests to Consumer '$key'). Также на панели дополнительно отображаются значение и единица измерения квоты, соответствующие выбранной метрике.
Панель «Limit Status» отображает графики метрик следующих типов: near limit (превышение уровня 80% от установленной квоты), over limit (превышение установленной квоты) и soft limit (превышение установленной soft-квоты). Для каждого из типов лимитов представлены графики, соответствующие выбранной метрике ratelimiterservice_rate_limit_*key*_over_limit: Total $type limit — общее число запросов свыше соответствующей квоты; Delta $type limit — приращение числа запросов свыше соответствующей квоты за период агрегации данных.
Настройка интеграции#
Ниже описана процедура интеграции с рекомендованным АО «СберТех» продуктом Platform V Monitor. На усмотрение пользователя может быть настроена интеграция с аналогичным по функциональности продуктом от других производителей.
Интеграция с программным компонентом Объединенный мониторинг Unimon (MONA) реализована в соответствии с требованиями Unimon: компонент публикует метрики в формате Prometheus. Для артефактов Service rl-operator и RateLimiterService добавлены необходимые аннотации Prometheus с необходимыми значениями (см. выше):
prometheus.io.path;
prometheus.io.port;
prometheus.io.scrape.
Интеграция с программным компонентом Журналирование (LOGA) реализована в соответствии с требованиями сервиса журналирования: используется FluentBit sidecar для компонентов RL Operator и RL Service.
При установке должна быть включена опция:
FLUENT_BIT_SIDECAR_ENABLED = true и заполнены соответствующие поля «ufs-logger» (см. раздел «Параметры установки»).
Название |
Описание |
Значение по умолчанию |
|---|---|---|
FLUENT_BIT_SIDECAR_ENABLED |
Если True, то RL Operator и RL Service будут запущены с sidecar fluent-bit |
true |
TENANT_CODE |
Код тенанта, используемый в конфигурации fluent-bit ufs-logger |
Если параметр не задан в настройках инструмента/распаковки, то используется значение SRLS_TENANT_CODE |
ufs_logger_kafka_bootstrap_servers |
Список адресов кластера брокеров Kafka для журналирования |
{ IP_ADDRESS }:9092 |
ufs_logger_kafka_topic |
Название топика для журналирования |
eventlog |
ufs_logger_kafka_security_protocol |
Конфигурация закрытого соединения с Kafka |
plaintext / ssl |
Создать артефакт Secret с названием fluent-bit-kafka-certс сертификатами для доступа к Kafka. Секрет может быть создан с помощью инструмента командной строки или через файл манифеста Secret.
Пример команды для Kubernetes:
kubectl create secret generic fluent-bit-kafka-cert \
--from-file=logger_cacerts.cer=logger_cacerts.cer \
--from-file=logger_private-key.pem=logger_private-key.pem \
--from-file=logger_cert.pem=logger_cert.pem \
-n <namespace>
Здесь namespace — уникальное имя пространства.
Пример команды для OpenShift:
oc create secret generic ingress-secrets \
--from-file=logger_cacerts.cer=logger_cacerts.cer \
--from-file=logger_private-key.pem=logger_private-key.pem \
--from-file=logger_cert.pem=logger_cert.pem
Пример манифеста:
kind: Secret
apiVersion: v1
metadata:
name: fluent-bit-kafka-cert
namespace: ${rls_namespace}
data:
logger_cacerts.cer: >-
logger_private-key.pem: >-
logger_cert.pem: >-
type: Opaque
Здесь поля logger_cacerts.cer, logger_private-key.pem, logger_cert.pem должны быть заполнены данными из соответствующих файлов в base64 кодировке.
Пример команды для получения данных в формате base64:
base64 -w 0 logger_cacerts.cer
Далее необходимо следовать пунктам «Установка».
Обновление#
Обновление программного компонента осуществляется по одной из стратегий — Rolling или Recreate.
Стратегия Recreate:
Удалить программный компонент согласно процедуре, описанной в разделе «Удаление».
Установить программный компонент согласно процедуре, описанной в разделе «Установка».
Стратегия Rolling:
Обновить артефакты согласно разделу «Установка».
Удаление#
Удаление централизованного Synapse Rate Limiter Service#
Для удаления Synapse Rate Limit необходимо удалить следующие ресурсы:
Версия |
Тип |
Название |
|---|---|---|
apps/v1 |
Deployment |
ingress-${rls_namespace} |
apps/v1 |
Deployment |
rloperator |
apps/v1 |
Deployment |
rate-limiter-service |
apps/v1 |
StatefulSet |
redis |
apps/v1 |
StatefulSet |
redis-sentinel |
networking.istio.io/v1alpha3 |
DestinationRule |
rls-destination-rule |
networking.istio.io/v1alpha3 |
EnvoyFilter |
ingress-filter |
networking.istio.io/v1alpha3 |
EnvoyFilter |
ingress-secman-listener-tls-filter |
networking.istio.io/v1alpha3 |
Gateway |
ingress-rate-limiter |
networking.istio.io/v1alpha3 |
VirtualService |
rls-virtual-service |
route.openshift.io/v1 |
Route |
ingress-route |
v1 |
Service |
ingressgateway-svc |
v1 |
Service |
rloperator |
v1 |
Service |
rate-limiter-service |
v1 |
Service |
rate-limiter-headless-service |
v1 |
Service |
redis |
v1 |
Service |
redis-sentinel |
coordination.k8s.io/v1 |
Lease |
srls-operator-lock |
v1 |
ConfigMap |
operator-config |
v1 |
ConfigMap |
operator-fluent-bit-sidecar |
v1 |
ConfigMap |
rlservice-fluent-bit-sidecar |
v1 |
ConfigMap |
redis |
v1 |
ConfigMap |
redis-sentinel |
v1 |
ConfigMap |
rls-config |
policy/v1beta1 |
PodDisruptionBudget |
ingress-pdb |
policy/v1beta1 |
PodDisruptionBudget |
rloperator-pdb |
policy/v1beta1 |
PodDisruptionBudget |
rls-pdb |
policy/v1beta1 |
PodDisruptionBudget |
redis-pdb |
policy/v1beta1 |
PodDisruptionBudget |
redis-sentinel-pdb |
Если был установлен Egress Gateway, то еще удалить следующие ресурсы |
||
apps/v1 |
Deployment |
egress-${rls_namespace} |
v1 |
Service |
egressgateway-rls-svc |
networking.istio.io/v1alpha3 |
DestinationRule |
egress-secman-dr |
networking.istio.io/v1alpha3 |
Gateway |
egress-secman-gw |
networking.istio.io/v1alpha3 |
ServiceEntry |
egress-secman-se |
networking.istio.io/v1alpha3 |
VirtualService |
egress-secman-vs |
security.istio.io/v1beta1 |
PeerAuthentication |
egress-pa |
policy/v1beta1 |
PodDisruptionBudget |
egress-pdb |
Удаление децентрализованного Synapse Rate Limiter Service#
Для удаления Synapse Rate Limit необходимо удалить следующие ресурсы:
Версия |
Тип |
Название |
|---|---|---|
apps/v1 |
Deployment |
rloperator |
coordination.k8s.io/v1 |
Lease |
srls-operator-lock |
v1 |
ConfigMap |
operator-config |
v1 |
Service |
rloperator |
v1 |
ConfigMap |
operator-fluent-bit-sidecar |
v1 |
ConfigMap |
redis |
v1 |
Service |
redis |
apps/v1 |
StatefulSet |
redis |
v1 |
ConfigMap |
redis-sentinel |
v1 |
Service |
redis-sentinel |
apps/v1 |
StatefulSet |
redis-sentinel |
v1 |
ConfigMap |
rls-config |
v1 |
Service |
rate-limiter-service |
v1 |
Service |
rate-limiter-headless-service |
apps/v1 |
Deployment |
rate-limiter-service |
Проверка работоспособности#
Для проверки работоспособности необходимо включить расширенное логирование на Egress в прикладном namespace и Ingress Gateway в namespace Rate Limit. Это можно сделать с помощью:
curl -XPOST localhost:15000/logging?level=debugВключить LOG_LEVEL: debug у rate-limiter-service, изменив настройку в ConfigMap
name: rls-config.Выполнить запрос к сервису, доступ которого необходимо было ограничить, и смотреть логи rate-limiter-service и ingress.
Посмотреть логи Pod можно с помощью утилиты командной строки.
Пример команды для Kubernetes:
kubectl logs <pod-name> -n <namespace>
Пример команды для OpenShift:
oc logs <pod-name>
Здесь pod-name — уникальный идентификатор Pod, namespace — уникальное имя пространства.
Пример логов при штанной работе:
Ingress Gateway
2022-07-27T13:57:37.156537Z debug envoy http [external/envoy/source/common/http/conn_manager_impl.cc:268] [C1223976] new stream
2022-07-27T13:57:37.156651Z debug envoy http [external/envoy/source/common/http/conn_manager_impl.cc:782] [C1223976][S13350365220836289984] request headers complete (end_stream=true):
':authority', 'test-server-namespace.apps.solution.sbt'
':path', '/favicon.ico'
':method', 'GET'
'user-agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.134 YaBrowser/22.7.0.1922 Yowser/2.5 Safari/537.36'
'accept', 'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8'
'referer', 'http://test-server-namespace.apps.solution.sbt/'
'accept-encoding', 'gzip, deflate'
'accept-language', 'ru,en;q=0.9'
'x-forwarded-host', 'test-server-namespace.apps.solution.sbt'
'x-forwarded-port', '80'
'x-forwarded-proto', 'http'
'forwarded', 'for=xx.xx.xx.xx;host=test-server-namespace.apps.solution.sbt;proto=http'
'x-forwarded-for', 'xx.xx.xx.xx'
2022-07-27T13:57:37.156656Z debug envoy http [external/envoy/source/common/http/conn_manager_impl.cc:1356] [C1223976][S13350365220836289984] request end stream
2022-07-27T13:57:37.156837Z debug envoy router [external/envoy/source/common/router/router.cc:477] [C0][S15777754260353003803] cluster 'rate_limit_cluster' match for URL '/envoy.service.ratelimit.v2.RateLimitService/ShouldRateLimit'
2022-07-27T13:57:37.156866Z debug envoy router [external/envoy/source/common/router/router.cc:634] [C0][S15777754260353003803] router decoding headers:
':method', 'POST'
':path', '/envoy.service.ratelimit.v2.RateLimitService/ShouldRateLimit'
':authority', 'rate_limit_cluster'
':scheme', 'http'
'te', 'trailers'
'grpc-timeout', '20000m'
'content-type', 'application/grpc'
'x-b3-traceid', '9ed95b2edcee7ade3397ad1b88e1a2fc'
'x-b3-spanid', 'a54045d2cdfcada6'
'x-b3-parentspanid', '3397ad1b88e1a2fc'
'x-b3-sampled', '1'
'x-envoy-internal', 'true'
'x-forwarded-for', 'xx.xx.xx.xx'
'x-envoy-expected-rq-timeout-ms', '20000'
2022-07-27T13:57:37.156879Z debug envoy pool [external/envoy/source/common/http/conn_pool_base.cc:118] [C1223977] using existing connection
2022-07-27T13:57:37.156882Z debug envoy pool [external/envoy/source/common/http/conn_pool_base.cc:68] [C1223977] creating stream
2022-07-27T13:57:37.156894Z debug envoy router [external/envoy/source/common/router/upstream_request.cc:317] [C0][S15777754260353003803] pool ready
2022-07-27T13:57:37.158638Z debug envoy router [external/envoy/source/common/router/router.cc:1149] [C0][S15777754260353003803] upstream headers complete: end_stream=false
2022-07-27T13:57:37.158680Z debug envoy http [external/envoy/source/common/http/async_client_impl.cc:96] async http request response headers (end_stream=false):
':status', '200'
'content-type', 'application/grpc'
'x-envoy-upstream-service-time', '1'
rate-limiter-service (при включенной опции LOG_LEVEL: debug) запрос сервису
time="2022-07-27T14:06:27Z" level=debug msg="A counter [ratelimiterservice_ratelimit_server_ShouldRateLimit_total_requests] has been registered before. Use the old counter from now on"
time="2022-07-27T14:06:27Z" level=debug msg="A gauge \"ratelimiterservice_ratelimit_server_ShouldRateLimit_response_time\" has been registered before. Use the old gauge from now on"
time="2022-07-27T14:06:27Z" level=debug msg="got descriptor: (generic_key=servertest),(header_match=header-absent)"
time="2022-07-27T14:06:27Z" level=debug msg="starting get limit lookup"
time="2022-07-27T14:06:27Z" level=debug msg="looking up key: generic_key_servertest"
time="2022-07-27T14:06:27Z" level=debug msg="found rate limit: generic_key_servertest"
time="2022-07-27T14:06:27Z" level=debug msg="request depth does not match config depth, there are more entries in the request's descriptor"
time="2022-07-27T14:06:27Z" level=debug msg="iterating to next level"
time="2022-07-27T14:06:27Z" level=debug msg="looking up key: header_match_header-absent"
time="2022-07-27T14:06:27Z" level=debug msg="found rate limit: header_match_header-absent"
time="2022-07-27T14:06:27Z" level=debug msg="applying limit: 7 requests per MINUTE"
time="2022-07-27T14:06:27Z" level=debug msg="starting cache lookup"
time="2022-07-27T14:06:27Z" level=debug msg="looking up cache key: tribe-sy-dev-srls-dev-04_generic_key_servertest_header_match_header-absent_1658930760"
time="2022-07-27T14:06:27Z" level=debug msg="cache key: tribe-sy-dev-srls-dev-04_generic_key_servertest_header_match_header-absent_1658930760 current: 1"
time="2022-07-27T14:06:27Z" level=debug msg="returning normal response"
time="2022-07-27T14:06:27Z" level=debug msg="A counter [ratelimiterservice_ratelimit_server_ShouldRateLimit_total_requests] has been registered before. Use the old counter from now on"
time="2022-07-27T14:06:27Z" level=debug msg="A gauge \"ratelimiterservice_ratelimit_server_ShouldRateLimit_response_time\" has been registered before. Use the old gauge from now on"
time="2022-07-27T14:06:27Z" level=debug msg="got descriptor: (generic_key=servertest),(header_match=header-absent)"
time="2022-07-27T14:06:27Z" level=debug msg="starting get limit lookup"
time="2022-07-27T14:06:27Z" level=debug msg="looking up key: generic_key_servertest"
time="2022-07-27T14:06:27Z" level=debug msg="found rate limit: generic_key_servertest"
time="2022-07-27T14:06:27Z" level=debug msg="request depth does not match config depth, there are more entries in the request's descriptor"
time="2022-07-27T14:06:27Z" level=debug msg="iterating to next level"
time="2022-07-27T14:06:27Z" level=debug msg="looking up key: header_match_header-absent"
time="2022-07-27T14:06:27Z" level=debug msg="found rate limit: header_match_header-absent"
time="2022-07-27T14:06:27Z" level=debug msg="applying limit: 7 requests per MINUTE"
time="2022-07-27T14:06:27Z" level=debug msg="starting cache lookup"
time="2022-07-27T14:06:27Z" level=debug msg="looking up cache key: tribe-sy-dev-srls-dev-04_generic_key_servertest_header_match_header-absent_1658930760"
time="2022-07-27T14:06:27Z" level=debug msg="cache key: tribe-sy-dev-srls-dev-04_generic_key_servertest_header_match_header-absent_1658930760 current: 2"
time="2022-07-27T14:06:27Z" level=debug msg="returning normal response"
Показателем работоспособности является прохождение запроса и отображение в цепочке логов ingress-> rate-limiter-service к сервису (доступ к которому планируется ограничить).
Чек-лист проверки работоспособности интеграций#
Проверка работоспособности интеграции с Platform V SberLinux OS Server и Platform V DropApp#
Убедиться, что установка SRLS в среду контейнеризации DropApp произошла успешно.
Убедиться, что readiness/liveness-пробы Pods успешные и Pods по пробам периодически не перезапускаются.
Убедиться, что при выполнении команды
cat /etc/os-releaseв terminal контейнера одного из Pod, поставляемого в рамках компонента SRLS, выводится информация о базовом образе SberLinux OS Server.
Проверка работоспособности интеграции с LOGA#
Убедиться, что установка SRLS произошла успешно (с параметром
FLUENT_BIT_SIDECAR_ENABLED=True).Убедиться, что readiness/liveness-пробы Pods успешные и Pods по пробам периодически не перезапускаются.
Проверка работоспособности интеграции с MONA#
Убедиться, что установка SRLS произошла успешно.
Проверить в логах компонента Unimon-sender (часть компонента Объединенный мониторинг Unimon (MONA) продукта Platform V Monitor) наличие логов об отправке данных мониторинга SRLS в Kafka.
Откат#
Откат производится развертыванием предыдущей версии SRLS, при этом должен быть выполнен откат стендозависимых параметров (если были изменения) в хранилище параметров.
Для отката необходимо удалить ресурсы текущей версии продукта (согласно разделу «Удаление» данного документа). Следуя документу «Руководство по установке», выполнить установку необходимой версии.
Часто встречающиеся проблемы и пути их устранения#
Часто встречающиеся проблемы не обнаружены.
Чек-лист валидации установки#
Namespace, в который требуется установить компонент SRLS, подключен к Istio.
Cоздан ImagePullSecret для доступа к образам из среды контейнеризации к Docker-registry.
Добавлен артефакт CustomResourceDefinition GlobalRateLimit.
В namespace существует ServiceAccount c именем default.
Параметры шаблонизации и стендозависимые параметры заполнены в соответствии с рекомендуемыми параметрами.
RL Operator:
Следующие ресурсы доступны и отображаются в Kubernetes или Red Hat OpenShift (опционально):
Версия |
Тип |
Название |
|---|---|---|
apps/v1 |
Deployment |
rloperator |
coordination.k8s.io/v1 |
Lease |
srls-operator-lock |
v1 |
ConfigMap |
operator-config |
v1 |
Service |
rloperator |
v1 |
ConfigMap |
operator-fluent-bit-sidecar |
Запущено 2 Pod RL Operator.
В логах Pod отсутствуют ошибки.
Pods не уходят в перезапуск по результатам readiness/liveness-проб.
RL Service:
Следующие ресурсы доступны и отображаются в Kubernetes или Red Hat OpenShift (опционально):
Версия |
Тип |
Название |
|---|---|---|
apps/v1 |
Deployment |
rate-limiter-service |
v1 |
ConfigMap |
rls-config |
v1 |
Service |
rate-limiter-service |
v1 |
Service |
rate-limiter-headless-service |
Запущено 2 Pod RL Service.
В логах Pod отсутствуют ошибки.
Pods компонента не уходят в перезапуск по результатам readiness/liveness-проб.
Redis:
Следующие ресурсы доступны и отображаются в Kubernetes или Red Hat OpenShift (опционально):
Версия |
Тип |
Название |
|---|---|---|
apps/v1 |
StatefulSet |
redis |
apps/v1 |
StatefulSet |
redis-sentinel |
v1 |
Service |
redis |
v1 |
Service |
redis-sentinel |
v1 |
ConfigMap |
redis |
v1 |
ConfigMap |
redis-sentinel |
Запущено 3 Pod Redis-sentinel и 3 Redis.
В логах Pod отсутствуют ошибки.
Pods не уходят в перезапуск по результатам readiness/liveness-проб.
При централизованном варианте SRLS Ingress Gateway:
Следующие ресурсы доступны и отображаются в Kubernetes или Red Hat OpenShift (опционально):
Версия |
Тип |
Название |
|---|---|---|
apps/v1 |
Deployment |
ingress-${rls_namespace} |
networking.istio.io/v1alpha3 |
DestinationRule |
rls-destination-rule |
networking.istio.io/v1alpha3 |
EnvoyFilter |
ingress-filter |
networking.istio.io/v1alpha3 |
EnvoyFilter |
ingress-secman-listener-tls-filter |
networking.istio.io/v1alpha3 |
Gateway |
ingress-rate-limiter |
networking.istio.io/v1alpha3 |
VirtualService |
rls-virtual-service |
route.openshift.io/v1 |
Route |
ingress-route |
v1 |
Service |
ingressgateway-svc |
Запущено 2 Pod Ingress Gateway.
В логах Pod отсутствуют ошибки.
Pods не уходят в перезапуск по результатам readiness/liveness-проб.
При централизованном варианте SRLS с TLS шифрованием Egress Gateway:
Следующие ресурсы доступны и отображаются в Kubernetes или Red Hat OpenShift (опционально):
Версия |
Тип |
Название |
|---|---|---|
apps/v1 |
Deployment |
egress-${rls_namespace} |
v1 |
Service |
egressgateway-rls-svc |
networking.istio.io/v1alpha3 |
DestinationRule |
egress-secman-dr |
networking.istio.io/v1alpha3 |
Gateway |
egress-secman-gw |
networking.istio.io/v1alpha3 |
ServiceEntry |
egress-secman-se |
networking.istio.io/v1alpha3 |
VirtualService |
egress-secman-vs |
security.istio.io/v1beta1 |
PeerAuthentication |
egress-pa |
policy/v1beta1 |
PodDisruptionBudget |
egress-pdb |
Запущено 2 Pod Egress Gateway.
В логах Pod отсутствуют ошибки.
Pods не уходят в перезапуск по результатам readiness/liveness-проб.
Настроена интеграция «Клиентской части Unimon».
В логах компонента «Клиентской части Unimon Sender» присутствуют логи об отправке данных мониторинга SRLS в Kafka.
При успешном выполнении всех пунктов можно приступать к использованию сервиса.