问题描述
我对全局网络策略的这种行为感到困惑。采取以下措施。
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