Руководство по установке#

В руководстве приведены инструкции по установке компонента 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 и выше

Опционально

Среда контейнеризации

Да

Kubernetes

1.24 и выше

Рекомендовано. Правообладателем АО «СберТех» также рекомендована среда контейнеризации – Platform V DropApp, см. раздел «Платформенные зависимости»

Платформа контейнеризации для запуска компонентов сервиса

Red Hat OpenShift

4.8 и выше

Опционально

Средство контейнеризации

Да

Docker CE

1.13.1 и выше

Рекомендовано

Инструмент для автоматизации работы с контейнерами

Инструмент сборки, тестирования, развертывания контейнеризированных приложений

Нет

Jenkins

2.346.0 и выше

Рекомендовано

Сервер автоматизации, используемый для внедрения непрерывной интеграции и непрерывной доставки (CI/CD) для проектов программного обеспечения

Сервис интеграции и оркестрации микросервисов в облаке

Да

Istio

1.12 и выше

Рекомендовано. Правообладателем АО «СберТех» также рекомендован сервис интеграции и оркестрации микросервисов в облаке, основанный на Istio, – Platform V Synapse Service Mesh, см. раздел «Платформенные зависимости»

Сервис интеграции микросервисов в облаке

Хранилище данных

Да

Redis

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

Внешний распределенный кеш используется для корректного подсчета лимитов для сервиса, запущенного более чем в одном экземпляре

Система мониторинга (сбор и хранение метрик)

Нет

Prometheus

2.37.0 и выше

Рекомендовано. Правообладателем АО «СберТех» также рекомендован Сервис для сбора прикладных и инфраструктурных метрик и отправки их в целевую систему хранения – Объединенный мониторинг Unimon Platform V Monitor, см. раздел «Платформенные зависимости»

Система для сбора и хранения численных метрик

Система мониторинга (визуализация)

Нет

Grafana

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

Примечание:

***

  • Да — компонент или продукт необходим для функционирования сервиса (это означает, что сервис не может выполнять свои основные функции без установки данного компонента).

  • Нет — необязательный для функционирования сервиса компонент или продукт (это означает, что сервис может выполнять свои основные функции без установки данного компонента).

**** Рекомендуется установка программного продукта, правообладателем которого является АО «СберТех», при этом не исключена возможность (допускается правообладателем) использования аналога других производителей. Аналоги, в отношении которых продукт успешно прошел испытания и подтвердил свою работоспособность, указаны в разделе «Системное программное обеспечение».

Аппаратные требования#

Для установки компонента требуется следующая конфигурация аппаратного обеспечения:

  1. Квота для установки централизованного варианта SRLS:

    1. количество ядер процессора — 5 ядер;

    2. объем оперативной памяти — 10 ГБ.

  2. Квота для установки централизованного варианта SRLS c TLS шифрованием:

    1. количество ядер процессора — 7 ядер;

    2. объем оперативной памяти — 12 ГБ.

  3. Квота для установки децентрализованного варианта SRLS:

    1. количество ядер процессора — 3 ядра;

    2. объем оперативной памяти — 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+141

  • RLS= Целевой TPS*0,5+122

Memory

  • Ingress = Целевой TPS*0,01+359,5

  • RLS= Целевой TPS*0,003+19,2

Децентрализованный SRLS

CPU

  • Ingress = Целевой TPS*0,82+255

  • RLS= Целевой TPS*0,41+224

Memory

  • Ingress = Целевой TPS*0,03+337

  • RLS= Целевой 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.

Подготовка окружения#

  1. Namespace, в который требуется установить компонент SRLS, должен быть подключен к Istio: убедиться, что в namespace существуют стандартные Config Map Istio с именами istio-ca-root-cert, istio-basic (если нет, то добавить).

  2. Убедиться, что в namespace существует ServiceAccount c именем default (если нет, то добавить).

  3. Для доступа к образам из среды контейнеризации к 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
  1. Связать секрет 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

  1. Создать или обновить артефакт 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

Если True, то RL Operator и RL Service будут запущены с sidecar fluent-bit

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, то будут созданы артефакты PodDisruptionBudget; чтобы выключить, нужно указать False

True

DEPLOY_TO_KUBERNETES

Для совместимости с Kubernetes и Platform V DropApp

