Network policies are designed by Kubernetes to restrict pod access. Like a firewall at the application layer, network policies enhance network security. The capabilities supported by network policies depend on the capabilities of the network add-ons of the cluster.
By default, if a namespace does not have any policy, pods in the namespace accept traffic from any source and send traffic to any destination.
The following selectors are available for network policies:
Cluster Type | CCE Standard Cluster | CCE Standard Cluster | CCE Turbo Cluster |
|---|---|---|---|
Network Model | Tunnel Network | VPC Network | Cloud Native Network 2.0 |
Network policies | Enabled by default | Disabled by default (To use network policies, enable DataPlane V2 when creating a cluster.) | Disabled by default (To use network policies, enable DataPlane V2 when creating a cluster.) |
Data plane implementation | OpenvSwitch | eBPF | eBPF |
Cluster versions for ingress rules | All versions | v1.27.16-r30, v1.28.15-r20, v1.29.13-r0, v1.30.10-r0, v1.31.6-r0, or later | Clusters v1.34.3-r10 or later |
Cluster versions for egress rules | v1.23 and later | ||
Selector for ingress rules | namespaceSelector podSelector | namespaceSelector podSelector ipBlock | namespaceSelector podSelector ipBlock |
Selector for egress rules | namespaceSelector podSelector ipBlock | ||
Supported OS | EulerOS CentOS HCE OS 2.0 | HCE OS 2.0 is supported. Clusters 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, and later versions support Ubuntu 22.04. | HCE OS 2.0 is supported. Clusters 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, and later versions support Ubuntu 22.04. |
IPv6 network policies | Not supported | Not supported | Supported |
Secure containers | Not supported | Not supported | Not supported |
IPBlock scope | Not limited | Subnets within the pod CIDR block, Service CIDR block, and node IP addresses | Subnets within the pod CIDR block, Service CIDR block, and node IP addresses |
Limiting ClusterIP access through workload labels | Not supported | Supported | Supported |
Limiting the internal cloud server CIDR block of 100.125.0.0/16 | Supported | Supported | Supported |
SCTP | Not supported | Supported | Supported |
Always allowing access to pods on a node from other nodes | Supported | Supported | Supported |
Configuring EndPort in network policies | Not supported | Supported | Supported |
Figure 1 podSelector

The pod labeled with role=db only permits access to its port 6379 from pods labeled with role=frontend. To achieve this, take the following steps:
vim access-ingress1.yaml
File content:
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
Expected output:
networkpolicy.networking.k8s.io/access-ingress1 created
Figure 2 namespaceSelector

The pod labeled with role=db only permits access to its port 6379 from pods in the namespace labeled with project=myproject. To achieve this, take the following steps:
vim access-ingress2.yaml
File content:
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
Expected output:
networkpolicy.networking.k8s.io/access-ingress2 created
Figure 3 Using both podSelector and namespaceSelector

The pod labeled with role=db only allows access to its port 6379 from pods with label role=frontend in the namespace labeled with project=myproject. To achieve this, take the following steps:
vim access-ingress3.yaml
File content:
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
Expected output:
networkpolicy.networking.k8s.io/access-ingress3 created
Figure 4 ipBlock

The pods labeled role=db only allow access to 172.16.0.0/16, excluding 172.16.0.40/32. To achieve this, take the following steps:
vim access-egress1.yaml
File content:
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
Expected output:
networkpolicy.networking.k8s.io/access-egress1 created
Figure 5 Using both ingress and egress

The pod labeled with role=db only permits access to its port 6379 from pods labeled with role=frontend, and this pod can only access the pods labeled with role=web. You can use the same rule to configure both ingress and egress in a network policy. To achieve this, take the following steps:
vim access-egress2.yaml
File content:
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
Expected output:
networkpolicy.networking.k8s.io/access-egress2 created
to add an inbound rule. For details about parameter settings, see Table 1.
Parameter | Description |
|---|---|
Protocol & Port | Select the protocol type and port. Currently, TCP and UDP are supported. |
Source CIDR Block | For clusters v1.27.16-r10, v1.28.15-r0, v1.29.10-r0, v1.30.6-r0, or later versions with DataPlane V2 enabled, you can configure the source CIDR block. The specified source CIDR block allows traffic from a destination CIDR block (multiple exception CIDR blocks can be specified). Separate the destination and exception CIDR blocks using a vertical bar (|). If there are multiple exception CIDR blocks, separate them using commas (,). For example, 172.17.0.0/16|172.17.1.0/24,172.17.2.0/24 indicates that 172.17.0.0/16 is accessible, but 172.17.1.0/24 and 172.17.2.0/24 are inaccessible. |
Source Namespace | Select a namespace whose objects can be accessed. If this parameter is not specified, the object belongs to the same namespace as the current policy. |
Source Pod Label | Allow accessing the pods with this label. If this parameter is not specified, all pods in the namespace can be accessed. |
to add an outbound rule. For details about parameter settings, see Table 2.
Parameter | Description |
|---|---|
Protocol & Port | Select the protocol type and port. Currently, TCP and UDP are supported. If this parameter is not specified, the protocol type is not limited. |
Destination CIDR Block | Allow requests to be routed to a specified CIDR block (and not to the exception CIDR blocks). Separate the destination and exception CIDR blocks using a vertical bar (|). If there are multiple exception CIDR blocks, separate them using commas (,). For example, 172.17.0.0/16|172.17.1.0/24,172.17.2.0/24 indicates that 172.17.0.0/16 is accessible, but 172.17.1.0/24 and 172.17.2.0/24 are inaccessible. |
Destination Namespace | Select a namespace whose objects can be accessed. If this parameter is not specified, the object belongs to the same namespace as the current policy. |
Destination Pod Label | Allow accessing the pods with this label. If this parameter is not specified, all pods in the namespace can be accessed. |