网络策略(网络隔离策略)
指定Pod间的网络隔离策略,默认是所有互通。
Pod 之间互通,是通过如下三个标识符的组合来辩识的:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector: ## 选中指定Pod
matchLabels:
role: db
policyTypes: ## 定义上面Pod的入站出站规则
- 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
字段
NetworkPolicy
的spec字段包含了定义网络策略的主要信息:
.spec.podSelector
的 Pod 都将应用这个 NetworkPolicy
。上面的 Example中的 podSelector 选择了 role=db
的 Pod。如果该字段为空,则将对名称空间中所有的 Pod 应用这个 NetworkPolicy
.spec.policyTypes
是一个数组类型的字段,该数组中可以包含 Ingress
、Egress
中的一个,也可能两个都包含。该字段标识了此 NetworkPolicy
是否应用到 入方向的网络流量、出方向的网络流量、或者两者都有。如果不指定 policyTypes
字段,该字段默认将始终包含 Ingress
,当 NetworkPolicy
中包含出方向的规则时,Egress
也将被添加到默认值。
from
和ports
匹配的入方向的网络流量发生。例子中的ingress
包含了一条规则,允许的入方向网络流量必须符合如下条件:
6379
172.17.0.0/16
网段,但是不包括 172.17.1.0/24
网段
project=myproject
role=frontend
egress
是一个数组,代表出方向的白名单规则。每一条规则都将允许与to
和ports
匹配的出方向的网络流量发生。例子中的egress
允许的出方向网络流量必须符合如下条件:
5978
10.0.0.0/24
网段
因此,例子中的 NetworkPolicy
对网络流量做了如下限制:
default
名称空间中带有 role=db
标签的所有 Pod 的入方向网络流量和出方向网络流量
default
名称空间中所有带role=db
标签的 Pod 的6379端口:
172.17.0.0/16
网段,但是不包括 172.17.1.0/24
网段
project=myproject
role=frontend
5978
10.0.0.0/24
网段
NetworkPolicy 的 .spec.ingress.from
和 .spec.egress.to
字段中,可以指定 4 种类型的标签选择器:
NetworkPolicy
同名称空间中的 Pod 作为入方向访问控制规则的源或者出方向访问控制规则的目标
to
/ from
条目中同时包含 namespaceSelector
和 podSelector
将选中指定名称空间中的指定 Pod。此时请特别留意 YAML 的写法,如下所示:
...
ingress:
- from:
- namespaceSelector:
matchLabels:
user: alice
podSelector:
matchLabels:
role: client
...
该例子中,podSelector 前面没有 -
减号,namespaceSelector 和 podSelector 是同一个 from 元素的两个字段,将选中带 user=alice
标签的名称空间中所有带 role=client
标签的 Pod。但是,下面的这个 NetworkPolicy 含义是不一样的:
...
ingress:
- from:
- namespaceSelector:
matchLabels:
user: alice
- podSelector:
matchLabels:
role: client
...
后者,podSelector 前面带 -
减号,说明 namespaceSelector 和 podSelector 是 from 数组中的两个元素,他们将选中 NetworkPolicy 同名称空间中带 role=client
标签的对象,以及带 user=alice
标签的名称空间的所有 Pod。
前者是交集关系(且),后者是并集关系(或)
集群的入方向和出方向网络机制通常需要重写网络报文的 source 或者 destination IP。kubernetes 并未定义应该在处理 NetworkPolicy
之前还是之后再修改 source / destination IP,因此,在不同的云供应商、使用不同的网络插件时,最终的行为都可能不一样。这意味着:
参考官网文档:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。