Calico 的网络策略无法选择 kubernetes.default service



我正在使用googlespark操作符和一些calico网络策略来保护命名空间。

Spark驱动程序pod需要能够与default命名空间中的kubernetes服务进行通信,以便与api服务器进行通信
这就是我得到的:

Operation: [get]  for kind: [Pod]  with name: [xx]  in namespace: [xx]  failed.

问题是:
使用任何类型的网络策略都会阻止与默认命名空间的通信。恢复连接是可能的,但选择kubernetes.default服务仍然是不可能的,因为它是一个特定的服务(没有选择器(。。。所以你不能和它交流


我尝试打开与default+kube-system命名空间中所有pod的通信。它适用于所有服务,但kubernetes.default仍然无法访问!

apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
name: mynetpol
spec:
selector: all()
types:
- Egress
egress:
# Allows comm to kube-system namespace
- action: Allow
destination:
selector: all()
namespaceSelector: ns == 'kube-system'
- action: Allow
source:
selector: all()
namespaceSelector: ns == 'kube-system'
# Allows comm to default namespace
- action: Allow
destination:
selector: all()
namespaceSelector: ns == 'default'
- action: Allow
source:
selector: all()
namespaceSelector: ns == 'default'

由于某些原因,尽管所有通信都是完全开放的,但卷曲kubernetes.default.svc.cluster.local:443超时事件。

所以。。。最后

网络策略不适用于不以pod为目标的服务,这就是这个特定的kubernetes服务安静地位于default命名空间中的情况。它是一个特殊的服务,总是指向api服务器。


解决方案是检索api服务器的真实IP并允许egress访问它

要找到这个IP,您可以使用以下命令:

kubectl get endpoints --namespace default kubernetes

由@Dave McNeill提供

然后,您可以在网络策略中允许此IP。

  • 如果您使用默认的netpol API,请检查Dave的答案https://stackoverflow.com/a/56494510/5512455

  • 如果你正在使用印花布政策,我鼓励你这样做,因为Kube政策很糟糕,下面是工作原理:

kind: NetworkPolicy
metadata:
name: allow-egress-api-server
spec:
selector: all()
types:
- Egress
egress:
# Allow api-server
- action: Allow
protocol: TCP
destination:
nets:
- <Your api-server IP>/32
ports:
- 6443

相关内容

  • 没有找到相关文章

最新更新