46-Network Policy
Network Policy
网络策略说明一组 Pod
之间是如何被允许互相通信,以及如何与其它网络NetworkPolicy
资源使用标签来选择 Pod
,并定义了一些规则,这些规则指明允许什么流量进入到选中的 Pod
上。关于
前提条件
网络策略通过网络插件来实现,所以必须使用一种支持 NetworkPolicy
的网络方案(如 calico)—— 非
隔离的与未隔离的Pod
默认
NetworkPolicy
资源
下面是一个 NetworkPolicy
的例子:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress:
- from:
- ipBlock:
cidr: 172.17.0.0/16
except:
- 172.17.1.0/24
- namespaceSelector:
matchLabels:
project: myproject
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 6379
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 5978
将上面配置
必选字段:像所有其它NetworkPolicy
需要 apiVersion
、kind
和 metadata
这三个字段,关于如何使用配置文件的基本信息,可以查看 这里。
spec:NetworkPolicy
podSelector:每个 NetworkPolicy
包含一个 podSelector
,它可以选择一组应用了网络策略的NetworkPolicy
当前只支持定义 ingress
规则,这个 podSelector
实际上为该策略定义了一组 “目标podSelector
选择了该
ingress:每个NetworkPolicy
包含了一个白名单 ingress
规则列表。每个规则只允许能够匹配上 from
和 ports
配置段的流量。示例策略包含了单个规则,它从这两个源中匹配在单个端口上的流量,第一个是通过namespaceSelector
指定的,第二个是通过 podSelector
指定的。
egress:每个NetworkPolicy
包含了一个白名单 ingress
规则列表。每个规则只允许能够匹配上 to
和 ports
配置段的流量。示例策略包含了单个规则,它匹配目的地 10.0.0.0/24
单个端口的流量。
因此,上面示例的
- 在 “default”
Namespace 中 隔离了标签 “role=db” 的Pod (如果他们还没有被隔离) - 在 “default”
Namespace 中,允许任何具有 “role=frontend” 的Pod ,IP 范围在172.17.0.0 –172.17.0.255 和172.17.2.0 –172.17.255.255(整个172.17.0.0/16 段,172.17.1.0/24 除外)连接到标签为 “role=db” 的Pod 的TCP 端口6379 - 允许在
Namespace 中任何具有标签 “project=myproject” ,IP 范围在10.0.0.0/24 段的Pod ,连接到 “default”Namespace 中标签为 “role=db” 的Pod 的TCP 端口5978
查看
默认策略
通过创建一个可以选择所有
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
spec:
podSelector:
这确保了即使是没有被任何
可选地,在
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-all
spec:
podSelector:
ingress:
- {}