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

Публикация приложения с использованием 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: |
          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> ниже на режим фильтрации запросов: 
              # off для отключения фильтрации
              # monitoring для обработки всех запросов без блокировки
              # safe_blocking для блокировки только тех вредоносных запросов,
              # которые отправлены с IP-адресов из серого списка
              # block для обработки всех запросов и блокировки вредоносных
              wallarm_mode <WALLARM_MODE>;
              # wallarm_application 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:3.6.2-1
              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"
              # Объем оперативной памяти в ГБ для записи данных по аналитике запросов;
              # рекомендуемое значение — 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. Перейдите в Консоль управления Вебмониторэкс → секция События и проверьте, что атака появилась в списке.