Перейти к содержимому

Управление правилами файрвола для балансировщиков нагрузки

При публикации приложения через балансировщик нагрузки (LoadBalancer) может потребоваться открыть входящий трафик на один или несколько портов балансировщика с помощью правил файрвола.

С помощью этого руководства вы создадите несколько типов балансировщиков для тестового приложения, а также изучите автоматически созданные правила файрвола.

Чтобы узнать, как работают правила:

  1. Подготовьте окружение для работы с кластером Managed Kubernetes.

  2. (опционально) Узнайте, как еще можно работать с правилами файрвола:

    1. Измените настройки правил для уже развернутого балансировщика.
  1. Создайте кластер Managed Kubernetes с публичным эндпоинтом и группу узлов для него.

  2. Создайте NAT-шлюз для подсети, в которой будет развернут кластер Managed Kubernetes.

  3. Для прохождения руководства вам понадобится устройство, поддерживающее работу с командной строкой. Используйте личный компьютер или создайте промежуточную ВМ в той же сети, где расположен кластер Managed Kubernetes.

  1. Подключитесь к терминалу на вашем компьютере или к промежуточной ВМ.

  2. Установите и настройте утилиту MWS CLI:

  3. Установите утилиту командной строки kubectl.

  4. Получите kubeconfig:

    bash
    mws mk8s get-kubeconfig <имя кластера>
  5. Убедитесь, что кластер доступен:

    bash
    kubectl cluster-info

    Если конфигурация настроена правильно, вы получите такой ответ:

    bash
    Kubernetes control plane is running at https://<IP-адрес кластера>
    KubeDNS is running at https://<IP-адрес кластера>/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
  1. Создайте файл nginx-deployment.yaml, содержащий манифест для развертывания тестового приложения:

    yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-deployment
    labels:
    app: nginx
    spec:
    replicas: 1
    selector:
    matchLabels:
    app: nginx
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    resources:
    requests:
    memory: "64Mi"
    cpu: "250m"
    limits:
    memory: "128Mi"
    cpu: "500m"
    ---
    apiVersion: v1
    kind: Service
    metadata:
    name: nginx-service
    spec:
    selector:
    app: nginx
    ports:
    - protocol: TCP
    port: 80
    targetPort: 80
    type: ClusterIP
  2. Примените манифест:

    bash
    kubectl apply -f nginx-deployment.yaml
  3. Убедитесь, что под приложения запущен и работает:

    bash
    kubectl get pods -l app=nginx

    Ожидаемый результат:

    bash
    NAME READY STATUS RESTARTS AGE
    nginx-deployment-dc7b9b9d6-ddd7v 1/1 Running 0 28m

Подготовьте манифест для балансировщика нагрузки. Выберите нужный вам вариант в зависимости от типа доступа: из внутренней сети или из интернета.

  • Внутренний доступ
  • Внешний доступ для определенных адресов
  • Внешний доступ для всех адресов
  1. Определите подсеть, для IP-адресов которой нужно открыть доступ к балансировщику.

    В этом примере диапазон IP-адресов подсети — 10.0.0.0/8.

  2. Зарезервируйте внутренний статический IP-адрес с именем lb-internal-ip в подсети, указанной при создании кластера Managed Kubernetes. В этом примере используется IP-адрес 192.168.0.99.

  3. Создайте файл lb-internal.yaml, содержащий манифест для внутреннего балансировщика:

    yaml
    apiVersion: v1
    kind: Service
    metadata:
    name: lb-internal
    annotations:
    mk8s.mws.ru/load-balancer-internal-ip-name: "lb-internal-ip"
    namespace: default
    spec:
    type: LoadBalancer
    loadBalancerSourceRanges:
    - 10.0.0.0/8
    selector:
    app: nginx
    ports:
    - name: http
    protocol: TCP
    port: 80
    targetPort: 80
  4. Примените манифест:

    bash
    kubectl apply -f lb-internal.yaml
  5. Убедитесь, что балансировщик успешно создан:

    bash
    kubectl get svc,endpoints lb-internal -n default

    Ожидаемый результат:

    bash
    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    service/lb-internal LoadBalancer 10.222.71.208 192.168.0.99 80:32161/TCP 119s
    NAME ENDPOINTS AGE
    endpoints/lb-internal 10.222.13.164:80 119s

    В этом примере:

    • CLUSTER-IP (10.222.71.208) — внутренний IP-адрес сервиса;
    • EXTERNAL-IP (192.168.0.99) — внутренний целевой IP-адрес балансировщика, доступ на этот адрес разрешен из подсети 10.0.0.0/8;
    • ENDPOINTS (10.222.13.164:80) — внутренний IP-адрес и порт пода, на котором развернуто тестовое приложение.
  1. В веб-консоли выберите нужный проект.
  2. В списке сервисов выберите VPCСети.
  3. Выберите сеть, в которой расположен кластер Managed Kubernetes и перейдите на вкладку Правила firewall.

В открывшемся списке вы увидите новые правила для балансировщика, созданного на предыдущем шаге:

  • правила, разрешающие доступ согласно настройкам балансировщика;

Вы можете изменить набор правил для балансировщика с помощью утилиты kubectl, например добавить новый диапазон IP-адресов. После внесения изменений правила файрвола будут обновлены автоматически.

  • Чтобы изменить список разрешенных IP-адресов для внешнего балансировщика:

    bash
    kubectl patch svc lb-external \
    -n default \
    --type merge \
    -p '{"spec":{"loadBalancerSourceRanges":["8.8.8.8/32","178.248.238.27/32"]}}'
  • Чтобы разрешить доступ со всех IP-адресов:

    bash
    kubectl patch svc lb-external \
    -n default \
    --type merge \
    -p '{"spec":{"loadBalancerSourceRanges":["0.0.0.0/0"]}}'
  • Чтобы отредактировать манифест балансировщика и изменить список правил вручную:

    bash
    kubectl edit svc lb-external -n default

При необходимости вы можете создать правила файрвола вручную. Такие правила не будут актуализироваться автоматически при обновлении кластера или сервиса.

  1. В веб-консоли выберите нужный проект.

  2. В списке сервисов выберите VPCСети.

  3. Выберите сеть, в которой расположен кластер Managed Kubernetes.

  4. Перейдите на вкладку Правила firewall и нажмите кнопку Создать правило.

  5. Укажите параметры правила:

    • Направление трафика, для которого будет применяться правило, — Ingress.
    • Действие в рамках правила — Allow.
    • Приоритет правила — 1000.
    • Источник трафика — IP-адреса или подсети, трафик из которых будет разрешать правило. Чтобы разрешить доступ с любых адресов в интернете, укажите 0.0.0.0/0.
    • Назначение трафика — один или несколько внутренних IP-адресов узлов кластера Managed Kubernetes в формате <внутренний IP-адрес узла>/32. Узнать внутренние IP-адреса узлов можно с помощью команды kubectl get node -o wide, поле INTERNAL-IP.
    • Протокол и порт — TCP:80.
  6. Включите опцию Активировать правило после сохранения.

  7. Нажмите кнопку Создать.

Ресурсы, созданные в руководстве, тарифицируются. Если вы больше не планируете использовать их:

  1. Если вы создавали виртуальную машину, удалите ее.