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

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

Шаг 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.130.66 off;139.162.144.202 off;139.162.151.10 off;139.162.151.155 off;139.162.156.102 off;139.162.157.131 off;139.162.158.79 off;139.162.159.137 off;139.162.159.244 off;139.162.163.61 off;139.162.164.41 off;139.162.166.202 off;139.162.167.19 off;139.162.167.51 off;139.162.168.17 off;139.162.170.84 off;139.162.171.141 off;139.162.172.35 off;139.162.174.220 off;139.162.174.26 off;139.162.175.71 off;139.162.176.169 off;139.162.178.148 off;139.162.179.214 off;139.162.180.37 off;139.162.182.156 off;139.162.182.20 off;139.162.184.225 off;139.162.185.243 off;139.162.186.136 off;139.162.187.138 off;139.162.188.246 off;139.162.190.22 off;139.162.190.86 off;139.162.191.89 off;85.90.246.120 off;104.200.29.36 off;104.237.151.23 off;173.230.130.253 off;173.230.138.206 off;173.230.156.200 off;173.230.158.207 off;173.255.192.83 off;173.255.193.92 off;173.255.200.80 off;173.255.214.180 off;192.155.82.205 off;23.239.11.21 off;23.92.18.13 off;23.92.30.204 off;45.33.105.35 off;45.33.33.19 off;45.33.41.31 off;45.33.64.71 off;45.33.65.37 off;45.33.72.81 off;45.33.73.43 off;45.33.80.65 off;45.33.81.109 off;45.33.88.42 off;45.33.97.86 off;45.33.98.89 off;45.56.102.9 off;45.56.104.7 off;45.56.113.41 off;45.56.114.24 off;45.56.119.39 off;50.116.35.43 off;50.116.42.181 off;50.116.43.110 off;66.175.222.237 off;66.228.58.101 off;69.164.202.55 off;72.14.181.105 off;72.14.184.100 off;72.14.191.76 off;172.104.150.243 off;139.162.190.165 off;139.162.130.123 off;139.162.132.87 off;139.162.145.238 off;139.162.146.245 off;139.162.162.71 off;139.162.171.208 off;139.162.184.33 off;139.162.186.129 off;172.104.128.103 off;172.104.128.67 off;172.104.139.37 off;172.104.146.90 off;172.104.151.59 off;172.104.152.244 off;172.104.152.96 off;172.104.154.128 off;172.104.229.59 off;172.104.250.27 off;172.104.252.112 off;45.33.115.7 off;45.56.69.211 off;45.79.16.240 off;50.116.23.110 off;85.90.246.49 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;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;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.37.176 off;130.193.38.206 off;130.193.36.183 off;130.193.37.65 off;130.193.38.168 off;84.201.133.86 off;130.193.38.251 off;130.193.37.112 off;130.193.38.248 off;130.193.36.131 off;130.193.39.165 off;130.193.38.59 off;130.193.36.60 off;130.193.39.11 off;130.193.36.171 off;130.193.39.132 off;130.193.37.111 off;130.193.39.40 off;130.193.37.248 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. Перейдите в Личный кабинет Валарм → секция События по ссылке ниже и проверьте, что атака появилась в списке.