Облачная платформаВсе платформы

Настройка сетевых политик для ограничения доступа к Pod

Язык статьи: Русский
Показать оригинал
Страница переведена автоматически и может содержать неточности. Рекомендуем сверяться с английской версией.

Сетевые политики разрабатываются Kubernetes для ограничения доступа к pod. Как межсетевой экран на уровне приложений, сетевые политики повышают безопасность сети. Возможности, поддерживаемые сетевыми политиками, зависят от возможностей сетевых дополнений Кластера.

По умолчанию, если в namespace нет ни одной политики, pod в этом namespace принимают трафик из любого источника и отправляют трафик в любой пункт назначения.

Для сетевых политик доступны следующие селекторы:

  • namespaceSelector : выбирает конкретные пространства имён, для которых все pod должны быть разрешены в качестве источников ingress или пунктов назначения egress.
  • podSelector : выбирает конкретные pod в том же namespace, что и сетевая политика, которые должны быть разрешены в качестве источников ingress или пунктов назначения egress.
  • ipBlock : выбирает конкретные блоки CIDR, которые разрешаются в качестве источников ingress или пунктов назначения egress.

Взаимосвязь между сетевыми политиками и типами Кластеров

Тип Кластера

CCE Standard Кластер

CCE Standard Кластер

CCE Turbo Кластер

Модель сети

Туннель

VPC

Cloud Native Network 2.0

Сетевые политики

Включено по умолчанию

Отключено по умолчанию (Чтобы использовать сетевые политики, включите DataPlane V2 при создании кластера.)

Отключено по умолчанию (Чтобы использовать сетевые политики, включите DataPlane V2 при создании кластера.)

Реализация плоскости данных

OpenvSwitch

eBPF

eBPF

Версия Кластера для правил ingress

Все версии

v1.27.16-r30, v1.28.15-r20, v1.29.13-r0, v1.30.10-r0, v1.31.6-r0, or later

v1.27.16-r10, v1.28.15-r0, v1.29.10-r0, v1.30.6-r0, or later

Версия Кластера для правил egress

v1.23 and later

Селектор для правил ingress

namespaceSelector

podSelector

namespaceSelector

podSelector

ipBlock

namespaceSelector

podSelector

ipBlock

Селектор для правил egress

namespaceSelector

podSelector

ipBlock

Поддерживаемые ОС

EulerOS

CentOS

HCE OS 2.0

HCE OS 2.0 поддерживается.

Кластеры v1.28.15-r70, v1.29.15-r30, v1.30.14-r30, v1.31.10-r30, v1.32.6-r30, v1.33.5-r20, v1.34.1-r0 и более поздние версии поддерживают Ubuntu 22.04.

HCE OS 2.0 поддерживается.

Кластеры v1.28.15-r70, v1.29.15-r30, v1.30.14-r30, v1.31.10-r30, v1.32.6-r30, v1.33.5-r20, v1.34.1-r0 и более поздние версии поддерживают Ubuntu 22.04.

Сетевые политики IPv6

Не поддерживается

Не поддерживается

Поддерживается

Защищённые контейнеры

Не поддерживается

Не поддерживается

Не поддерживается

Область IPBlock

Не ограничено

Подсети внутри блока pod CIDR, блока Service CIDR и IP‑адресов узлов

Подсети внутри блока pod CIDR, блока Service CIDR и IP‑адресов узлов

Ограничение доступа к ClusterIP через метки рабочей нагрузки

Не поддерживается

Поддерживается

Поддерживается

Ограничение внутреннего CIDR‑блока облачного сервера 100.125.0.0/16

Поддерживается

Поддерживается

Не поддерживается

SCTP

Не поддерживается

Поддерживается

Не поддерживается

Всегда разрешать доступ к pod на узле с других узлов

Поддерживается

Поддерживается

Поддерживается

Настройка EndPort в сетевых политиках

Не поддерживается

Поддерживается

Не поддерживается

Note
  • DataPlane V2 кластера CCE Turbo поставляется с ограничениями. Чтобы использовать эту функцию, отправьте сервисный запрос в CCE.
  • Защищённые контейнеры (например Kata в качестве среды выполнения контейнеров) не поддерживаются сетевыми политиками.
  • Если вы обновите CCE standard кластер с туннельной сетью до версии, поддерживающей правила egress в режиме in-place, правила не будут работать, поскольку ОС узла не обновлена. В этом случае сбросьте узел.
  • Когда сетевая политика включена для кластера с туннельной сетью, исходный IP‑адрес pod включается в необязательное поле пакетов, отправляемых им в любой блок Service CIDR. Это позволяет настраивать правила сетевой политики на целевом pod, учитывая исходный IP‑адрес pod.

