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

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

Требования

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

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

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

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

  • Аккаунт в Личном кабинете Валарм для EU‑облака или RU‑облака

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

Установка

  1. Создайте ConfigMap Валарм.

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

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

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

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

Если Валарм WAF уже установлен

Если вы устанавливаете Валарм WAF вместо существующего Валарм WAF или дублируете установку, используйте версию существующего Валарм WAF или обновите версии всех установок до последней.

Версия установленного Валарм WAF указана в конфигурационном файле Helm chart → wallarm.image.tag.

  • Если указана версия 2.14, используйте текущую инструкцию.
  • Если указана версия 2.12, используйте инструкцию для 2.12 или увеличьте версии образов во всех установках до 2.14 и следуйте текущей инструкции.
  • Если указана неподдерживаемая версия (2.10 или ниже), увеличьте версии образов во всех установках до 2.14 и следуйте текущей инструкции.

Более подробная информация о поддержке версий доступна в политике версионирования WAF‑ноды.

Шаг 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‑адреса для EU‑облака
      139.162.148.184 off;139.162.151.155 off;139.162.159.244 off;139.162.151.10 off;139.162.159.137 off;39.162.157.131 off;139.162.144.202 off;139.162.130.66 off;139.162.158.79 off;139.162.156.102 off;85.90.246.120 off;172.104.128.215 off;139.162.174.26 off;139.162.182.20 off;139.162.190.22 off;139.162.168.17 off;139.162.167.19 off;139.162.170.84 off;139.162.191.89 off;139.162.176.169 off;139.162.184.225 off;139.162.185.243 off;172.104.143.34 off;139.162.178.148 off;139.162.186.136 off;139.162.163.61 off;139.162.171.141 off;139.162.179.214 off;139.162.187.138 off;139.162.164.41 off;139.162.172.35 off;139.162.180.37 off;139.162.188.246 off;172.104.139.18 off;172.104.152.28 off;139.162.177.83 off;172.104.240.115 off;172.105.64.135 off;139.162.153.16 off;172.104.241.162 off;139.162.167.48 off;172.104.233.100 off;172.104.157.26 off;172.105.65.182 off;172.104.138.5 off;172.104.150.243 off;139.162.190.165 off;139.162.166.202 off;139.162.174.220 off;139.162.182.156 off;139.162.190.86 off;139.162.167.51 off;139.162.175.71 off;172.104.152.54 off;172.104.151.59 off;172.104.128.67 off;172.104.152.96 off;139.162.145.238 off;172.104.128.103 off;172.104.139.37 off;139.162.184.33 off;139.162.186.129 off;172.104.154.128 off;172.104.146.90 off;172.104.128.44 off;85.90.246.49 off;139.162.146.245 off;139.162.171.208 off;172.104.252.112 off;139.162.132.87 off;139.162.162.71 off;172.104.229.59 off;172.104.152.244 off;172.104.250.27 off;139.162.130.123 off; 178.32.42.221 off;46.105.75.84 off;51.254.85.145 off;188.165.30.182 off;188.165.136.41 off;188.165.137.10 off;54.36.135.252 off;54.36.135.253 off;54.36.135.254 off;54.36.135.255 off;54.36.131.128 off;54.36.131.129 off;
      # IP‑адреса для RU‑облака
      139.162.133.137 off;139.162.146.186 off;172.105.83.238 off;172.105.84.7 off;172.105.95.224 off;172.105.89.44 off;172.105.90.179 off;172.105.84.20 off;172.105.93.66 off;172.105.75.228 off;172.105.95.226 off;139.162.181.242 off;172.105.67.64 off;172.105.83.226 off;172.105.89.55 off;172.105.84.201 off;172.105.90.189 off;172.105.91.75 off;172.105.81.224 off;172.105.92.7 off;172.105.95.230 off;172.105.72.250 off;130.193.36.60 off;130.193.37.176 off;130.193.39.11 off;130.193.38.206 off;130.193.38.248 off;130.193.36.171 off;130.193.36.131 off;130.193.39.132 off;130.193.36.183 off;130.193.39.165 off;130.193.37.111 off;130.193.39.40 off;130.193.38.59 off;130.193.37.248 off;130.193.37.65 off;130.193.38.33 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;
        {{ if eq .Values.wallarm.enable_ip_blocking "true" }}
        wallarm_acl default;
        {{ end }}
        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
  1. Скопируйте в шаблон следующие элементы:
    • в секцию 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

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

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

  1. Вернитесь к директории с файлами Helm Charts и откройте файл values.yaml.
  1. Скопируйте в файл values.yaml описание объекта wallarm ниже и измените значения параметров, следуя комментариям к коду.
wallarm:
  image:
     repository: wallarm/node
     tag: 2.14
     pullPolicy: Always
  # Конечная точка Валарм API:
  # wallarm_host_api: "api.wallarm.com" для EU‑облака
  # wallarm_host_api: "api.wallarm.ru" для RU‑облака
  wallarm_host_api: "api.wallarm.com"
  # Имя пользователя с ролью "Деплой"
  deploy_username: "username"
  # Пароль пользователя с ролью "Деплой"
  deploy_password: "password"
  # Порт, по которому контейнер получает входящие запросы;
  # значение должно совпадать с ports.containerPort
  # в описании основного контейнера вашего приложения
  app_container_port: 80
  # Режим фильтрации запросов: 
  # "off" для отключения фильтрации
  # "monitoring" для обработки всех запросов без блокировки
  # "block" для обработки всех запросов и блокировки вредоносных
  mode: "block"
  # Объем оперативной памяти в ГБ для записи данных по аналитике запросов; 
  # рекомендуемое значение — 75% от общей памяти сервера
  tarantool_memory_gb: 2
  1. Убедитесь, что файл values.yaml валидный, используя команду:
helm lint
  1. Обновите 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. Перейдите в Личный кабинет Валарм → секция Ноды по ссылке ниже и убедитесь, что в списке появился новый элемент. Созданная WAF‑нода используется для фильтрации запросов к вашему приложению.

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

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