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

Pod с меткой role=db разрешает доступ к своему порту 6379 только от pod‑ов с меткой role=frontend. Чтобы выполнить это, выполните следующие действия:
vim access-ingress1.yaml
Содержимое файла:
apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata:name: access-ingress1namespace: defaultspec:podSelector: # The rule applies only to pods labeled with role=db .matchLabels:role: dbingress: # This is an ingress rule.- from:- podSelector: # Allow access only from pods labeled with role=frontend .matchLabels:role: frontendports: # Only TCP can be used to access port 6379.- protocol: TCPport: 6379
kubectl apply -f access-ingress1.yaml
Ожидаемый вывод:
networkpolicy.networking.k8s.io/access-ingress1 created
Figure 2 namespaceSelector

Pod с меткой role=db разрешает доступ к своему порту 6379 только от pod‑ов в пространстве имён с меткой project=myproject. Чтобы выполнить это, выполните следующие действия:
vim access-ingress2.yaml
Содержимое файла:
apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata:name: access-ingress2spec:podSelector: # The rule applies only to pods labeled with role=db .matchLabels:role: dbingress: # This is an ingress rule.- from:- namespaceSelector: # Allow access only from pods in namespaces labeled with project=myproject .matchLabels:project: myprojectports: # Only TCP can be used to access port 6379.- protocol: TCPport: 6379
kubectl apply -f access-ingress2.yaml
Ожидаемый вывод:
networkpolicy.networking.k8s.io/access-ingress2 created
Figure 3 Используя одновременно podSelector и namespaceSelector

Pod с меткой role=db разрешает доступ к своему порту 6379 только от pod‑ов с меткой role=frontend в пространстве имён с меткой project=myproject. Чтобы выполнить это, выполните следующие действия:
vim access-ingress3.yaml
Содержимое файла:
apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata:name: access-ingress3spec:podSelector: # The rule applies only to pods labeled with role=db .matchLabels:role: dbingress: # This is an ingress rule.- from:- namespaceSelector: # Allow access only from pods in namespaces labeled with project=myproject .matchLabels:project: myprojectpodSelector: # Allow access only from pods labeled with role=frontend .matchLabels:role: frontendports: # Only TCP can be used to access port 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: # This policy type must be specified for egress rules.- EgresspodSelector: # The rule applies only to pods labeled with role=db .matchLabels:role: dbegress: # 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.
kubectl apply -f access-egress1.yaml
Ожидаемый вывод:
networkpolicy.networking.k8s.io/access-egress1 created
Рисунок 5 Использование как ingress, так и egress

Под, помеченный role=db, разрешает доступ к своему порту 6379 только от подов, помеченных role=frontend, и этот под может обращаться только к подам, помеченным role=web. Вы можете использовать то же правило для настройки как ingress, так и egress в сетевой политике. Чтобы выполнить это, выполните следующие действия:
vim access-egress2.yaml
Содержимое файла:
apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata:name: access-egress2namespace: defaultspec:policyTypes:- Ingress- EgresspodSelector: # The rule applies only to pods labeled with role=db .matchLabels:role: dbingress: # This is an ingress rule.- from:- podSelector: # Allow access only from pods labeled with role=frontend .matchLabels:role: frontendports: # Only TCP can be used to access port 6379.- protocol: TCPport: 6379egress: # This is an egress rule.- to:- podSelector: # The rule takes effect for pods with the role=web label.matchLabels:role: web
kubectl apply -f access-egress2.yaml
Ожидаемый вывод:
networkpolicy.networking.k8s.io/access-egress2 created
, чтобы добавить входящее правило. Подробную информацию о параметрах см. в Table 1.
Parameter | Описание |
|---|---|
Protocol & Port | Выберите тип протокола и порт. В настоящее время поддерживаются TCP и UDP. |
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‑исключений, разделяйте их запятыми (,). Например, 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 | Выберите пространство имён, объекты которого могут быть доступны. Если этот параметр не указан, объект принадлежит тому же пространству имён, что и текущая политика. |
Source Pod Label | Разрешить доступ к pod‑ам с этой меткой. Если этот параметр не указан, доступны все pod‑ы в пространстве имён. |
, чтобы добавить outbound rule. Для получения подробной информации о параметрах см. Table 2.
Параметр | Описание |
|---|---|
Protocol & Port | Выберите тип протокола и порт. В настоящее время поддерживаются TCP и UDP. Если этот параметр не указан, тип протокола не ограничен. |
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 недоступны. |
Destination Namespace | Выберите namespace, объекты которого могут быть доступны. Если этот параметр не указан, объект принадлежит тому же namespace, что и текущая политика. |
Destination Pod Label | Разрешить доступ к pod‑ам с этой label. Если этот параметр не указан, доступны все pod‑ы в namespace. |