Использование правил Ingress через YAML

  • Сценарий 1: Настроить сетевую политику, позволяющую только pod с указанными метками получать доступ к целевому pod.

    Рисунок 1 podSelector


    Pod с меткой role=db только разрешает доступ к его порту 6379 от pod с меткой role=frontend. Чтобы достичь этого, выполните следующие шаги:

    1. Создайте access-ingress1.yaml файл.
      vim access-ingress1.yaml

      Содержимое файла:

      apiVersion: networking.k8s.io/v1
      kind: NetworkPolicy
      metadata:
      name: access-ingress1
      namespace: default
      spec:
      podSelector: # Правило применяется только к pod с меткой role=dbrole=db.
      matchLabels:
      role: db
      ingress: # Это правило ingress.
      - from:
      - podSelector: # Разрешить доступ только от pod с меткой role=frontendrole=frontend.
      matchLabels:
      role: frontend
      ports: # Только TCP может быть использован для доступа к порту 6379.
      - protocol: TCP
      port: 6379
    2. Выполните следующую команду, чтобы создать сетевую политику, определённую в access-ingress1.yaml файле:
      kubectl apply -f access-ingress1.yaml

      Ожидаемый вывод:

      networkpolicy.networking.k8s.io/access-ingress1 created
  • Сценарий 2: Настроить сетевую политику, позволяющую только pod в определённом namespace получать доступ к целевому pod.

    Рисунок 2 namespaceSelector


    Pod с меткой role=db только разрешает доступ к его порту 6379 от pod в namespace с меткой project=myproject. Чтобы достичь этого, выполните следующие шаги:

    1. Создайте access-ingress2.yaml файл.
      vim access-ingress2.yaml

      Содержимое файла:

      apiVersion: networking.k8s.io/v1
      kind: NetworkPolicy
      metadata:
      name: access-ingress2
      spec:
      podSelector: # Правило применяется только к pod с меткой role=dbrole=db.
      matchLabels:
      role: db
      ingress: # Это правило ingress.
      - from:
      - namespaceSelector: # Разрешить доступ только от pod в namespaces с меткой project=myprojectproject=myproject.
      matchLabels:
      project: myproject
      ports: # Только TCP может быть использован для доступа к порту 6379.
      - protocol: TCP
      port: 6379
    2. Выполните следующую команду, чтобы создать сетевую политику, определённую в access-ingress2.yaml файле:
      kubectl apply -f access-ingress2.yaml

      Ожидаемый вывод:

      networkpolicy.networking.k8s.io/access-ingress2 created
  • Сценарий 3: Настроить сетевую политику, позволяющую только pod с определёнными метками в конкретном namespace получать доступ к целевому pod.

    Рисунок 3 Использование одновременно podSelector и namespaceSelector


    Pod с меткой role=db только позволяет доступ к его порту 6379 от pod с меткой role=frontend в namespace с меткой project=myproject. Чтобы достичь этого, выполните следующие шаги:

    1. Создайте access-ingress3.yaml файл.
      vim access-ingress3.yaml

      Содержимое файла:

      apiVersion: networking.k8s.io/v1
      kind: NetworkPolicy
      metadata:
      name: access-ingress3
      spec:
      podSelector: # Правило применяется только к pod с меткой role=dbrole=db.
      matchLabels:
      role: db
      ingress: # Это правило ingress.
      - from:
      - namespaceSelector: # Разрешить доступ только от pod в namespaces с меткой project=myprojectproject=myproject.
      matchLabels:
      project: myproject
      podSelector: # Разрешить доступ только от pod с меткой role=frontendrole=frontend.
      matchLabels:
      role: frontend
      ports: # Только TCP может быть использован для доступа к порту 6379.
      - protocol: TCP
      port: 6379
    2. Выполните следующую команду, чтобы создать сетевую политику, определённую в access-ingress3.yaml файле:
      kubectl apply -f access-ingress3.yaml

      Ожидаемый вывод:

      networkpolicy.networking.k8s.io/access-ingress3 created

Использование правил Egress через YAML

Note

Кластеры v1.23 и более новые, использующие туннельную сеть, поддерживают правила egress. ОС узла может быть только CentOS 7.x или HCE OS 2.0.

