Публикация приложения с использованием Helm Charts¶
Требования¶
-
Локальный или облачный (например, EKS, GKE, AKE) кластер любой версии Kubernetes
-
Приложение, опубликованное в Kubernetes с использованием Helm Charts
-
Доступность pod'а из сети Интернет или других потенциально опасных ресурсов
-
Ingress‑контроллер или внешний балансировщик нагрузки передает публичный IP‑адрес подключающегося клиента в заголовке
X-Forwarded-For
-
Аккаунт в Консоли управления Вебмониторэкс
-
Имя и пароль пользователя с ролью Деплой, который добавлен в аккаунт вашей компании в Консоли управления Вебмониторэкс. Для добавления пользователя используйте инструкцию
Установка¶
-
Создайте ConfigMap Вебмониторэкс.
-
Обновите описание объекта
Deployment
в Kubernetes. -
Обновите описание объекта
Service
в Kubernetes. -
Обновите конфигурационный файл Helm Charts.
-
Протестируйте sidecar‑контейнер Вебмониторэкс.
Если вы используете несколько нод Вебмониторэкс
Все ноды Вебмониторэкс, установленные в вашей инфраструктуре, должны иметь одинаковые версии.
Перед установкой дополнительной ноды убедитесь, что ее версия совпадает с версией уже установленных модулей. Если версии модулей устарели или начинают устаревать (3.6
и ниже), рекомендуем обновить все модули до последней версии.
Версия установленной ноды Вебмониторэкс указана в конфигурационном файле Helm chart → wallarm.image.tag
.
Шаг 1: Создание ConfigMap Вебмониторэкс¶
Перейдите к директории с файлами Helm Charts → папка templates
и создайте шаблон wallarm-sidecar-configmap.yaml
со следующим содержимым:
apiVersion: v1
kind: ConfigMap
metadata:
name: wallarm-sidecar-nginx-conf
data:
default: |
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
server_name localhost;
root /usr/share/nginx/html;
index index.html index.htm;
wallarm_mode {{ .Values.wallarm.mode | quote }};
# wallarm_application 1;
set_real_ip_from 0.0.0.0/0;
real_ip_header X-Forwarded-For;
location / {
proxy_pass http://localhost:{{ .Values.wallarm.app_container_port }};
include proxy_params;
}
}
Шаг 2: Обновление объекта Deployment в Kubernetes¶
-
Вернитесь к директории с файлами Helm Charts → папка
templates
и откройте шаблон с описанием объектаDeployment
. Если в приложении несколько объектовDeployment
, откройте тот, в котором описаны pod'ы, доступные из сети Интернет. Например:apiVersion: apps/v1 kind: Deployment metadata: name: myapp spec: selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: # Описание основного контейнера вашего приложения - name: myapp image: <Image> resources: limits: memory: "128Mi" cpu: "500m" ports: # Порт, по которому контейнер приложения получает входящие запросы - containerPort: 8080
-
Скопируйте в шаблон следующие элементы:
- В секцию
spec.template.metadata.annotations
аннотациюchecksum/config
для обновления запущенных pod'ов после изменения ConfigMap Вебмониторэкс - В секцию
spec.template.spec.containers
описание sidecar‑контейнераwallarm
- В секцию
spec.template.spec.volumes
описание ресурсаwallarm-nginx-conf
Ниже приведен пример шаблона с добавленными элементами. Элементы для копирования обозначены комментарием
элемент Вебмониторэкс
.apiVersion: apps/v1 kind: Deployment metadata: annotations: # Элемент Вебмониторэкс: аннотация для обновления запущенных pod'ов после изменения ConfigMap Вебмониторэкс checksum/config: '{{ include (print $.Template.BasePath "/wallarm-sidecar-configmap.yaml") . | sha256sum }}' name: myapp spec: selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: # Элемент Вебмониторэкс: описание sidecar‑контейнера Вебмониторэкс - name: wallarm image: {{ .Values.wallarm.image.repository }}:{{ .Values.wallarm.image.tag }} imagePullPolicy: {{ .Values.wallarm.image.pullPolicy | quote }} env: - name: WALLARM_API_HOST value: {{ .Values.wallarm.wallarm_host_api | quote }} - name: DEPLOY_USER value: {{ .Values.wallarm.deploy_username | quote }} - name: DEPLOY_PASSWORD value: {{ .Values.wallarm.deploy_password | quote }} - name: DEPLOY_FORCE value: "true" - name: TARANTOOL_MEMORY_GB value: {{ .Values.wallarm.tarantool_memory_gb | quote }} ports: - name: http # Порт, по которому sidecar‑контейнер Вебмониторэкс получает запросы от объекта Service containerPort: 80 volumeMounts: - mountPath: /etc/nginx/sites-enabled readOnly: true name: wallarm-nginx-conf # Описание основного контейнера вашего приложения - name: myapp image: <Image> resources: limits: memory: "128Mi" cpu: "500m" ports: # Порт, по которому контейнер приложения получает входящие запросы - containerPort: 8080 volumes: # Элемент Вебмониторэкс: описание ресурса wallarm-nginx-conf - name: wallarm-nginx-conf configMap: name: wallarm-sidecar-nginx-conf items: - key: default path: default
- В секцию
Шаг 3: Обновление объекта Service в Kubernetes¶
-
Вернитесь к директории с файлами Helm Charts → папка
templates
и откройте шаблон с описанием объектаService
, который соответствует объектуDeployment
из шага 2. Например:apiVersion: v1 kind: Service metadata: name: myapp spec: selector: app: myapp ports: - port: {{ .Values.service.port }} # Порт sidecar‑контейнера Вебмониторэкс, на который объект Service перенаправляет запросы; # значение должно совпадать с ports.containerPort в описании sidecar‑контейнера Вебмониторэкс targetPort: 8080
-
Обновите значение
ports.targetPort
в соответствии сports.containerPort
из описания sidecar‑контейнера Вебмониторэкс. Например:... - port: {{ .Values.service.port }} # Порт sidecar‑контейнера Вебмониторэкс # значение должно совпадать с ports.containerPort в описании sidecar‑контейнера Вебмониторэкс targetPort: 80
Шаг 4: Обновление конфигурационного файла Helm Charts¶
-
Вернитесь к директории с файлами Helm Charts и откройте файл
values.yaml
. -
Скопируйте в файл
values.yaml
описание объектаwallarm
ниже и измените значения параметров, следуя комментариям к коду.wallarm: image: repository: wallarm/node tag: 3.6.2-1 pullPolicy: Always # Эндпоинт Вебмониторэкс API wallarm_host_api: "api.wallarm.ru" # Имя пользователя с ролью "Деплой" deploy_username: "username" # Пароль пользователя с ролью "Деплой" deploy_password: "password" # Порт, по которому контейнер получает входящие запросы; # значение должно совпадать с ports.containerPort # в описании основного контейнера вашего приложения app_container_port: 80 # Режим фильтрации запросов: # "off" для отключения фильтрации # "monitoring" для обработки всех запросов без блокировки # "safe_blocking" для блокировки только тех вредоносных запросов, # которые отправлены с IP-адресов из серого списка # "block" для обработки всех запросов и блокировки вредоносных mode: "block" # Объем оперативной памяти в ГБ для записи данных по аналитике запросов; # рекомендуемое значение — 75% от общей памяти сервера tarantool_memory_gb: 2
-
Убедитесь, что файл
values.yaml
валидный, используя команду:helm lint
-
Обновите Helm Charts в Kubernetes, используя команду:
helm upgrade <RELEASE> <CHART>
<RELEASE>
— название существующего Helm Chart<CHART>
— путь до директории с файлами Helm Charts
Объект NetworkPolicy в Kubernetes
Если вы также используете объект NetworkPolicy
в Kubernetes, убедитесь, что он обрабатывает трафик, поступающий с порта sidecar‑контейнера Вебмониторэкс.
Шаг 5: Тестирование sidecar‑контейнера Вебмониторэкс¶
-
Получите список pod'ов, используя команду:
kubectl get pods
Количество контейнеров в pod'е должно увеличиться, статус pod'а должен быть Running.
NAME READY STATUS RESTARTS AGE mychart-856f957bbd-cr4kt 2/2 Running 0 3m48s
-
Перейдите в Консоль управления Вебмониторэкс → секция Ноды и убедитесь, что в списке появился новый элемент. Созданная нода используется для фильтрации запросов к вашему приложению.
-
Выполните тестовую атаку на адрес вашего приложения, как описано в документации.
-
Перейдите в Консоль управления Вебмониторэкс → секция События и проверьте, что атака появилась в списке.