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

Публикация приложения с использованием 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.

  • Если указана версия 3.0.x, используйте текущую инструкцию.
  • Если указана версия 2.18.x, используйте инструкцию для 2.18 или увеличьте версии образов во всех установках до 3.0.0-3 и следуйте текущей инструкции.
  • Если указана версия 2.16.x или ниже, увеличьте версии образов во всех установках до 3.0.0-3 и следуйте текущей инструкции. Поддержка установленных версий скоро будет прекращена или уже прекращена.

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

Шаг 1: Создание ConfigMap Валарм

Перейдите к директории с файлами Helm Charts > папка templates и создайте шаблон wallarm-sidecar-configmap.yaml со следующим содержимым:

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 {{ .Values.wallarm.mode | quote }};
          # 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
  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‑контейнера Валарм. Например:
...
  - port: {{ .Values.service.port }}
    # Wallarm sidecar container port; 
    # the value must be identical to ports.containerPort
    # in definition of Wallarm sidecar container
    targetPort: 80

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

  1. Вернитесь к директории с файлами Helm Charts и откройте файл values.yaml.
  1. Скопируйте в файл values.yaml описание объекта wallarm ниже и измените значения параметров, следуя комментариям к коду.
wallarm:
  image:
     repository: wallarm/node
     tag: 3.2.0-1
     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" для обработки всех запросов без блокировки
  # "safe_blocking" для блокировки только тех вредоносных запросов,
  # которые отправлены с IP-адресов из серого списка
  # "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. Перейдите в Личный кабинет Валарм → секция События по ссылке ниже и проверьте, что атака появилась в списке.