Правила egress доступны только в кластерах CCE Turbo или других кластерах CCE, использующих сети VPC. Версия кластера должна быть v1.27.16-r10, v1.28.15-r0, v1.29.10-r0, v1.30.6-r0 или более новой, и DataPlane V2 должен быть включён. Кроме того, узлы в этих кластерах должны работать на HCE OS 2.0.

  • Сценарий 1: При управлении предустановленной сетевой политикой pod могут обращаться только к определённым адресам.

    Рисунок 4 ipBlock


    Pod с меткой role=db только разрешают доступ к 172.16.0.0/16, исключая 172.16.0.40/32. Чтобы достичь этого, выполните следующие шаги:

    1. Создайте access-egress1.yaml файл.
      vim access-egress1.yaml

      Содержимое файла:

      apiVersion: networking.k8s.io/v1
      kind: NetworkPolicy
      metadata:
      name: access-egress1
      namespace: default
      spec:
      policyTypes: # Этот тип политики необходимо указать для правил egress.
      - Egress
      podSelector: # Правило применяется только к pod с меткой role=dbrole=db.
      matchLabels:
      role: db
      egress: # Это правило egress.
      - to:
      - ipBlock:
      cidr: 172.16.0.0/16 # Разрешает доступ к этому CIDR‑блоку в исходящем направлении.
      except:
      - 172.16.0.40/32 # Блокирует доступ к этому CIDR‑блоку, который находится в диапазоне, указанном в параметре cidrcidr параметр.
    2. Выполните следующую команду, чтобы создать сетевую политику, определённую в access-egress1.yaml файле:
      kubectl apply -f access-egress1.yaml

      Ожидаемый вывод:

      networkpolicy.networking.k8s.io/access-egress1 created
  • Сценарий 2: При управлении предустановленной сетевой политикой pod может быть доступен только pod с определёнными метками, в то время как сам этот pod может обращаться только к определённым pod.

    Рисунок 5 Использование одновременно ingress и egress


    Pod с меткой role=db только разрешает доступ к его порту 6379 от pod с меткой role=frontend, а этот pod может обращаться только к pod с меткой role=web. Вы можете использовать то же правило для настройки как ingress, так и egress в сетевой политике. Чтобы достичь этого, выполните следующие шаги:

    1. Создайте access-egress2.yaml файл.
      vim access-egress2.yaml

      Содержимое файла:

      apiVersion: networking.k8s.io/v1
      kind: NetworkPolicy
      metadata:
      name: access-egress2
      namespace: default
      spec:
      policyTypes:
      - Ingress
      - Egress
      podSelector: # Правило применяется только к pod с меткой role=dbrole=db.
      matchLabels:
      role: db
      ingress: # Это правило ingress.
      - from:
      - podSelector: # Разрешить доступ только от pod с меткой role=frontendrole=frontend.
      matchLabels:
      role: frontend
      ports: # Только TCP может быть использован для доступа к порту 6379.
      - protocol: TCP
      port: 6379
      egress: # Это правило egress.
      - to:
      - podSelector: # Правило действует для pod с role=webrole=web меткой.
      matchLabels:
      role: web
    2. Выполните следующую команду, чтобы создать сетевую политику, определённую в access-egress2.yaml файле:
      kubectl apply -f access-egress2.yaml

      Ожидаемый вывод:

      networkpolicy.networking.k8s.io/access-egress2 created

Создание сетевой политики в консоли

  1. Войдите в CCE console и кликните название кластера, чтобы перейти в консоль кластера.
  2. Выберите Политики в навигационной панели, кликните Сетевые политики вкладка, и кликните Создать сетевую политику в правом верхнем углу.

    • Имя политики: Укажите имя сетевой политики.
    • Пространство имён: Выберите пространство имён, в котором будет применена сетевая политика.
    • Селектор: Введите метку, выберите pod для ассоциации и кликните Добавить. Вы также можете кликнуть Ссылка на метку рабочей нагрузки чтобы использовать метку существующей рабочей нагрузки.
    • Входящее правило: Кликните чтобы добавить входящее правило. Для подробностей о настройках параметров смотрите Таблица 1.

      Таблица 1 Добавление входящего правила

      Параметр

      Описание

      Протокол & Порт

      Выберите тип протокола и порт. В настоящее время поддерживаются TCP и UDP.

      Блок CIDR-источника

      Для кластеров v1.27.16-r10, v1.28.15-r0, v1.29.10-r0, v1.30.6-r0 и более новых версий с включённым DataPlane V2 можно настроить блок CIDR-источника.

      Указанный блок CIDR-источника разрешает трафик от блока CIDR-назначения (можно указать несколько блоков CIDR-исключений). Разделяйте блок назначения и блоки исключений вертикальной чертой (|). Если указано несколько блоков CIDR-исключений, разделяйте их запятыми (,). Например, 172.17.0.0/16|172.17.1.0/24,172.17.2.0/24 означает, что 172.17.0.0/16 доступен, а 172.17.1.0/24 и 172.17.2.0/24 недоступны.

      Namespace-источник

      Выберите namespace, объекты которого могут быть доступны. Если параметр не указан, объект принадлежит тому же namespace, что и текущая политика.

      Метка pod-источника

      Разрешить доступ к pod с этой меткой. Если параметр не указан, доступны все pod в namespace.

    • Исходящее правило: Кликните чтобы добавить исходящее правило. Для подробностей настройки параметров смотрите Таблица 2.

      Таблица 2 Добавление исходящего правила

      Параметр

      Описание

      Протокол & Порт

      Выберите тип протокола и порт. В настоящее время поддерживаются TCP и UDP. Если параметр не указан, тип протокола не ограничен.

      Блок CIDR-назначения

      Разрешить маршрутизацию запросов к указанному блоку CIDR (и не к блокам CIDR-исключений). Разделяйте блок назначения и блоки исключений вертикальной чертой (|). Если указано несколько блоков CIDR-исключений, разделяйте их запятыми (,). Например, 172.17.0.0/16|172.17.1.0/24,172.17.2.0/24 означает, что 172.17.0.0/16 доступен, а 172.17.1.0/24 и 172.17.2.0/24 недоступны.

      Namespace-назначения

      Выберите namespace, объекты которого могут быть доступны. Если параметр не указан, объект принадлежит тому же namespace, что и текущая политика.

      Метка pod-назначения

      Разрешить доступ к pod с этой меткой. Если параметр не указан, доступны все pod в namespace.

  3. Кликните OK.