Сетевые политики разрабатываются Kubernetes для ограничения доступа к pod. Как межсетевой экран на уровне приложений, сетевые политики повышают безопасность сети. Возможности, поддерживаемые сетевыми политиками, зависят от возможностей сетевых дополнений Кластера.
По умолчанию, если в namespace нет ни одной политики, pod в этом namespace принимают трафик из любого источника и отправляют трафик в любой пункт назначения.
Для сетевых политик доступны следующие селекторы:
Тип Кластера | 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 в сетевых политиках | Не поддерживается | Поддерживается | Не поддерживается |
Рисунок 1 podSelector

Pod с меткой role=db только разрешает доступ к его порту 6379 от pod с меткой role=frontend. Чтобы достичь этого, выполните следующие шаги:
vim access-ingress1.yaml
Содержимое файла:
apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata:name: access-ingress1namespace: defaultspec:podSelector: # Правило применяется только к pod с меткой role=dbrole=db.matchLabels:role: dbingress: # Это правило ingress.- from:- podSelector: # Разрешить доступ только от pod с меткой role=frontendrole=frontend.matchLabels:role: frontendports: # Только TCP может быть использован для доступа к порту 6379.- protocol: TCPport: 6379
kubectl apply -f access-ingress1.yaml
Ожидаемый вывод:
networkpolicy.networking.k8s.io/access-ingress1 created
Рисунок 2 namespaceSelector

Pod с меткой role=db только разрешает доступ к его порту 6379 от pod в namespace с меткой project=myproject. Чтобы достичь этого, выполните следующие шаги:
vim access-ingress2.yaml
Содержимое файла:
apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata:name: access-ingress2spec:podSelector: # Правило применяется только к pod с меткой role=dbrole=db.matchLabels:role: dbingress: # Это правило ingress.- from:- namespaceSelector: # Разрешить доступ только от pod в namespaces с меткой project=myprojectproject=myproject.matchLabels:project: myprojectports: # Только TCP может быть использован для доступа к порту 6379.- protocol: TCPport: 6379
kubectl apply -f access-ingress2.yaml
Ожидаемый вывод:
networkpolicy.networking.k8s.io/access-ingress2 created
Рисунок 3 Использование одновременно podSelector и namespaceSelector

Pod с меткой role=db только позволяет доступ к его порту 6379 от pod с меткой role=frontend в namespace с меткой project=myproject. Чтобы достичь этого, выполните следующие шаги:
vim access-ingress3.yaml
Содержимое файла:
apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata:name: access-ingress3spec:podSelector: # Правило применяется только к pod с меткой role=dbrole=db.matchLabels:role: dbingress: # Это правило ingress.- from:- namespaceSelector: # Разрешить доступ только от pod в namespaces с меткой project=myprojectproject=myproject.matchLabels:project: myprojectpodSelector: # Разрешить доступ только от pod с меткой role=frontendrole=frontend.matchLabels:role: frontendports: # Только TCP может быть использован для доступа к порту 6379.- protocol: TCPport: 6379
kubectl apply -f access-ingress3.yaml
Ожидаемый вывод:
networkpolicy.networking.k8s.io/access-ingress3 created
Кластеры 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.
Рисунок 4 ipBlock

Pod с меткой role=db только разрешают доступ к 172.16.0.0/16, исключая 172.16.0.40/32. Чтобы достичь этого, выполните следующие шаги:
vim access-egress1.yaml
Содержимое файла:
apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata:name: access-egress1namespace: defaultspec:policyTypes: # Этот тип политики необходимо указать для правил egress.- EgresspodSelector: # Правило применяется только к pod с меткой role=dbrole=db.matchLabels:role: dbegress: # Это правило egress.- to:- ipBlock:cidr: 172.16.0.0/16 # Разрешает доступ к этому CIDR‑блоку в исходящем направлении.except:- 172.16.0.40/32 # Блокирует доступ к этому CIDR‑блоку, который находится в диапазоне, указанном в параметре cidrcidr параметр.
kubectl apply -f access-egress1.yaml
Ожидаемый вывод:
networkpolicy.networking.k8s.io/access-egress1 created
Рисунок 5 Использование одновременно ingress и egress

Pod с меткой role=db только разрешает доступ к его порту 6379 от pod с меткой role=frontend, а этот pod может обращаться только к pod с меткой role=web. Вы можете использовать то же правило для настройки как ingress, так и egress в сетевой политике. Чтобы достичь этого, выполните следующие шаги:
vim access-egress2.yaml
Содержимое файла:
apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata:name: access-egress2namespace: defaultspec:policyTypes:- Ingress- EgresspodSelector: # Правило применяется только к pod с меткой role=dbrole=db.matchLabels:role: dbingress: # Это правило ingress.- from:- podSelector: # Разрешить доступ только от pod с меткой role=frontendrole=frontend.matchLabels:role: frontendports: # Только TCP может быть использован для доступа к порту 6379.- protocol: TCPport: 6379egress: # Это правило egress.- to:- podSelector: # Правило действует для pod с role=webrole=web меткой.matchLabels:role: web
kubectl apply -f access-egress2.yaml
Ожидаемый вывод:
networkpolicy.networking.k8s.io/access-egress2 created
чтобы добавить входящее правило. Для подробностей о настройках параметров смотрите Таблица 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.
Параметр | Описание |
|---|---|
Протокол & Порт | Выберите тип протокола и порт. В настоящее время поддерживаются 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. |