网络策略
网络策略(Network Policy)是一个特定的配置, 用于限制一组pod如何和另外一个pod或网络endpoint进行通信。 网络策略使用标签(label)来选择pods,并定义规则, 指定那些流量可以达到哪些pods。 前提: 要是网络策略生效, 必须要安装支持网络策略的网络插件,否则网络策略不会生效
默认情况下, 所有的pod都是非隔离,意味着它会放行所有来源的流量。 但是对于应用了网络策略的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
下面对这个网络策略进行说明: 强制必须有的字段: apiVersion,kind, metadata spec: 包含定义网络策略的所有相关信息 podSelector: 选择目的pods, 如果为空, 则选择所有的pods policyTypes: 可选值为Ingress, Egress或二者, 如果为空, 则Ingress会被设定, 当有egress规则时, Egress类型也会被设定 ingress:入向规则的白名单规则列表, 每条规则放行匹配到from和ports的流量。流量的源要么要么来自namespaceSelector或者来自podSelector的pod, 都会被匹配到。 egress: 出向规则的白名单规则列表。 每条规则放行匹配到to和ports的流量 ipBlock: ip块定义CIDR, except则把某段ip, 从大的ip 网段里排除掉 上述示例中的规则整体的意思是:
- 隔离pod标签为“role=db”, 命名空间为default的pods的入向和出向流量
- 允许pod标签为“role=frontend”, 命名空间为default的pods访问pod标签为“role=db”, 命名空间为default的pods的6379的TCP端口
- 允许namespace标签为“project=myproject”的pods访问pod标签为“role=db”, 命名空间为default的pods的6379的TCP端口
- 允许pod标签为“role=db”, 命名空间为default的pods访问10.0.0.0/24网段的TCP端口5978
当命名空间里没有任何的网络策略时, 默认情况下,所有pods的出流量和入流量都会被放行。
你可以可以定义一些规则来修改默认行为,比如:
- 默认拒绝所有的入流量
- 默认允许所有的入流量
- 默认拒绝所有的出流量
- 默认允许所有的出流量
- 默认拒绝所有的出流量和入流量