全局策略默认允许命名空间内的流量

Global Policy to default allow traffic within namespaces

我们正在使用 calico 设置严格的默认拒绝策略,以禁用除故障安全规则之外的任何流量。现在我们有多个名称空间,而且这些名称空间还在增加,因为每个应用程序都包含多个名称空间。

现在的想法是默认允许具有高于默认拒绝顺序的名称空间内的流量。但是我在这里没有成功找到可扩展的方法。看来我们需要为每个看起来几乎相同的新命名空间明确地创建一个 NetworkPolicy。

我正在寻找这样的东西:您定义一次规则,它适用于带有 allow-all-in-ns 标签的名称空间中的所有资源。

apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
  name: allow-self-policy
spec:
  namespaceSelector: 'has(allow-all-in-ns)'
  ingress:
  - action: Allow
    source:
      namespaceSelector: has(allow-all-in-ns) && self
  egress:
  - action: Allow
    source:
      namespaceSelector: has(allow-all-in-ns) && self

我不想在带有标签 allow-all-in-ns 的名称空间之间进行任何通信,但我希望在带有此标签的每个名称空间内部进行通信。这目前可以通过 calico 的功能集实现吗?

虽然 Namespaces 允许您将对象隔离到特定的组中,但它们不提供任何类型的隔离。可能有 crossname space 流量(有关更多详细信息,请参阅 here),这意味着如果容器仅使用 ,它将解析为 namespace 的本地服务。这对于在多个名称 space 中使用相同的配置很有用,例如开发、暂存和生产。如果你想跨越 namespaces,你需要使用完全限定的域名 (FQDN)。

为了解决这个问题,我们有 NetworkPolicy 一旦应用了适当的选择器就可以用来隔离集群对象之间的流量。您可以查看更多相关信息 here.

很遗憾,无法获得您所描述的内容,如果我正确理解您要应用的政策,您将拒绝访问您的 kube-system pods,尤其是 core-dns 这对于集群网络至关重要。

由于 GlobalNetworkPolicy 在全球范围内适用,您可以将其用于 default-deny 除了带有 kube-system 的所有内容,然后对每个 pod 使用 NetworkPolicies 并限制它们的 egressingress 带有一些标签,只为允许的流量留出位置。

可以命令 Calico 策略规则在 K8s 策略之前或之后执行,并包括许多操作,例如拒绝和记录。这允许安全/集群操作团队定义基本的高级 moge 通用规则,同时授权开发人员/服务/集群用户团队在他们负责的应用程序和服务上定义他们自己的细粒度规则。查看此 doc 以了解有关评估顺序的更多信息。

由于 Calico 策略规则可以在 Kubernetes 网络策略之前或之后被强制执行,并且可以包括拒绝和记录等操作,这允许安全/集群操作团队定义基本的更高级别更通用的目的规则,同时授权开发人员/服务团队对他们负责的应用程序和服务定义自己的细粒度约束。

由于网络策略的灵活性,通常有多种不同的标记和编写策略的方式可以实现相同的特定目标。

最常见的方法之一是拥有适用于所有 pods 的少量全局策略,然后是一个特定于 pod 的策略,该策略定义特定于该 pod 的所有入口和出口规则豆荚。

您可以在 calico site 阅读更多关于最佳实践和 default-deny 的信息。

总而言之,在查看了 calico 文档之后,不可能有一个单一的规则可以实现您想要实现的目标。实现它的另一种方法可能是使用 helm 及其图表来自动执行额外网络策略创建过程。