2

我正在使用 Azure Kubernetes 服务 (AKS),并希望确保特定命名空间内的 pod 只能接收来自同一命名空间中其他 pod 的入口流量。

我找到了这个网络策略来实现这个命名空间隔离(从这里):

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 都在“my-namespace”中但在不同的节点上运行,那么它们之间的连接将不再有效。一旦我删除了上述网络策略,连接就会再次起作用。我认为这不是预期的行为,因为 pod 位于同一个命名空间中,因此应该允许入口流量。有谁知道什么可能导致这个问题?

我正在使用 kubenet 和 calico 网络策略运行 Kubernetes 版本 1.19.6。

4

1 回答 1

1

看起来您在 AKS 集群 v1.19+ 中遇到了一个围绕“Pod IP SNAT/Masquerade 行为”的已知问题。

其他用户解释了它如何影响使用 Calico 的网络策略插件的集群:

仅供其他用户参考,此问题会导致带有 podSelector 配置的 NetworkPolicy 出现问题。由于Calico会根据IPtables中Pod的ipset设置策略,但是数据包的源IP设置为节点IP,甚至应该允许的数据包也会被丢弃。

请在 github 问题#2031中阅读有关此问题的更多信息,以及硬修复(节点映像升级)或解决方法(运行 Daemonset 在 iptables 中创建 SNAT 豁免)。

于 2021-06-02T11:40:06.500 回答