False

DEPLOY_LEASE_ENABLED

Разворачивать или нет артефакт Lease в составе дистрибутива

False

SECMAN_ENABLED

Если True, настраивается интеграция с SecMan, если False, сертификаты берутся из артефакта Secret

True

SECMAN_NAMESPACE_ENABLED

Поддержка пространств в хранилище SecMan

False

SECRET_ENABLED

Если True, при развертывании дистрибутива устанавливаются ресурсы kind: Secret

False

SSM_ENABLED

Если True, настраивается интеграция с Platform V Synapse Service Mesh

True

DEPLOY_ACCOUNT

Если True, при развертывании дистрибутива устанавливаются ресурсы kind: ServiceAccount

False

DEPLOY_CENTR

Если True, при развертывании дистрибутива устанавливаются компоненты, необходимые для централизованного варианта развертывания, только один из параметров DEPLOY_CENTR или DEPLOY_DECENTR может принимать значение True

False

DEPLOY_DECENTR

Если True, при развертывании дистрибутива устанавливаются компоненты, необходимые для децентрализованного варианта развертывания, только один из параметров DEPLOY_CENTR или DEPLOY_DECENTR может принимать значение True

True

DEPLOY_LIMITS

Если True, при развертывании дистрибутива создается артефакт GlobalRateLimit

False

endpoints

Если значение параметра DEPLOY_LIMITS выставлено в True, в параметре endpoints необходимо указать строку в формате JSON, соответствующую секции endpoints артефакта GlobalRateLimit, описанного в разделе «Формирование и применение артефакта GlobalRateLimit» документа «Руководство прикладного разработчика»

Пример значения параметра 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

Список заголовков с регулярным выражением для реализации белого списка

[{"header":{"name":"x-forwarded-client-cert","safe_regex_match":{"google_re2":{"max_program_size":200},"regex":".*CN=someCN\.local\.host\.ru.*"}}}]

Данный пример для пропуска сертификата с 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

Если выставлено значение true, поддержка автоматизированного создания артефактов EnvoyFilter компонентом RL Operator выключена

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%

Варианты конфигурации белых списков:

Описание

Значение

Доступ разрешен с любым сертификатом

[{"any": true}]

Доступ разрешен для сертификата с CN=someCN.local.host.ru

[{"header":{"name":"x-forwarded-client-cert","safe_regex_match":{"google_re2":{"max_program_size":200},"regex":".*CN=someCN\.local\.host\.ru.*"}}}]

Доступ разрешен для сертификатов с CN=someCN.local.host.ru и CN=anotherCN.local.host.ru

[{"header":{"name":"x-forwarded-client-cert","safe_regex_match":{"google_re2":{"max_program_size":200},"regex":".*CN=someCN\.local\.host\.ru.*"}}},{"header":{"name":"x-forwarded-client-cert","safe_regex_match":{"google_re2":{"max_program_size":200},"regex":".*CN=anotherCN\.local\.host\.ru.*"}}}]

Доступ разрешен для сертификата с указанным хешем

[{"header":{"name":"x-forwarded-client-cert","safe_regex_match":{"google_re2":{"max_program_size":200},"regex":".*df6ff72fe9116521268f6f2dd4966f51df479883fe7037b39f75916ac3049d1a.*"}}}]

Для получения хеша сертификата выполните:

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 (cluster для централизованного варианта SRLS или namespace для децентрализованного)

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

Параметр шаблонизации

True

DEPLOY_DECENTR

Параметр шаблонизации

False

operator_scope

Стендозависимый параметр

cluster

rls_typeMod

Стендозависимый параметр

server

Централизованный вариант (c шифрованием TLS) развертывания:

Название

Тип параметра

Значение

SRLS_TLS_ENABLED

Параметр шаблонизации

True

DEPLOY_CENTR

Параметр шаблонизации

True

DEPLOY_DECENTR

Параметр шаблонизации

False

operator_scope

Стендозависимый параметр

cluster

rls_typeMod

Стендозависимый параметр

server

rls_tls_enable

Стендозависимый параметр

True

Децентрализованный вариант развертывания:

Название

Тип параметра

Значение

DEPLOY_CENTR

Параметр шаблонизации

False

DEPLOY_DECENTR

Параметр шаблонизации

True

