12

我是 Kubernetes 网络的新手。

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

现在,我们要防止命名空间namespace-a的 pod 与属于其一部分的服务或 pod 通信namespace-b反之亦然命名空间内的通信应该不受限制。

这是我在网络策略文档中找到的示例: 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?我应该选择哪一个?
4

1 回答 1

15

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

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

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

我应该选择哪一个?

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

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

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

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

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

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

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-a并且namespace-c两者都带有一个名为的标签,该标签允许您在资源中other: labelname使用单个命名空间来选择多个命名空间。namespaceSelectorNetworkPolicy

于 2018-02-21T13:58:39.907 回答