应用场景
在IP地址或端口级别控制流量
限制pod可以与其他哪些pod通信,来确保pod之间的网络安全
控制粒度
- 是否允许其他pod(例外:自身pod不能组织自身的访问)
- 是否允许其他命令空间
- IP块
可使用选择器:Labels and Selectors | Kubernetes
先决条件
k8s使用的网络插件必须支持NetworkPolicy
隔离类型
要允许从源 pod 到目标 pod 的连接,源 pod 上的出口策略和目标 pod 上的入口策略都需要允许连接。如果任何一方不允许连接,则不会发生。
出口隔离
默认情况下,Pod的出口是非隔离的,允许所有出站连接。
policyTypes:
- Egress
入口隔离
policyTypes:
- Ingress
样例
样例一
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
# 使用标签来选择networkpolicy作用的pod
# 空的标签选择器匹配命名空间中的所有pod
podSelector:
matchLabels:
role: db
# 若未指定,默认是ingress
policyTypes:
- Ingress
- Egress
ingress:
- from:
# ip块选择
- ipBlock:
cidr: 172.17.0.0/16
except:
- 172.17.1.0/24
# 命名空间选择
- namespaceSelector:
matchLabels:
project: myproject
# pod标签选择
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 6379
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 5978
含义是:
- 在“默认”命名空间中为入口和出口流量隔离“role=db”pod(如果它们尚未隔离)
- (入口规则)允许连接到 TCP 端口 6379 上带有标签“role=db”的“默认”命名空间中的所有 Pod:
-
- “默认”命名空间中带有标签“role=frontend”的任何 pod
- 命名空间中带有“project=myproject”标签的任何 pod
- IP 地址在 172.17.0.0–172.17.0.255 和 172.17.2.0–172.17.255.255 范围内(即除 172.17.1.0/24 之外的所有 172.17.0.0/16)
- (出口规则)允许从“default”命名空间中带有标签“role=db”的任何 pod 连接到 TCP 端口 5978 上的 CIDR 10.0.0.0/24
样例二
默认拒绝所有入口流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
spec:
podSelector: {}
policyTypes:
- Ingress
这确保即使没有被任何其他 NetworkPolicy 选择的 pod 仍将被隔离以进行入口。此策略不影响任何 pod 的出口隔离。
允许所有入口流量
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-all-ingress
spec:
podSelector: {}
ingress:
- {}
policyTypes:
- Ingress
有了这个策略,任何额外的策略都不会导致到这些 pod 的任何传入连接被拒绝。此策略对任何 pod 的出口隔离没有影响。
默认拒绝所有出口流量
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-egress
spec:
podSelector: {}
policyTypes:
- Egress
这确保了即使没有被任何其他 NetworkPolicy 选择的 Pod 也不会被允许出口流量。该策略不会改变任何 pod 的入口隔离行为。
允许所有出口流量
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-all-egress
spec:
podSelector: {}
egress:
- {}
policyTypes:
- Egress
有了这个策略,任何额外的策略都不会导致来自这些 pod 的任何传出连接被拒绝。此策略对进入任何 pod 的隔离没有影响。
默认拒绝所有入口和所有出口流量
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
这确保了即使没有被任何其他 NetworkPolicy 选择的 Pod 也不会被允许进入或流出流量。
样例三(针对于 Kubernetes v1.22 [beta])
针对一系列端口而不是单个端口
前提
您的集群必须使用CNI支持endPortNetworkPolicy 规范中的字段的插件。如果您的网络插件 不支持该endPort字段并且您使用该字段指定了 NetworkPolicy,则该策略将仅应用于单个port字段。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: multi-port-egress
namespace: default
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Egress
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 32000
endPort: 32768
上述规则允许role=db命名空间上带有标签的任何 Pod 通过 TCPdefault与范围内的任何 IP 进行通信10.0.0.0/24,前提是目标端口在范围 32000 和 32768 之间。
使用此字段时适用以下限制:
- 作为 Beta 功能,默认情况下启用此功能。要在集群级别禁用该字段,您(或您的 集群endPort管理员)需要 NetworkPolicyEndPort 使用--feature-gates=NetworkPolicyEndPort=false,….
- 该endPort字段必须等于或大于该port字段。
- endPortport如果也定义了,则只能定义。
- 两个端口都必须是数字。