NetworkPolicy:为什么使用Pod选择器而不是”Service选择器”?

72次阅读
没有评论

问题描述

在Kubernetes中,我们使用Service来暴露Pod,以便在容器中抽象出应用程序的访问方式。Service允许我们在不同的Pod之间进行负载均衡,并支持蓝/绿部署和零停机部署等场景。在创建NetworkPolicy资源时,需要使用podSelector来确定应用网络策略的Pod。然而,考虑到必须先创建Service来暴露Pod,为什么在NetworkPolicy中使用的是podSelector而不是一种“serviceSelector”?使用“serviceSelector”这种概念会更加通用和抽象,更能反映出策略实际上允许的访问。为什么网络策略要应用于Pod,而不是服务?(并不是说永远不会将NetworkPolicy直接应用于Pod,但通常情况下,我们将其应用于通过Service暴露的Pod上。或者我可能完全错误?)

解决方案

为什么选择Pod选择器

在Kubernetes中,Pods是部署单元,并且是集群内拥有唯一IP地址的单位。你可以直接通过Pods访问,而无需通过ServiceService的主要作用是为应用程序获取一个“稳定”的地址,这个地址会进行负载均衡,分发到代表Service的任何Pod上。PodsService都在集群中有一个DNS名称。

Service具有选择器来标识属于该ServicePods,但一个Pod可以从多个Service接收流量。同样,NetworkPolicy也具有选择器来选择应用策略的Pods。由于Pod是Kubernetes中最小的单位,拥有自己的唯一网络地址,因此在这个层面上添加网络安全性(例如NetworkPolicy)是有意义的。

网络安全的考虑

尽管Service具有IP地址,但是需要保护的是Pods的访问。Service仅仅是为了更容易的抽象而提供的虚拟IP,但流量实际上是发送到Pods,而Pods可以直接访问(除非通过NetworkPolicy进行保护)。

结论

虽然在Kubernetes中Service也有IP地址,但是由于Pods是部署单元并且拥有唯一IP地址,因此将网络策略应用于Pods级别是更为合适的。Service是为了在不同Pods之间提供稳定的访问地址,而Pods才是需要保护的实际访问目标。尽管Service提供了抽象,但实际的流量仍然直接与Pods交互,因此网络策略的应用也应该在Pods级别进行。

正文完