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

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

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

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

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

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

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

    Помимо портов сервисов и CIDR‑блоков, необходимо учитывать порты и CIDR‑блоки, требуемые критическими компонентами кластера, такими как CoreDNS и NodeLocal DNSCache. Их отсутствие может повлиять на стабильность сервисов.

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

Тип кластера

CCE Standard Cluster

CCE Standard Cluster

CCE Turbo Cluster

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

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

Сеть VPC

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, or later

Кластеры v1.34.3-r10 и новее

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

v1.23 и позже

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

namespaceSelector

podSelector

namespaceSelector

podSelector

ipBlock

namespaceSelector

podSelector

ipBlock

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

namespaceSelector

podSelector

ipBlock

Максимальное количество объектов NetworkPolicy, которые могут быть применены к pod

15

Не ограничено. Рекомендуется поддерживать количество ниже 100.

Не ограничено. Рекомендуется поддерживать количество ниже 100.

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

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

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

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

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

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

Not supported

Not supported

Not supported

IPBlock область

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

Подсети внутри pod CIDR block, Service CIDR block и node IP addresses

Подсети внутри pod CIDR block, Service CIDR block и node IP addresses

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

Not supported

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

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

Ограничение внутреннего cloud server CIDR block 100.125.0.0/16

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

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

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

SCTP

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

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

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

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

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

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

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

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

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

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

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

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

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

Сценарий 1: Разрешить только Pods с указанными метками доступ к Target Pod

Figure 1 podSelector


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

Использование CCE Console

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

    Table 1 Параметры создания network policy

    Parameter

    Description

    Example

    Policy Name

    Настройте имя для network policy.

    access-ingress1

    Namespace

    Выберите пространство имён, к которому применяется политика.

    default

    Selector

    Введите селектор меток для целевого pod и нажмите Add. Если оставить пустым, будут выбраны все pod в пространстве имён. Нажмите Reference Workload Label, чтобы использовать метку существующей рабочей нагрузки.

    Ключ: role

    Значение: db

    Inbound Rule

    Нажмите , чтобы добавить входящее правило.

    Table 2

    Outbound Rule

    Нажмите , чтобы добавить исходящее правило.

    N/A

    Table 2 Параметры для добавления входящего правила

    Parameter

    Description

    Пример

    Protocol & Port

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

    Protocol: TCP

    Port: 6379

    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.

    N/A

    Source Namespace

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

    default

    Source Pod Label

    Введите селектор меток для разрешённых source pod и нажмите Add. Если оставить пустым, все pod в source namespace разрешены.

    Key: role

    Value: frontend

  4. нажмите OK.

Использование YAML‑файла

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

    vim access-ingress1.yaml

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

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
    name: access-ingress1
    namespace: default
    spec:
    podSelector: # This rule applies only to pods labeled role=db .
    matchLabels:
    role: db
    ingress: # This is an ingress rule.
    - from:
    - podSelector: # Allow access only from pods labeled 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‑ам в определённом Namespace

Рисунок 2 namespaceSelector


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

Использование консоли CCE

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

    Таблица 3 Параметры создания сетевой политики

    Параметр

    Описание

    Пример

    Имя политики

    Настройте имя для сетевой политики.

    access-ingress2

    Namespace

    Выберите namespace, в котором применяется политика.

    default

    Selector

    Введите селектор меток для целевого pod и нажмите Add. Если оставить пустым, будут выбраны все pod в namespace. Нажмите Reference Workload Label, чтобы использовать метку существующей workload.

    Key: role

    Value: db

    Inbound Rule

    Нажмите , чтобы добавить входящее правило.

    Таблица 4

    Исходящее правило

    Нажмите , чтобы добавить исходящее правило.

    N/A

    Таблица 4 Параметры для добавления входящего правила

    Параметр

    Описание

    Пример

    Протокол и порт

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

    Protocol: TCP

    Port: 6379

    Исходный 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.

    N/A

    Source Namespace

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

    myproject

    Source Pod Label

    Введите селектор меток для разрешённых исходных pod‑ов и нажмите Add. Если оставить пустым, разрешены все pod‑ы в исходном пространстве имён.

    N/A

  4. Нажмите OK.

Использование файла YAML

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

    vim access-ingress2.yaml

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

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
    name: access-ingress2
    spec:
    podSelector: # This rule applies only to pods labeled role=db .
    matchLabels:
    role: db
    ingress: # This is an ingress rule.
    - from:
    - namespaceSelector: # Allow access only from pods in namespaces labeled 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. Чтобы достичь этого, выполните следующие шаги:

