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

Posted

技术标签:

【中文标题】防止 Kubernetes 中的命名空间间通信【英文标题】:Prevent inter-namespace communication in Kubernetes 【发布时间】:2018-07-31 09:06:09 【问题描述】:

我是 Kubernetes 网络的新手。

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

现在,我们希望防止命名空间 namespace-a 的 Pod 与属于 namespace-b 的服务或 Pod 通信,反之亦然。命名空间的通信应该不受限制。

这是我在网络策略文档中找到的示例: 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

据我了解,对于跨命名空间的所有 pod,这完全阻止了网络通信。

如何允许所有网络流量,但只允许特定命名空间内? 是否需要网络插件,例如 Calico、Flannel 或 Weave?我应该选择哪一个?

【问题讨论】:

您可以在此处找到许多网络策略示例:github.com/ahmetb/kubernetes-network-policy-recipes 【参考方案1】:

我是否需要网络插件,例如 Calico、Flannel 或 Weave?

无论您需要什么网络插件,但并非所有插件都支持NetworkPolicy API 对象。根据Declare Network Policy walkthrough,以下是支持NetworkPolicy 的插件列表(可能并非详尽无遗):

Calico Cilium Kube-router Romana Weave Net

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

我应该选择哪一个?

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

如何允许所有网络流量,但只允许在特定命名空间内?

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

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

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 中的 pod,只允许来自 namspace-b pod 的入口,拒绝来自任何其他来源的入口。出口不受限制:

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 的标签,这将允许您使用 @ 中的单个 namespaceSelector 选择多个命名空间987654344@资源。

【讨论】:

以上是关于防止 Kubernetes 中的命名空间间通信的主要内容,如果未能解决你的问题,请参考以下文章

如何在一个 Kubernetes 集群中的命名空间之间隔离 Keycloak Infinispan,以防止 KC pod 相互发现和同步

如何使用网络策略停止所有外部流量并仅允许命名空间内的 Pod 间网络调用?

kubernetes pod重新调度,部署到不同的命名空间后会在不同的节点上运行。

如何从默认 kops 命令更改 kubernetes 上下文中的默认命名空间?

Linux进程间通信-命名管道

优雅的方法来防止C ++中的命名空间中毒