calico 全球网络策略中的隐式拒绝?

问题描述

我对全局网络策略的这种行为感到困惑。采取以下措施。

apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
Metadata:
  name: allow-dns-for-all-policy
spec:
  namespaceSelector: has(projectcalico.org/name) && projectcalico.org/name not in {"kube-system","calico-system"}
  order: 0
  egress:
  # allow all namespaces to communicate to DNS pods
  - action: Allow
    protocol: UDP
    destination:
      ports:
      - 53
  ingress:
  - action: Allow

当我在“测试”命名空间中从一个 pod 到另一个 pod 执行 wget 时,它显然可以解析 dns 但不返回包:

Resolving Nginx-test (Nginx-test)... 10.233.8.253
Connecting to Nginx-test (Nginx-test)|10.233.8.253|:80... Failed: Connection timed out.

集群上没有其他策略,尤其是没有认拒绝策略。我还测试了没有 namespaceSelector。只有当我添加与 * 匹配的第二个 Allow 规则时,或者当我删除整个策略时,我才能成功返回。

这是为什么?由于不存在拒绝规则,我原以为此政策不会影响沟通。

解决方法

事实证明,如果在 ressource calico 上至少有一个入口/出口规则匹配,则会自动向入口/出口添加默认拒绝规则。

如果没有适用于 Pod 的网络策略,则允许进出该 Pod 的所有流量。 如果一个或多个网络策略应用于包含入口规则的 pod,则只允许这些策略明确允许的入口流量。 如果一个或多个网络策略应用于包含出口规则的 pod,则只允许这些策略明确允许的出口流量。

https://docs.projectcalico.org/security/calico-network-policy