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

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

Требования

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

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

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

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

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

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

Установка

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

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

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

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

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

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

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

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

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

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

Шаг 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‑адреса для 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 / {
                # Замените <APP_CONTAINER_PORT> ниже на порт,
                # по которому контейнер получает входящие запросы; 
                # значение должно совпадать с ports.containerPort в описании основного контейнера вашего приложения
                proxy_pass http://localhost:<APP_CONTAINER_PORT>; 
                include proxy_params;
        }
    }
  1. Обновите значения параметров, следуя комментариям к коду.

Шаг 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
  1. Скопируйте в шаблон следующие элементы:
    • в секцию 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.14
        imagePullPolicy: Always
        env:
        # Конечная точка Валарм API:
        # "api.wallarm.com" для EU‑облака
        # "api.wallarm.ru" для RU‑облака
        - name: WALLARM_API_HOST 
          value: "api.wallarm.com"
        # Имя пользователя с ролью "Деплой"
        - name: DEPLOY_USER
          value: "username"
        # Пароль пользователя с ролью "Деплой"
        - name: DEPLOY_PASSWORD
          value: "password"
        - name: DEPLOY_FORCE
          value: "true"
        - 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

  1. Вернитесь к манифестам Kubernetes и откройте шаблон с описанием объекта 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: Публикация обновленного приложения в 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. Перейдите в Личный кабинет Валарм → секция Ноды по ссылке ниже и убедитесь, что в списке появился новый элемент. Созданная WAF‑нода используется для фильтрации запросов к вашему приложению.

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

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