如何使用NetworkPolicy阻止所有流量访问匹配指定标签的Pod
K8s 原生 NetworkPolicy 可以通过默认行为特性直接实现你的需求,不需要配置全局拒绝规则,核心逻辑如下:
K8s 集群默认对所有Pod流量放行,只有当某Pod被至少一条NetworkPolicy选中时,才会进入「默认拒绝所有未显式允许的流量」的状态,你可以利用这个特性精准控制仅限制目标Pod的流量。
具体实现步骤
- 给你需要拒绝所有入向流量的Pod统一打指定标签,示例标签为
restricted-access: "true",可替换为你自定义的标签规则 - 创建如下NetworkPolicy策略:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny-all-to-restricted-pods namespace: <你要生效的命名空间> spec: # 仅匹配你指定标签的Pod podSelector: matchLabels: restricted-access: "true" policyTypes: - Ingress # 不配置任何ingress允许规则,即没有任何入站流量被放行
效果验证
- 所有未被上述策略选中的Pod:无任何NetworkPolicy约束,保持默认放行所有流量的状态,符合你「允许所有流量」的要求
- 被上述策略选中的带指定标签的Pod:无任何显式配置的允许规则,所有入向流量全部被拒绝,符合你「仅拒绝流向指定标签Pod的所有流量」的要求
规则说明
和你查到的官方规则并不冲突:
DESCRIPTION:
List of sources which should be able to access the pods selected for this
rule. Items in this list are combined using a logical OR operation. If this
field is empty or missing, this rule matches all sources (traffic not
restricted by source). If this field is present and contains at least one
item, this rule allows traffic only if the traffic matches at least one
item in the from list.
上述规则针对的是某条ingress规则内部的from字段,如果你配置了ingress: [{from: []}]才会匹配所有源放行,而本方案中直接不写整个ingress字段(即ingress规则数组为空),相当于没有任何允许的入站规则,所以所有流量都会被拒绝。
注意事项
- NetworkPolicy是命名空间级资源,如果需要在多个命名空间生效,需要在对应命名空间分别创建该策略
- 请确保集群中没有配置选中所有Pod的全局NetworkPolicy,否则会破坏非目标Pod的默认放行逻辑
- 如果后续需要给部分受限Pod开放特定流量,可以额外新增针对该Pod的NetworkPolicy配置允许规则即可
内容的提问来源于stack exchange,提问作者User12547645

