Kubernetes 网络策略阻止 AKS 上节点之间的流量

时间:2021-05-31 15:59:20

标签: kubernetes azure-aks kubernetes-networkpolicy kubernetes-networking

我正在使用 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 版。

1 个答案:

答案 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 豁免)。