问题描述
在Kubernetes中,我们使用Service
来暴露Pod
,以便在容器中抽象出应用程序的访问方式。Service
允许我们在不同的Pod之间进行负载均衡,并支持蓝/绿部署和零停机部署等场景。在创建NetworkPolicy
资源时,需要使用podSelector
来确定应用网络策略的Pod
。然而,考虑到必须先创建Service
来暴露Pod
,为什么在NetworkPolicy
中使用的是podSelector
而不是一种“serviceSelector”?使用“serviceSelector”这种概念会更加通用和抽象,更能反映出策略实际上允许的访问。为什么网络策略要应用于Pod
,而不是服务?(并不是说永远不会将NetworkPolicy
直接应用于Pod
,但通常情况下,我们将其应用于通过Service
暴露的Pod
上。或者我可能完全错误?)
解决方案
为什么选择Pod选择器
在Kubernetes中,Pods
是部署单元,并且是集群内拥有唯一IP地址的单位。你可以直接通过Pods
访问,而无需通过Service
。Service
的主要作用是为应用程序获取一个“稳定”的地址,这个地址会进行负载均衡,分发到代表Service
的任何Pod
上。Pods
和Service
都在集群中有一个DNS名称。
Service
具有选择器来标识属于该Service
的Pods
,但一个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
级别进行。