Публикация приложения с использованием Kubernetes-манифестов¶
Требования¶
-
Локальный или облачный (EKS, GKE, AKE и т.д.) кластер любой версии Kubernetes
-
Приложение, опубликованное в Kubernetes с использованием манифестов
-
Доступность pod'а из сети Интернет или других потенциально опасных ресурсов
-
Ingress‑контроллер или внешний балансировщик нагрузки передает публичный IP‑адрес подключающегося клиента в заголовке
X-Forwarded-For
-
Аккаунт в Консоли управления Вебмониторэкс
-
Email и пароль пользователя с ролью Деплой, который добавлен в аккаунт вашей компании в Консоли управления Вебмониторэкс. Для добавления пользователя используйте инструкцию
Установка¶
-
Создайте ConfigMap Вебмониторэкс.
-
Обновите описание объекта
Deployment
в Kubernetes. -
Обновите описание объекта
Service
в Kubernetes. -
Опубликуйте обновленное приложение в Kubernetes.
-
Протестируйте sidecar‑контейнер Вебмониторэкс.
Если вы используете несколько нод Вебмониторэкс
Все ноды Вебмониторэкс, установленные в вашей инфраструктуре, должны иметь одинаковые версии.
Перед установкой дополнительной ноды убедитесь, что ее версия совпадает с версией уже установленных модулей. Если версии модулей устарели или начинают устаревать (3.6
и ниже), рекомендуем обновить все модули до последней версии.
Версия установленной ноды указана в шаблоне Deployment → секция spec.template.spec.containers
→ image
контейнера Вебмониторэкс.
Шаг 1: Создание ConfigMap Вебмониторэкс¶
-
Создайте новый манифест Kubernetes или обновите существующий со следующими настройками NGINX для sidecar‑контейнера Вебмониторэкс:
apiVersion: v1 kind: ConfigMap metadata: name: wallarm-sidecar-nginx-conf data: default: | geo $remote_addr $wallarm_mode_real { # Замените <WALLARM_MODE> ниже на режим фильтрации запросов: # off для отключения фильтрации # monitoring для обработки всех запросов без блокировки # block для обработки всех запросов и блокировки вредоносных default <WALLARM_MODE>; # IP‑адреса Сканера Вебмониторэкс 130.193.36.60 off; 130.193.37.248 off; 130.193.39.11 off; 130.193.39.40 off; 139.162.146.186 off; 172.105.67.64 off; 172.105.72.250 off; 172.105.75.228 off; 172.105.81.224 off; 172.105.83.226 off; 172.105.83.238 off; 172.105.84.20 off; 172.105.84.201 off; 172.105.84.7 off; 172.105.89.44 off; 172.105.89.55 off; 172.105.90.179 off; 172.105.90.189 off; 172.105.91.75 off; 172.105.92.7 off; 172.105.93.66 off; 172.105.95.224 off; 172.105.95.226 off; 172.105.95.230 off; 192.53.121.142 off; 192.46.211.242 off; 139.162.8.219 off; 45.79.238.128 off; 45.33.120.132 off; 172.104.244.176 off; 45.79.160.150 off; 45.79.72.89 off; 194.195.212.130 off; 80.85.85.222 off; 172.105.111.179 off; 172.104.189.111 off; 139.177.182.124 off; 173.230.128.167 off; 69.164.219.109 off; 80.85.87.179 off; 45.79.26.118 off; 192.46.211.128 off; 172.105.170.217 off; 74.207.245.45 off; } 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 $wallarm_mode_real; # wallarm_instance 1; set_real_ip_from 0.0.0.0/0; real_ip_header X-Forwarded-For; location / { # Замените <APP_CONTAINER_PORT> ниже на порт, # по которому контейнер получает входящие запросы; # значение должно совпадать с ports.containerPort в описании основного контейнера вашего приложения proxy_pass http://localhost:<APP_CONTAINER_PORT>; include proxy_params; } }
-
Обновите значения параметров, следуя комментариям к коду.
Шаг 2: Обновление объекта Deployment в Kubernetes¶
-
Перейдите к манифестам Kubernetes и откройте шаблон с описанием объекта
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.spec.containers
описание sidecar‑контейнераwallarm
- В секцию
spec.template.spec.volumes
описание ресурсаwallarm-nginx-conf
Ниже приведен пример шаблона с добавленными элементами. Элементы для копирования обозначены комментарием
элемент Вебмониторэкс
.apiVersion: apps/v1 kind: Deployment metadata: name: myapp spec: selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: # Элемент Вебмониторэкс: описание sidecar‑контейнера Вебмониторэкс - name: wallarm image: wallarm/node:2.18.1-5 imagePullPolicy: Always env: # Эндпоинт Вебмониторэкс API: - name: WALLARM_API_HOST value: "api.wallarm.ru" # Имя пользователя с ролью "Деплой" - name: DEPLOY_USER value: "username" # Пароль пользователя с ролью "Деплой" - name: DEPLOY_PASSWORD value: "password" - name: DEPLOY_FORCE value: "true" # Флаг для включения блокировки запросов по IP - name: WALLARM_ACL_ENABLE value: "true" # Объем оперативной памяти в ГБ для записи данных по аналитике запросов; # рекомендуемое значение — 75% от общей памяти сервера - name: TARANTOOL_MEMORY_GB value: "2" 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¶
-
Вернитесь к манифестам Kubernetes и откройте шаблон с описанием объекта
Service
, который соответствует объектуDeployment
из шага 2. Например:apiVersion: v1 kind: Service metadata: name: myapp labels: run: myapp spec: type: NodePort ports: - port: 80 targetPort: 8080 protocol: TCP name: http selector: run: myapp
-
Обновите значение
ports.targetPort
в соответствии сports.containerPort
из описания sidecar‑контейнера Вебмониторэкс. Например:... ports: - port: 80 targetPort: 80 protocol: TCP name: http selector: run: myapp
Шаг 4: Публикация обновленного приложения в Kubernetes¶
Опубликуйте приложение в Kubernetes, используя обновленные манифесты.
Объект 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
-
Перейдите в Консоль управления Вебмониторэкс → секция Ноды и убедитесь, что в списке появился новый элемент. Созданная нода используется для фильтрации запросов к вашему приложению.
-
Выполните тестовую атаку на адрес вашего приложения, как описано в документации.
-
Перейдите в Консоль управления Вебмониторэкс → секция События и проверьте, что атака появилась в списке.