-1

我正在使用google spark-operator和一些calico网络策略来保护命名空间。

Spark 驱动程序 pod 需要能够与命名空间中的kubernetes服务通信default才能与 api-server 对话。
这就是我得到的:

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,尽管所有通信都是开放的,但会出现冰壶超时事件。

4

1 回答 1

1

所以……最后……

网络策略不适用于不针对 pod 的服务,这就是这个特定kubernetes服务安静地位于default命名空间中的情况。这是一项始终指向 api-server 的特殊服务。


解决方案是检索 api-server 的真实 IP 并允许egress访问它。

要查找此 IP,您可以使用以下命令:

kubectl get endpoints --namespace default kubernetes

由@Dave McNeill 提供

然后你可以在你的网络策略中允许这个 IP。

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

  • 如果您使用的是 calico 策略,我鼓励您这样做,因为 Kube 的策略很糟糕,以下是工作 yaml:

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
于 2021-05-04T15:08:37.673 回答