Использование CCE Console

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

    Table 5 Параметры создания сетевой политики

    Параметр

    Описание

    Пример

    Имя политики

    Укажите имя для сетевой политики.

    access-ingress3

    Пространство имён

    Выберите пространство имён, к которому применяется политика.

    default

    Selector

    Введите селектор меток для целевого pod и нажмите Add. Если оставить пустым, все pod в пространстве имён будут выбраны. Нажмите Reference Workload Label, чтобы использовать метку существующей рабочей нагрузки.

    Key: role

    Value: db

    Inbound Rule

    Нажмите , чтобы добавить inbound rule.

    Table 6

    Outbound Rule

    Нажмите , чтобы добавить outbound rule.

    N/A

    Table 6 Параметры для добавления inbound rule

    Parameter

    Description

    Example

    Protocol & Port

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

    Protocol: TCP

    Port: 6379

    Source CIDR Block

    Для кластеров 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.

    N/A

    Source Namespace

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

    myproject

    Source Pod Label

    Введите селектор меток для разрешённых исходных pod‑ов и нажмите Add. Если оставить пустым, разрешены все pod‑ы в исходном пространстве имён.

    Key: role

    Value: frontend

  4. Нажмите OK.

Использование YAML‑файла

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

    vim access-ingress3.yaml

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

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
    name: access-ingress3
    spec:
    podSelector: # This rule applies only to pods labeled role=db .
    matchLabels:
    role: db
    ingress: # This is an ingress rule.
    - from:
    - namespaceSelector: # Allow access only from pods in namespaces labeled project=myproject .
    matchLabels:
    project: myproject
    podSelector: # Allow access only from pods labeled 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

Сценарий 1: Ограничение Pods доступом только к указанным адресам

Рисунок 4 ipBlock


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

Использование консоли CCE

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

    Таблица 7 Параметры создания сетевой политики

    Параметр

    Описание

    Пример

    Имя политики

    Настройте имя для сетевой политики.

    access-ingress3

    Namespace

    Выберите namespace, к которому применяется политика.

    default

    Selector

    Введите селектор меток для целевого pod и нажмите Add. Если оставить пустым, все pod в namespace будут выбраны. Нажмите Reference Workload Label, чтобы использовать метку существующего workload.

    Key: role

    Value: db

    Inbound Rule

    Нажмите , чтобы добавить inbound rule.

    N/A

    Outbound Rule

    Нажмите для добавления outbound rule.

    Table 8

    Table 8 Параметры для добавления outbound rule

    Parameter

    Description

    Example

    Protocol & Port

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

    N/A

    Destination CIDR Block

    Разрешить маршрутизацию запросов к указанному 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.

    172.16.0.0/16|172.16.0.40/32

    Destination Namespace

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

    N/A

    Destination Pod Label

    Label selector для целевого pod, разрешённый этим правилом. Если оставить пустым, разрешаются все pod в destination namespace.

    N/A

  4. нажмите OK.

Использование YAML‑файла

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

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

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
    name: access-egress1
    namespace: default
    spec:
    policyTypes: # Must be specified for egress rules.
    - Egress
    podSelector: # This rule applies only to pods labeled role=db .
    matchLabels:
    role: db
    egress: # This is an egress rule.
    - to:
    - ipBlock:
    cidr: 172.16.0.0/16 # Allows outbound traffic to this CIDR block.
    except:
    - 172.16.0.40/32 # Blocks access to this CIDR block, which is in the range specified by the cidr parameter.
  2. Выполните следующую команду для создания network policy, определённой в файле access-egress1.yaml:
    kubectl apply -f access-egress1.yaml

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

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

Сценарий 2: Ограничение доступа к pod только pod с указанными метками

Figure 5 Использование как входящего, так и исходящего трафика


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

Использование консоли CCE

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

    Table 9 Параметры создания сетевой политики

    Параметр

    Описание

    Пример

    Policy Name

    Настройте имя для сетевой политики.

    access-ingress3

    Namespace

    Выберите пространство имён, к которому применяется политика.

    default

    Selector

    Введите селектор меток для целевого pod и нажмите Add. Если оставить пустым, будут выбраны все pod в пространстве имён. Нажмите Reference Workload Label, чтобы использовать метку существующей рабочей нагрузки.

    Key: role

    Value: db

    Inbound Rule

    Нажмите , чтобы добавить inbound rule.

    Table 10

    Outbound Rule

    Нажмите , чтобы добавить outbound rule.

    Table 11

    Table 10 Параметры добавления inbound rule

    Parameter

    Description

    Example

    Protocol & Port

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

    Protocol: TCP

    Port: 6379

    Source CIDR Block

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

    Указанный исходный 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.

    N/A

    Source Namespace

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

    default

    Source Pod Label

    Введите селектор меток для разрешённых исходных pod и нажмите Add. Если оставить пустым, разрешены все pod в исходном пространстве имён.

    Key: role

    Value: frontend

    Table 11 Параметры для добавления исходящего правила

    Parameter

    Description

    Example

    Protocol & Port

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

    N/A

    Destination CIDR Block

    Разрешить маршрутизацию запросов к указанному 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.

    N/A

    Destination Namespace

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

    default

    Destination Pod Label

    Селектор меток для целевого pod, разрешённого этим правилом. Если оставить пустым, разрешены все pod в целевом пространстве имён.

    Ключ: role

    Значение: web

  4. Нажмите OK.

Использование YAML‑файла

  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: # This rule applies only to pods labeled role=db .
    matchLabels:
    role: db
    ingress: # This is an ingress rule.
    - from:
    - podSelector: # Allow access only from pods labeled 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