一、简介

NetworkPolicy 是在 k8s 中用于管理网络流量的对象,它允许指定哪些流量可以进入和离开 Pod。

NetworkPolicy分为Ingress和Egress两种类型:

  • Ingress NetworkPolicy
  • 用于控制从其他 Pod 或外部网络流入的流量。使用 Ingress NetworkPolicy 来允许或拒绝特定IP地址、协议和端口的流量。
  • Egress NetworkPolicy
  • 用于控制从 Pod 流出的流量。使用 Egress NetworkPolicy 来允许或拒绝特定IP地址、协议和端口的流量。

二、例子

2.1 不允许访问外网

# 命名空间 default 下具有标签“app=test”的 pod 只允许访问192.168.0.0/16 网段。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
app: test
policyTypes:
- Egress
egress:
- to:
- ipBlock:
cidr: 192.168.0.0/16

2.2 允许命名空间访问特定 pod

# 只允许来自拥有标签“project=test”的命名空间的服务对命名空间 test1 中监听端口为“9000”的 pod 的访问。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-port-from-namespace
namespace: test1
spec:
podSelector:
matchLabels: {}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
project: test # 我们给echo 打的标签
ports:
- protocol: TCP
port: 9000

2.3 允许来自特定 IP 地址的流量访问 pod

#  在命名空间 test2 中,拥有标签“app: test2”的pod,只允许来自IP地址192.168.1.100的流量访问TCP协议的5432端口。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-db-access
namespace: test2
spec:
podSelector:
matchLabels:
app: my-app
ingress:
- from:
- ipBlock:
cidr: 192.168.10.100/32
ports:
- protocol: TCP
port: 5432

2.4 允许Pod访问特定服务

# 在命名空间 test3 中,拥有标签“app: test3”的pod,只允许向IP地址10.0.0.100的服务发出TCP协议的80端口流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-external-access
namespace: test3
spec:
podSelector:
matchLabels:
app: test3
egress:
- to:
- ipBlock:
cidr: 10.0.0.100/32
ports:
- protocol: TCP
port: 80