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

mit*_*man 7 networking kubernetes kubernetes-networkpolicy

我是Kubernetes网络的新手.

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

现在,我们要防止的命名空间的豆荚namespace-a的服务,或者是部分荚交谈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
Run Code Online (Sandbox Code Playgroud)

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

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

小智 7

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

无论您需要什么网络插件,但并非所有插件都支持NetworkPolicyAPI对象.根据Declare网络策略演练,以下是支持的插件(可能是非详尽的)列表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
Run Code Online (Sandbox Code Playgroud)

对于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
Run Code Online (Sandbox Code Playgroud)

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

apiVersion: v1
kind: Namespace
metadata:
  name: namespace-a
  labels:
    name: namespace-a
    other: labelname
Run Code Online (Sandbox Code Playgroud)

我只是指出这一点,以避免混淆你的事实,我上面显示的标签恰好与你假设的命名空间名称相匹配.标签可以是任意的,潜在地包括多张命名空间-例如,你可能有namespace-a,并namespace-c均与一个名为标签other: labelname,这将允许您选择使用一个单一的多个命名空间namespaceSelector中的NetworkPolicy资源.