使用flannel+canal实现k8s的NetworkPolicy
· 阅读需 12 分钟
NetworkPolicy概述
官方说明:网络策略(NetworkPolicy)是一种关于pod间及pod与其他网络端点间所允许的通信规则的规范。
简单来说,NetworkPolicy就是对pod进行网络策略控制。用于为Kubernetes实现更为精细的流量控制,实现租户隔离机制。Kubernetes使用标准的资源对象NetworkPolicy供管理员按需定义网络访问控制策略。
NetworkPolicy策略模型
使用network policy资源可以配置pod的网络,networkPolicy是namespace scoped的,他只能影响某个namespace下的pod的网络出入站规则。

metadata描述信息。podSelectorpod选择器,选定的pod所有的出入站流量要遵循本networkpolicy的约束。policyTypes策略类型。包括了Ingress和Egress,默认情况下一个policyTypes的值一定会包含Ingress, 当有egress规则时,policyTypes的值中会包含Egress。ingress入站,即由其他网络端点发往特定Pod组的流量 ,通常由流量发出的源站点from和流量的目标端口所定义 。egress出站,即由特定的Pod组发往其他网络端点的流量 ,通常由流量的目标网络端点to和端口ports来进行定义 。port端口,TCP或UDP的端口号。to,from端点,流量目标和流量源相关的组件, 它可以是CIDR格式的IP地址块ipBlock、网络名称空间选择器namespaceSelector匹配的名称空间, 或Pod选择器podSelector匹配的Pod组。
对官方示例的说明:
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
该例子的效果如下:
1、default namespace下label包含role=db的pod,都会被隔绝,他们只能建立满足networkPolicy的ingress和egress描述的连接。即2-5点:
2、所有属于172.17.0.0/16网段的ip,除了172.17.1.0/24中的ip,其他的都可以与上述pod的6379端口建立tcp连接。
3、所有包含label:project=myproject的namespace中的pod可以与上述pod的6379端口建立tcp连接;
4、所有default namespace下的label包含role=frontend的pod可以与上述pod的6379端口建立tcp连接;
5、允许上述pod访问网段为10.0.0.0/24的目的ip的5978端口。
NetworkPolicy默认策略
默认情况下,如果名称空间中不存在任何策略,则所有进出该名称空间中的Pod的流量都被允许。以下示例用于更改该名称空间中的默认行为。
- 默认拒绝所有入口流量
通过创建选择所有容器但不允许任何进入这些容器的入口流量的
NetworkPolicy来为名称空间创建default隔离策略。这样可以确保即使容器没有选择其他任何NetworkPolicy,也仍然可以被隔离。此策略不会更改默认的出口隔离行为。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
spec:
podSelector: {}
policyTypes:
- Ingress
- 默认允许所有入口流量
如果要允许所有流量进入某个命名空间中的所有
Pod(即使添加了导致某些Pod被视为“隔离”的策略),则可以创建一个策略来明确允许该命名空间中的所有流量。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-all
spec:
podSelector: {}
ingress:
- {}
policyTypes:
- Ingress
- 默认拒绝所有出口流量
通过创建选择所有容器但不允许来自这些容器的任何出口流量的
NetworkPolicy来为名称空间创建default egress隔离策略。这样可以确保即使没有被其他任何NetworkPolicy