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

标签 networking kubernetes kubernetes-networkpolicy

我是 Kubernetes 网络的新手。

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

现在,我们要防止 命名空间的 Pod namespace-a与属于 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?我应该选择哪一个?
  • 最佳答案

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



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

  • 没有支持 NetworkPolicy 的插件,创建资源将不起作用。

    Which one should I choose?



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

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



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

    对于 namespace-a 中的 pod , 只允许来自 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 中的 pod , 只允许来自 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 的标签这将允许您使用单个 namespaceSelector 选择多个命名空间在您的 NetworkPolicy资源。

    关于networking - 防止 Kubernetes 中的命名空间间通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48894816/

    相关文章:

    Java + UDP + DatagramSocket : Why is a PortUnreachableException thrown, 当 UDP 被设计为无连接时?

    python - 在套接字传输中接收额外字节

    kubernetes - 在 kubernetes 中创建 pod 所涉及的步骤

    kubernetes - AKS |网络政策|使用Azure CNI时阻止入口流量

    kubernetes - 多节点集群的网络策略行为

    kubernetes - 是否可以在 Kubernetes 中公开 initContainers 上的端口?

    c++ - UDP 在第一次后停止发送

    networking - 带有FIN标志的TCP数据包也能有数据吗?

    kubernetes - 可以在GKE GCP中删除具有k8s-fw *的防火墙吗

    kubernetes - terraform-kubernetes-provider 如何从文件创建 secret ?