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

Публикация приложения с использованием Helm Charts

Требования

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

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

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

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

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

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

Установка

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

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

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

  4. Обновите конфигурационный файл Helm Charts.

  5. Протестируйте 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: |
    geo $remote_addr $wallarm_mode_real {
      default {{ .Values.wallarm.mode | quote }};
      # 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 / {
                proxy_pass http://localhost:{{ .Values.wallarm.app_container_port }};
                include proxy_params;
        }
    }

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

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

    • В секцию 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: WALLARM_ACL_ENABLE
                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

  1. Вернитесь к директории с файлами 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
    
  2. Обновите значение ports.targetPort в соответствии с ports.containerPort из описания sidecar‑контейнера Вебмониторэкс. Например:

    ...
      - port: {{ .Values.service.port }}
        # Порт sidecar‑контейнера Вебмониторэкс
        # значение должно совпадать с ports.containerPort в описании sidecar‑контейнера Вебмониторэкс
        targetPort: 80
    

Шаг 4: Обновление конфигурационного файла Helm Charts

  1. Вернитесь к директории с файлами Helm Charts и откройте файл values.yaml.

  2. Скопируйте в файл values.yaml описание объекта wallarm ниже и измените значения параметров, следуя комментариям к коду.

    wallarm:
      image:
         repository: wallarm/node
         tag: 2.18.1-5
         pullPolicy: Always
      # Эндпоинт Вебмониторэкс API
      wallarm_host_api: "api.wallarm.ru"
      # Имя пользователя с ролью "Деплой"
      deploy_username: "username"
      # Пароль пользователя с ролью "Деплой"
      deploy_password: "password"
      # Порт, по которому контейнер получает входящие запросы;
      # значение должно совпадать с ports.containerPort
      # в описании основного контейнера вашего приложения
      app_container_port: 80
      # Режим фильтрации запросов: 
      # "off" для отключения фильтрации
      # "monitoring" для обработки всех запросов без блокировки
      # "block" для обработки всех запросов и блокировки вредоносных
      mode: "block"
      # Объем оперативной памяти в ГБ для записи данных по аналитике запросов; 
      # рекомендуемое значение — 75% от общей памяти сервера
      tarantool_memory_gb: 2
      # Передайте значение "true", чтобы включить блокировку запросов по IP
      enable_ip_blocking: "false"
    
  3. Убедитесь, что файл values.yaml валидный, используя команду:

    helm lint
    
  4. Обновите Helm Charts в Kubernetes, используя команду:

    helm upgrade <RELEASE> <CHART>
    
    • <RELEASE> — название существующего Helm Chart
    • <CHART> — путь до директории с файлами Helm Charts

Объект 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. Перейдите в Консоль управления Вебмониторэкс → секция События и проверьте, что атака появилась в списке.