Перейти к содержанию

Публикация приложения с использованием Kubernetes-манифестов

Требования

  • Локальный или облачный (EKS, GKE, AKE и т.д.) кластер любой версии Kubernetes

  • Приложение, опубликованное в Kubernetes с использованием манифестов

  • Доступность pod'а из сети Интернет или других потенциально опасных ресурсов

  • Ingress‑контроллер или внешний балансировщик нагрузки передает публичный IP‑адрес подключающегося клиента в заголовке X-Forwarded-For

  • Аккаунт в Консоли управления Вебмониторэкс

  • Email и пароль пользователя с ролью Деплой, который добавлен в аккаунт вашей компании в Консоли управления Вебмониторэкс. Для добавления пользователя используйте инструкцию

Установка

  1. Создайте ConfigMap Вебмониторэкс.

  2. Обновите описание объекта Deployment в Kubernetes.

  3. Обновите описание объекта Service в Kubernetes.

  4. Опубликуйте обновленное приложение в Kubernetes.

  5. Протестируйте sidecar‑контейнер Вебмониторэкс.

Если вы используете несколько нод Вебмониторэкс

Все ноды Вебмониторэкс, установленные в вашей инфраструктуре, должны иметь одинаковые версии.

Перед установкой дополнительной ноды убедитесь, что ее версия совпадает с версией уже установленных модулей. Если версии модулей устарели или начинают устаревать (3.6 и ниже), рекомендуем обновить все модули до последней версии.

Версия установленной ноды указана в шаблоне Deployment → секция spec.template.spec.containersimage контейнера Вебмониторэкс.

Шаг 1: Создание ConfigMap Вебмониторэкс

  1. Создайте новый манифест 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. Обновите значения параметров, следуя комментариям к коду.

Шаг 2: Обновление объекта Deployment в Kubernetes

  1. Перейдите к манифестам 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
    
  2. Скопируйте в шаблон следующие элементы:

    • В секцию 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. Обновите значения параметров, следуя комментариям к коду.

Шаг 3: Обновление объекта Service в Kubernetes

  1. Вернитесь к манифестам 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
    
  2. Обновите значение 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‑контейнера Вебмониторэкс

  1. Получите список pod'ов, используя команду:

    kubectl get pods
    

    Количество контейнеров в pod'е должно увеличиться, статус pod'а должен быть Running.

    NAME                       READY   STATUS    RESTARTS   AGE
    mychart-856f957bbd-cr4kt   2/2     Running   0          3m48s
    
  2. Перейдите в Консоль управления Вебмониторэкс → секция Ноды и убедитесь, что в списке появился новый элемент. Созданная нода используется для фильтрации запросов к вашему приложению.

  3. Выполните тестовую атаку на адрес вашего приложения, как описано в документации.

  4. Перейдите в Консоль управления Вебмониторэкс → секция События и проверьте, что атака появилась в списке.