我正在使用 Azure Kubernetes 服务 (AKS),并希望确保特定命名空间内的 Pod 只能接收来自同一命名空间中其他 Pod 的入口流量。
我发现此网络策略可实现此命名空间隔离(来自 here):
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
namespace: my-namespace
name: deny-from-other-namespaces
spec:
podSelector:
matchLabels:
ingress:
- from:
- podSelector: {}
在我创建此网络策略后,它成功阻止了“my-namespace”上的 pod 与另一个命名空间之间的流量,而“my-namespace”中的 pod 之间仍然可以进行通信。但是,这仅在两个 Pod 都安排在同一个节点上时才成立。如果两个 Pod 都在“我的命名空间”中但运行在不同的节点上,则它们之间的连接不再有效。一旦我删除了上述网络策略,连接就会再次工作。 我认为这不是预期的行为,因为 pod 位于相同的命名空间中,因此应该允许入口流量。 有谁知道是什么导致了这个问题?
我正在使用 kubenet 和 calico 网络策略运行 Kubernetes 1.19.6 版。
答案 0 :(得分:1)
看起来您在 AKS 集群 v1.19+ 中遇到了一个围绕“Pod IP SNAT/Masquerade 行为”的已知问题。
其他用户在那里解释了它如何使用 Calico 的网络策略插件影响集群:
<块引用>仅供其他用户参考,此问题会导致带有 podSelector 配置的 NetworkPolicy 出现问题。由于Calico会根据IPtables中pods的ipset设置policy,但是数据包的源IP被设置为节点IP,甚至应该允许的数据包也会被丢弃。
请在 github issue #2031 中阅读有关此问题的更多信息,以及硬修复(节点映像升级)或解决方法(运行 Daemonset 在 iptables 中创建 SNAT 豁免)。