防止 Kubernetes 中的命名空间间通信

Prevent inter-namespace communication in Kubernetes

我是 Kubernetes 网络的新手。

我们将 Kubernetes 集群分成一组命名空间(例如 namespace-anamespace-b)。每个命名空间都有一组 Kubernetes pods。每个 pod 都有一项服务,可在 my-svc.namespace-x.svc.cluster.local.

现在,我们想要防止 pods 命名空间namespace-a 与属于[=12] 的服务或pods 通信=] 和 反之亦然 命名空间内的通信应该不受限制。

这是我在网络策略文档中找到的示例: https://kubernetes.io/docs/concepts/services-networking/network-policies/#the-networkpolicy-resource

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

据我所知,这会完全阻止整个命名空间中所有 pods 的网络通信。

Do I need a networking plugin, such as Calico, Flannel or Weave?

不管你需要什么网络插件,但并不是所有的插件都支持NetworkPolicy API对象。根据 Declare Network Policy walkthrough,以下是(可能 non-exhaustive)支持 NetworkPolicy 的插件列表:

如果没有支持 NetworkPolicy 的插件,创建资源将无效。

Which one should I choose?

至于你应该选择哪一个,Whosebug不是征求意见的地方。我可以推荐的是阅读 overview/features 文档以了解各种可用选项。也许在本地开发集群中尝试一两个不同的插件,以感受它们安装、维护和更新的难易程度。

How can I allow all network traffic, but only within a particular namespace?

鉴于您的示例设置,我认为以下 NetworkPolicy 资源可以满足您的需求:

对于 namespace-a 中的 pods,只允许从 namspace-a pods 进入,拒绝从任何其他来源进入。出口不受限制:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: namespace-a
spec:
  policyTypes:
  - Ingress
  podSelector: {}
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          name: namespace-a

对于 namespace-b 中的 pods,只允许从 namspace-b pods 进入,拒绝从任何其他来源进入。出口不受限制:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: namespace-b
spec:
  policyTypes:
  - Ingress
  podSelector: {}
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          name: namespace-b

请注意,这假设您已经在命名空间上设置了 name: namespace-aname: namespace-b 标签,类似于:

apiVersion: v1
kind: Namespace
metadata:
  name: namespace-a
  labels:
    name: namespace-a
    other: labelname

我指出这一点只是为了避免让您对我上面显示的标签恰好与您假设的命名空间名称相匹配这一事实感到困惑。标签可以是任意的,并且可能包含多个名称空间——例如,您可能有 namespace-anamespace-c,它们都带有一个名为 other: labelname 的标签,这将允许您 select 多个在您的 NetworkPolicy 资源中使用单个 namespaceSelector 的命名空间。