k8s network policy配置,看这篇就够了

这是一篇关于k8s的网络策略配置说明
用户在使用k8s中,有对网络策略的配置需求,有时候希望不同的之间不能互相访问,但是我们知道k8s中所有的pod之间都是可以互相访问的,这个时候就需要网络策略来帮助我们实现这个诉求,网络策略依赖于cni网络插件,不是所有的网络插件都支持网络策略,支持网络策略,而不支持 。
接下来我以一张图来说明k8s的资源的配置
整个图总接下来如下:
入口规则:
仅允许 1.来自(from)命名空间(spec/ingress/from/namespaceSlecetor)下所有pod2. 策略所在命名空间下pod满足(spec/ingress/from/podSelector)3.ip段满足(spec/ingress/from/ipblock)的pod以什么协议访问本命名空间下的满足(spec/podSelector)的pod的某个端口或某个段的端口
出口规则:
仅允许本命名空间下的满足(spec/podSelector)的pod去访问(to)1.命名空间(spec/ingress/from/namespaceSlecetor)下的所有pod 2.本命名空间满足(spec/ingress/from/podSelector)的pod3. ip段满足(spec/ingress/from/ipblock)的pod的某个端口或某个段的端口
下面是官方的一个例子,来帮助大家理解,具体的配置及意义
apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata:name: test-network-policynamespace: defaultspec:podSelector:matchLabels:role: dbpolicyTypes:- Ingress- Egressingress:- from:- ipBlock:cidr: 172.17.0.0/16except:- 172.17.1.0/24- namespaceSelector:matchLabels:project: myproject- podSelector:matchLabels:role: frontendports:- protocol: TCPport: 6379egress:- to:- ipBlock:cidr: 10.0.0.0/24ports:- protocol: TCPport: 5978
必需字段:与所有其他的配置一样,需要 、 kind 和字段 。关于配置文件操作的一般信息,请参考 使用配置容器, 和对象管理 。
spec: 规约 中包含了在一个名字空间中定义特定网络策略所需的所有信息 。
:每个都包括一个,它对该策略所 适用的一组 Pod 进行选择 。示例中的策略选择带有 “role=db” 标签的 Pod 。空的选择名字空间下的所有 Pod 。
: 每个都包含一个列表,其中包含或或两者兼具 。字段表示给定的策略是应用于 进入所选 Pod 的入站流量还是来自所选 Pod 的出站流量,或两者兼有 。如果未指定则默认情况下始终设置 ; 如果有任何出口规则的话则设置。
: 每个可包含一个规则的白名单列表 。每个规则都允许同时匹配 from 和 ports 部分的流量 。示例策略中包含一条 简单的规则: 它匹配某个特定端口,来自三个来源中的一个,第一个通过指定,第二个通过指定,第三个通过指定 。

k8s network policy配置,看这篇就够了

文章插图
: 每个可包含一个规则的白名单列表 。每个规则都允许匹配 to 和 port 部分的流量 。该示例策略包含一条规则,该规则将指定端口上的流量匹配到 10.0.0.0/24 中的任何目的地 。
所以,该网络策略示例:
隔离 “” 名字空间下 “role=db” 的 Pod (如果它们不是已经被隔离的话) 。
( 规则)允许以下 Pod 连接到 “” 名字空间下的带有 “role=db” 标签的所有 Pod 的 6379 TCP 端口:
1) "default" 名字空间下带有 "role=frontend" 标签的所有 Pod2)带有 "project=myproject" 标签的所有名字空间中的 Pod3)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)
( 规则)允许从带有 “role=db” 标签的名字空间下的任何 Pod 到 CIDR 10.0.0.0/24 下 5978 TCP 端口的连接 。
参考:
【k8s network policy配置,看这篇就够了】