多节点集群的网络策略行为
Network policy behavior for multi-node cluster
我有一个多节点集群设置。为集群中的 pods 定义了 Kubernetes 网络策略。我只能从 pod 所在的节点使用它们的 clusterIP/podIP 访问服务或 pods。对于具有多个 pods 的服务,我根本无法从节点访问该服务(我猜当该服务将流量定向到驻留节点与我调用的位置相同的 pod 时,该服务将工作)。
这是预期的行为吗?
这是 Kubernetes 限制还是安全功能?
为了调试等,我们可能需要从节点访问服务。我怎样才能实现它?
不,这不是 Kubernetes 的预期行为。 Pods 应该可以通过其内部 IP 访问同一集群内的所有节点。 ClusterIP
服务在 cluster-internal IP 上公开服务并使其可以从集群内访问 - 它基本上默认设置为所有服务类型,如 Kubernetes documentation.[=29 中所述=]
服务 不是 node-specific 并且它们可以指向一个 pod,无论它在任何给定时刻在集群中的哪个位置运行。还要确保您在尝试访问服务时使用的是 cluster-internal port:
。如果您仍然只能从它所在的节点连接到 pod 运行,您可能需要检查您的网络是否有问题 - 例如,检查 UDP 端口是否被阻止。
编辑:关于网络策略——默认情况下,pod 是 non-isolated 用于出口或入口,即如果没有为 NetworkPolicy
定义资源Kubernetes 中的 pod,允许所有流量 to/from 这个 pod - so-called default-allow
行为。基本上,在没有网络策略的情况下,所有 pods 都可以与同一集群中的所有其他 pods/services 进行通信,如上所述。
如果一个或多个 NetworkPolicy
应用于特定的 pod,它将拒绝该策略未明确允许的所有流量(意思是,NetworkPolicy
既选择了 pod 又具有“入口”/“出口” " 在其 policyTypes 中)- default-deny
行为。
什么是more:
Network policies do not conflict; they are additive. If any policy or policies apply to a given pod for a given direction, the connections allowed in that direction from that pod is the union of what the applicable policies allow.
所以是的,这是 Kubernetes NetworkPolicy
的预期行为 - 当 pod 为 ingress/egress 隔离时,to/from pod 中唯一允许的连接是来自 pod 节点的连接以及 NetworkPolicy
定义的连接列表允许的那些。
为了与之兼容,Calico network policy 遵循与 Kubernetes pods 相同的行为。
NetworkPolicy
应用于特定命名空间内的 pods - 在 selectors.
的帮助下相同或不同
至于特定于节点的策略 - 节点不能以其 Kubernetes 身份为目标,而是应在 pod/service NetworkPolicy
中以 ipBlock
的形式使用 CIDR 表示法 - 特别是 IP ranges 被选中以允许作为 pod/service.
的入口源或出口目的地
在这种情况下,将每个节点的 Calico IP 地址列入白名单似乎是一个有效的选项,请查看描述的类似问题 here。
我有一个多节点集群设置。为集群中的 pods 定义了 Kubernetes 网络策略。我只能从 pod 所在的节点使用它们的 clusterIP/podIP 访问服务或 pods。对于具有多个 pods 的服务,我根本无法从节点访问该服务(我猜当该服务将流量定向到驻留节点与我调用的位置相同的 pod 时,该服务将工作)。
这是预期的行为吗? 这是 Kubernetes 限制还是安全功能? 为了调试等,我们可能需要从节点访问服务。我怎样才能实现它?
不,这不是 Kubernetes 的预期行为。 Pods 应该可以通过其内部 IP 访问同一集群内的所有节点。 ClusterIP
服务在 cluster-internal IP 上公开服务并使其可以从集群内访问 - 它基本上默认设置为所有服务类型,如 Kubernetes documentation.[=29 中所述=]
服务 不是 node-specific 并且它们可以指向一个 pod,无论它在任何给定时刻在集群中的哪个位置运行。还要确保您在尝试访问服务时使用的是 cluster-internal port:
。如果您仍然只能从它所在的节点连接到 pod 运行,您可能需要检查您的网络是否有问题 - 例如,检查 UDP 端口是否被阻止。
编辑:关于网络策略——默认情况下,pod 是 non-isolated 用于出口或入口,即如果没有为 NetworkPolicy
定义资源Kubernetes 中的 pod,允许所有流量 to/from 这个 pod - so-called default-allow
行为。基本上,在没有网络策略的情况下,所有 pods 都可以与同一集群中的所有其他 pods/services 进行通信,如上所述。
如果一个或多个 NetworkPolicy
应用于特定的 pod,它将拒绝该策略未明确允许的所有流量(意思是,NetworkPolicy
既选择了 pod 又具有“入口”/“出口” " 在其 policyTypes 中)- default-deny
行为。
什么是more:
Network policies do not conflict; they are additive. If any policy or policies apply to a given pod for a given direction, the connections allowed in that direction from that pod is the union of what the applicable policies allow.
所以是的,这是 Kubernetes NetworkPolicy
的预期行为 - 当 pod 为 ingress/egress 隔离时,to/from pod 中唯一允许的连接是来自 pod 节点的连接以及 NetworkPolicy
定义的连接列表允许的那些。
为了与之兼容,Calico network policy 遵循与 Kubernetes pods 相同的行为。
NetworkPolicy
应用于特定命名空间内的 pods - 在 selectors.
至于特定于节点的策略 - 节点不能以其 Kubernetes 身份为目标,而是应在 pod/service NetworkPolicy
中以 ipBlock
的形式使用 CIDR 表示法 - 特别是 IP ranges 被选中以允许作为 pod/service.
在这种情况下,将每个节点的 Calico IP 地址列入白名单似乎是一个有效的选项,请查看描述的类似问题 here。