Облачная платформаAdvanced

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

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

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

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

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

  • namespaceSelector: выбирает определённые пространства имён, для которых все pod'ы должны быть разрешены в качестве источников входящего трафика или пунктов назначения исходящего.
  • podSelector: выбирает определённые pod'ы в том же пространстве имён, что и сетевая политика, которые должны быть разрешены в качестве источников входящего трафика или пунктов назначения исходящего.
  • IPBlock: выбирает определённые блоки CIDR, разрешённые в качестве источников входящего трафика или пунктов назначения исходящего.

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

Тип кластера

CCE Standard Кластер

CCE Standard Кластер

CCE Turbo Кластер

Сетевая модель

Туннель

VPC

Cloud Native Network 2.0

NetworkPolicy

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

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

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

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

OpenvSwitch

eBPF

eBPF

Версия кластера для правил входящего трафика

Все версии

Версия кластера: v1.27.16-r30, v1.28.15-r20, v1.29.13-r0, v1.30.10-r0, v1.31.6-r0, или новее

Версия кластера: v1.27.16-r10, v1.28.15-r0, v1.29.10-r0, v1.30.6-r0, или позже

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

v1.23 и позже

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

namespaceSelector

podSelector

namespaceSelector

podSelector

IPBlock

namespaceSelector

podSelector

IPBlock

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

namespaceSelector

podSelector

IPBlock

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

EulerOS

CentOS

HCE OS 2.0

HCE OS 2.0

HCE OS 2.0

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

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

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

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

Безопасные контейнеры

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

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

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

IPBlock область

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

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

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

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

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

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

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

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

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

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

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

SCTP

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Рисунок 1 podSelector


    Под с меткой role=db разрешает доступ к порту 6379 только от подов с меткой 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: # The rule takes effect for pods with the role=db label.
      matchLabels:
      role: db
      ingress: # This is an ingress rule.
      - from:
      - podSelector: # Only allows the access of the pods labeled with role=frontend.
      matchLabels:
      role: frontend
      ports: # Only TCP can be used to access port 6379.
      - protocol: TCP
      port: 6379
    2. Выполните следующую команду, чтобы создать сетевую политику, определённую в access-ingress1.yaml файл:
      kubectl apply -f access-ingress1.yaml

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

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

    Рисунок 2 namespaceSelector


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

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

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

      apiVersion: networking.k8s.io/v1
      kind: NetworkPolicy
      metadata:
      name: access-ingress2
      spec:
      podSelector: # The rule takes effect for pods with the role=db label.
      matchLabels:
      role: db
      ingress: # This is an ingress rule.
      - from:
      - namespaceSelector: # Only allows the access of the pods in the namespace labeled with project=myproject.
      matchLabels:
      project: myproject
      ports: # Only TCP can be used to access port 6379.
      - protocol: TCP
      port: 6379
    2. Выполните следующую команду, чтобы создать сетевую политику, определённую в access-ingress2.yaml файл:
      kubectl apply -f access-ingress2.yaml

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

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

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


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

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

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

      apiVersion: networking.k8s.io/v1
      kind: NetworkPolicy
      metadata:
      name: access-ingress3
      spec:
      podSelector: # The rule applies only to pods labeled with role=db.
      matchLabels:
      role: db
      ingress: # This is an ingress rule.
      - from:
      - namespaceSelector: # Only allow the access of the pods in the namespace labeled with project=myproject.
      matchLabels:
      project: myproject
      podSelector: # Allow access only from pods labeled with role=frontend.
      matchLabels:
      role: frontend
      ports: # Only TCP can be used to access port 6379.
      - protocol: TCP
      port: 6379
    2. Выполните следующую команду, чтобы создать политику сети, определённую в access-ingress3.yaml файл:
      kubectl apply -f access-ingress3.yaml

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

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

Использование исходящих правил через YAML

Note

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

Исходящие правила доступны только в кластерах 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


    Поды с меткой 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: # This policy type must be specified for egress rules.
      - Egress
      podSelector: # The rule takes effect for pods with the role=db label.
      matchLabels:
      role: db
      egress: # This is an egress rule.
      - to:
      - ipBlock:
      cidr: 172.16.0.0/16 # Allows access to this CIDR block in the outbound direction.
      except:
      - 172.16.0.40/32 # Blocks access to this CIDR block. This CIDR block is in the allowed CIDR block.
    2. Выполните следующую команду, чтобы создать сетевую политику, определённую в access-egress1.yaml файл:
      kubectl apply -f access-egress1.yaml

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

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

    Рисунок 5 Используя как ingress, так и egress


    Под, помеченный role=db разрешает доступ к своему порту 6379 только от подов с меткой role=frontend, и этот 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: # The rule takes effect for pods with the role=db label.
      matchLabels:
      role: db
      ingress: # This is an ingress rule.
      - from:
      - podSelector: # Only allows the access of the pods labeled with role=frontend.
      matchLabels:
      role: frontend
      ports: # Only TCP can be used to access port 6379.
      - protocol: TCP
      port: 6379
      egress: # This is an egress rule.
      - to:
      - podSelector: # The rule takes effect for pods with the role=web label.
      matchLabels:
      role: web
    2. Выполните следующую команду, чтобы создать политику сети, определённую access-egress2.yaml файл:
      kubectl apply -f access-egress2.yaml

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

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

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

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

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

      Table 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‑блок вертикальной чертой (|). Если указано несколько 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 недоступны.

      Исходное пространство имён

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

      Исходная метка Pod

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

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

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

      Параметр

      Описание

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

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

      Блок 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 недоступны.

      Пространство имён назначения

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

      Метка Pod назначения

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

  3. Нажмите ОК.