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

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

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

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

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

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

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

Шаг 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_instance 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.4.1-1
              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"
              # Объем оперативной памяти в ГБ для записи данных по аналитике запросов;
              # рекомендуемое значение — 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. Перейдите в Консоль управления Валарм → секция События по ссылке ниже и проверьте, что атака появилась в списке.