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

时间:2021-01-13 21:20:49

标签: nginx kubernetes 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 规则时,或者当我删除整个策略时,我才能成功返回。

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

1 个答案:

答案 0 :(得分:1)

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

<块引用>

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

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