Kubernetes 官方网址介绍
Network Policy提供了基于策略的网络控制,用于隔离应用并减少攻击面。它使用标签选择器模拟传统的分段网络,并通过策略控制它们之间的流量以及来自外部的流量。
在使用Network Policy之前,需要注意
- apiserver开启extensions/v1beta1/networkpolicies
- 网络插件要支持Network Policy,如Calico、Romana、Weave Net和trireme等
1、Namespace隔离
默认情况下,所有Pod之间是全通的。每个Namespace可以配置独立的网络策略,来隔离Pod之间的流量。比如隔离namespace的所有Pod之间的流量(包括从外部到该namespace中所有Pod的流量以及namespace内部Pod相互之间的流量):
kubectl annotate ns <namespace> "net.beta.kubernetes.io/network-policy={\"ingress\": {\"isolation\": \"DefaultDeny\"}}"注:目前,Network Policy仅支持Ingress流量控制。
2、Pod隔离
通过使用标签选择器(包括namespaceSelector和podSelector)来控制Pod之间的流量。比如下面的Network Policy
- 允许IP范围172.17.0.0/16或者172.17.1.0/24访问,带有的default Pod带有role=db标签
- 允许namespace带有project=myproject标签访问,带有的default Pod带有role=db标签
- 允许当前namespace Pod带有role=frontend标签访问,带有的default Pod带有role=db标签
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: db # 对当前namespace default中Pod带有role=db标签生效
policyTypes:
- Ingress
- Egress
ingress: # 入站规则
- from:
- ipBlock:
cidr: 172.17.0.0/16 # 允许网段
except:
- 172.17.1.0/24 # 排除网段
- namespaceSelector:
matchLabels:
project: myproject # 允许标签带有project=myproject namespace访问
- podSelector:
matchLabels:
role: frontend # 允许当前namespace Pod带有role=frontend标签访问
ports:
- protocol: TCP # 支持的协议有TCP, UDP, SCTP
port: 6379
egress: # 出站规则
- {} # 允许所有出站规则
说明: 除非选择支持网络策略的网络解决方案,否则将上述示例发送到API服务器没有任何效果。
必需字段:与所有其他的 Kubernetes 配置一样,NetworkPolicy 需要 apiVersion、 kind 和 metadata 字段。关于配置文件操作的一般信息, 请参考配置 Pod 以使用 ConfigMap 和对象管理。
spec:NetworkPolicy 规约 中包含了在一个名字空间中定义特定网络策略所需的所有信息。
podSelector:每个 NetworkPolicy 都包括一个 podSelector, 它对该策略所适用的一组 Pod 进行选择。示例中的策略选择带有 “role=db” 标签的 Pod。 空的 podSelector 选择名字空间下的所有 Pod。
policyTypes:每个 NetworkPolicy 都包含一个 policyTypes 列表,其中包含 Ingress 或 Egress 或两者兼具。policyTypes 字段表示给定的策略是应用于进入所选 Pod 的入站流量还是来自所选 Pod 的出站流量,或两者兼有。 如果 NetworkPolicy 未指定 policyTypes 则默认情况下始终设置 Ingress; 如果 NetworkPolicy 有任何出口规则的话则设置 Egress。
ingress:每个 NetworkPolicy 可包含一个 ingress 规则的白名单列表。 每个规则都允许同时匹配 from 和 ports 部分的流量。示例策略中包含一条简单的规则: 它匹配某个特定端口,来自三个来源中的一个,第一个通过 ipBlock 指定,第二个通过 namespaceSelector 指定,第三个通过 podSelector 指定。
egress:每个 NetworkPolicy 可包含一个 egress 规则的白名单列表。 每个规则都允许匹配 to 和 port 部分的流量。该示例策略包含一条规则, 该规则将指定端口上的流量匹配到 10.0.0.0/24 中的任何目的地。
所以,该网络策略示例:
- “default” 名字空间下带有 “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)
2、默认规则
不定义规则并非没有规则,此时默认规则生效,以下展示默认规则用法。
1、默认禁止所有入pod流量
apiVersion: networking.k8s.io/v1kind: NetworkPolicy
metadata:
name: default-deny
spec:
podSelector: {}
policyTypes:
-
上例中没有定义pod选择器,表示如果namespace下的某个pod没有被任何Network Policy对象选中,则应用此对象,如果被其它Network Policy先中则不应用此对象。
policyTypes的值为Ingress,表示本例启用Ingress规则。但是本例没有定义具体的Ingress,那就应用默认规则。默认规则禁止所有入pod流量,但例外情况是如果source就是pod运行的节点,则允许通过。
2、默认允许所有入pod流量
apiVersion: networking.k8s.io/v1kind: NetworkPolicy
metadata:
name: allow-all
spec:
podSelector: {}
ingress:
- {}
同样没有定义pod选择器,意义与上例同。注意ingress的定义,这个是有规则的,只是规则中的条目为空,与默认规则不同,表示全部允许通过。
3、默认禁止所有出pod流量
apiVersion: networking.k8s.io/v1kind: NetworkPolicy
metadata:
name: default-deny
spec:
podSelector: {}
policyTypes:
-
与默认禁止所有入pod流量(Default deny all ingress traffic)同,只是流量由入变成出
4、默认允许所有出pod流量
apiVersion: networking.k8s.io/v1kind: NetworkPolicy
metadata:
name: allow-all
spec:
podSelector: {}
egress:
- {}
policyTypes:
-
与默认允许所有入pod流量(Default allow all ingress traffic)同,只是流量由入变成出。
5、默认禁止所有入出pod流量
apiVersion: networking.k8s.io/v1kind: NetworkPolicy
metadata:
name: default-deny
spec:
podSelector: {}
policyTypes:
- Ingress
-
无需详解,但请注意,pod与所运行节点之间流量不受Network Policy限制。