operator_scope

Стендозависимый параметр

namespace

rls_typeMod

Стендозависимый параметр

server

Ручная установка сервиса#

В зависимости от того, какой компонент 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 добавить следующие артефакты:

  1. 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 из дистрибутива#

  1. Разархивировать дистрибутив.

  2. Открыть консоль и перейти в папку package/ дистрибутива.

  3. Собрать образы, выполнив команды:

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).

  1. Отправить образы в хранилище, выполнив команды:

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», описанный выше.

  1. Скачать необходимую версию дистрибутива.

  2. Настроить Job (дистрибутив собран с поддержкой Deploy Tools).

    Примечание — настройка заключается в указании для job параметров, описанных в разделе «Параметры установки» в таблицах «Параметры шаблонизации» и «Список и описание параметров».

  3. Запустить миграцию конфигурационных файлов — набор сценариев MIGRATION_FP_CONF.

  4. Скорректировать значения параметров шаблонизации и стендозависимых параметров.

    Примечание — значение параметра DEPLOY_TO_KUBERNETES определяет платформу контейнеризации для запуска компонентов сервиса (для установки Kubernetes и Platform V DropApp значение True).

  5. Запустить установку — сценарий OPENSHIFT_DEPLOY_FP_KUBECTL.

Автоматизированная установка по агентской схеме с использованием Deploy Tools#

Важно: Для корректной установки необходимо выполнить шаг «Предварительная настройка Deploy Tools», описанный выше.

Данный вариант развертывания позволяет одновременно с установкой дистрибутива бизнес-приложения или технологического сервиса произвести автоматическую установку компонента SRLS и создать артефакт GlobalRateLimit. Возможен вариант только с созданием артефакта GlobalRateLimit без установки компонента SRLS.

  1. Настроить Job бизнес-приложения или технологического сервиса.

    • В схему справочника конфигураций развертывания (subsystem.json) добавить секцию agents для определения конфигураций развертывания из дистрибутива SRLS:

  agents: {
    "SRLS_agent": {
        "groupId": "",
        "artifactId": "",
        "version": "",
        "fpi-name": "",
        "classifier": "",
        "packaging": "",
        ...
    }
}
  1. Запустить миграцию конфигурационных файлов, указав в поле параметров Job COMPONENTS сконфигурированный агент — набор сценариев MIGRATION_FP_CONF.

    • Настроечные параметры из дистрибутива SRLS будут подгружены в пространство конфигурирования бизнес-приложения или технологического сервиса.

  2. Скорректировать значения параметров шаблонизации и стендозависимых параметров.

    • Для создания артефакта GlobalRateLimit необходимо выставить значение True параметра шаблонизации DEPLOY_LIMITS и заполнить параметр шаблонизации endpoints в соответствии с разделом «Параметры установки» настоящего документа.

    • Если требуется установить дистрибутив в децентрализованном варианте развертывания SRLS, необходимо настроить соответствующие параметры, описанные в разделах «Параметры установки» и «Параметры установки, специфичные для выбранного варианта развертывания» настоящего документа.

    • Если установка не требуется, необходимо выставить значение False параметров шаблонизации DEPLOY_CENTR, DEPLOY_DECENTR.

  3. Запустить установку бизнес-приложения или технологического сервиса, указав в поле параметров Job COMPONENTS сконфигурированный агент — набор сценариев OPENSHIFT_DEPLOY_FP_KUBECTL.

Автоматизированная установка сервиса с использованием Synapse Installer#

  1. Скачать необходимую версию дистрибутива.

  2. Получить из дистрибутива конфигурационные файлы: default.yaml, values.yaml.

  3. Поместить полученные в пункте выше файлы в git-репозиторий со стендозависимыми параметрами.

  4. Скорректировать значения параметров шаблонизации и стендозависимых параметров.

    Примечание — значение параметра DEPLOY_TO_KUBERNETES определяет платформу контейнеризации для запуска компонентов сервиса (для установки Kubernetes и Platform V DropApp значение True).

  5. Запустить 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 необходимо:

  1. Выполнить вход в Indicator Platform V Monitor.

  2. Перейти на вкладку «Dashboards» → «Manage» (1).

  3. Нажать на кнопку «Import» (2).

    indicator-load.png

