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

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

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

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

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

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

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

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

Тип кластера

CCE Standard Cluster

CCE Standard Cluster

CCE Turbo Cluster

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

Туннельная сеть

VPC Network

Cloud Native Network 2.0

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

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

Отключено по умолчанию (Чтобы использовать сетевые политики, включите 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.34.3-r10 или более поздние

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

v1.23 и более поздние

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

namespaceSelector

podSelector

namespaceSelector

podSelector

ipBlock

namespaceSelector

podSelector

ipBlock

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

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
  • Если вы обновляете стандартный кластер CCE с туннельной сетью до версии, поддерживающей правила egress в режиме in-place, правила не будут работать, потому что ОС узла не обновлена. В этом случае сбросьте узел.
  • Когда сетевая политика включена для кластера с туннельной сетью, исходный IP-адрес pod включается в необязательное поле пакетов, которые он отправляет в любой Service CIDR block. Это позволяет настраивать правила сетевой политики на целевом 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: # The rule applies only to pods labeled with role=db .
      matchLabels:
      role: db
      ingress: # This is an ingress rule.
      - from:
      - 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-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 applies only to pods labeled with role=db .
      matchLabels:
      role: db
      ingress: # This is an ingress rule.
      - from:
      - namespaceSelector: # Allow access only from pods in namespaces 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: Настройте сетевую политику, чтобы разрешить доступ к целевому pod только pod с определёнными метками в определённом пространстве имён.

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


    Pod с меткой role=db разрешает доступ к своему порту 6379 только pod с меткой 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: # Allow access only from pods in namespaces 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

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

  • Сценарий 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: # This policy type must be specified for egress rules.
      - Egress
      podSelector: # The rule applies only to pods labeled with role=db .
      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, which is in the range specified by the cidr parameter.
    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: # The rule applies only to pods labeled with role=db .
      matchLabels:
      role: db
      ingress: # This is an ingress rule.
      - from:
      - 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
      egress: # This is an egress rule.
      - to:
      - podSelector: # The rule takes effect for pods with the role=web label.
      matchLabels:
      role: web
    2. Выполните следующую команду, чтобы создать Network Policy, определённую в файле access-egress2.yaml:
      kubectl apply -f access-egress2.yaml

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

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

Создание Network Policy в Console

  1. Войдите в CCE console и нажмите cluster name, чтобы открыть консоль кластера.
  2. Выберите Policies в панели навигации, нажмите вкладку Network Policies и нажмите Create Network Policy в правом верхнем углу.

    • Policy Name: Укажите имя Network Policy.
    • Namespace: Выберите Namespace, в котором применяется Network Policy.
    • Selector: Введите метку, выберите pod, который будет связан, и нажмите Add. Вы также можете нажать Reference Workload Label, чтобы использовать метку существующей рабочей нагрузки.
    • Inbound Rule: Нажмите , чтобы добавить входящее правило. Подробную информацию о параметрах см. в Table 1.

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

      Параметр

      Описание

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

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

      Source CIDR Block

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

      Указанный source CIDR block разрешает трафик из destination CIDR block (можно указать несколько exception CIDR block). Разделяйте destination и exception CIDR block вертикальной чертой (|). Если указано несколько exception CIDR block, разделяйте их запятыми (,). Например, 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 недоступны.

      Source Namespace

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

      Source Pod Label

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

    • Outbound Rule: нажмите , чтобы добавить outbound rule. Для получения подробной информации о параметрах см. Table 2.

      Table 2 Добавление outbound rule

      Parameter

      Description

      Protocol & Port

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

      Destination CIDR Block

      Разрешить маршрутизацию запросов к указанному CIDR block (и не к exception CIDR block). Разделяйте destination и exception CIDR block вертикальной чертой (|). Если указано несколько exception CIDR block, разделяйте их запятыми (,). Например, 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 недоступны.

      Destination Namespace

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

      Destination Pod Label

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

  3. нажмите OK.