Рисунок. Вкладка «Dashboards» компонента Indicator Platform V Monitor

  1. Нажать на кнопку «Upload JSON file» (3).

    indicator-imort-json.png

Рисунок. Экран компонента Indicator Platform V Monitor, кнопка «Upload JSON file»

  1. В появившемся окне выбрать файл с dashboard.

  2. В окне выбрать источник базы данных для получения метрик «Indicator-Abyss» из выпадающего списка (4).

  3. В поле «druidtable» изменить название (srlsunimon) таблицы в базе данных Druid на требуемое (5).

indicator-options.png

Рисунок. Экран компонента Indicator Platform V Monitor для настройки загруженного dashboard

  1. Нажать на кнопку «Import».

Примеры dashboard:

dashboard-SRLS.png

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

dashboard-SRLS-operator.png

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

dashboard-SRLS-Go.png

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

dashboard-SRLS-client-metric.png

Рисунок. 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. На усмотрение пользователя может быть настроена интеграция с аналогичным по функциональности продуктом от других производителей.

  1. Интеграция с программным компонентом Объединенный мониторинг Unimon (MONA) реализована в соответствии с требованиями Unimon: компонент публикует метрики в формате Prometheus. Для артефактов Service rl-operator и RateLimiterService добавлены необходимые аннотации Prometheus с необходимыми значениями (см. выше):

  • prometheus.io.path;

  • prometheus.io.port;

  • prometheus.io.scrape.

  1. Интеграция с программным компонентом Журналирование (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

Проверка работоспособности#

  1. Для проверки работоспособности необходимо включить расширенное логирование на Egress в прикладном namespace и Ingress Gateway в namespace Rate Limit. Это можно сделать с помощью: curl -XPOST localhost:15000/logging?level=debug

  2. Включить LOG_LEVEL: debug у rate-limiter-service, изменив настройку в ConfigMap name: rls-config.

  3. Выполнить запрос к сервису, доступ которого необходимо было ограничить, и смотреть логи rate-limiter-service и ingress.

  4. Посмотреть логи 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#

  1. Убедиться, что установка SRLS в среду контейнеризации DropApp произошла успешно.

  2. Убедиться, что readiness/liveness-пробы Pods успешные и Pods по пробам периодически не перезапускаются.

  3. Убедиться, что при выполнении команды cat /etc/os-release в terminal контейнера одного из Pod, поставляемого в рамках компонента SRLS, выводится информация о базовом образе SberLinux OS Server.

Проверка работоспособности интеграции с LOGA#

  1. Убедиться, что установка SRLS произошла успешно (с параметром FLUENT_BIT_SIDECAR_ENABLED=True).

  2. Убедиться, что readiness/liveness-пробы Pods успешные и Pods по пробам периодически не перезапускаются.

Проверка работоспособности интеграции с MONA#

  1. Убедиться, что установка SRLS произошла успешно.

  2. Проверить в логах компонента Unimon-sender (часть компонента Объединенный мониторинг Unimon (MONA) продукта Platform V Monitor) наличие логов об отправке данных мониторинга SRLS в Kafka.

Откат#

Откат производится развертыванием предыдущей версии SRLS, при этом должен быть выполнен откат стендозависимых параметров (если были изменения) в хранилище параметров.

Для отката необходимо удалить ресурсы текущей версии продукта (согласно разделу «Удаление» данного документа). Следуя документу «Руководство по установке», выполнить установку необходимой версии.

Часто встречающиеся проблемы и пути их устранения#

Часто встречающиеся проблемы не обнаружены.

Чек-лист валидации установки#

  1. Namespace, в который требуется установить компонент SRLS, подключен к Istio.

  2. Cоздан ImagePullSecret для доступа к образам из среды контейнеризации к Docker-registry.

  3. Добавлен артефакт CustomResourceDefinition GlobalRateLimit.

  4. В namespace существует ServiceAccount c именем default.

  5. Параметры шаблонизации и стендозависимые параметры заполнены в соответствии с рекомендуемыми параметрами.

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-проб.

  1. Настроена интеграция «Клиентской части Unimon».

  2. В логах компонента «Клиентской части Unimon Sender» присутствуют логи об отправке данных мониторинга SRLS в Kafka.

При успешном выполнении всех пунктов можно приступать к использованию сервиса.