选择器组合是并还是或
网络策略里的来源条目可以组合命名空间选择器与 Pod 选择器。写在同一条目内表示同时满足两个条件,属于交集;写成多个条目表示任一满足即可放行,属于并集。缩进层级不同,语义完全不同,这也是策略写错却看不出问题的主要原因。
基本信息
| 所属接口组 | networking.k8s.io/v1 |
|---|---|
| 组合规则 | 同条目内为交集,多条目之间为并集 |
| 空选择器 | 表示匹配该维度的全部对象 |
| 依赖条件 | 网络插件需支持策略执行 |
| 核对方式 | 查看对象详情并做连通性验证 |
典型使用场景
- 只允许特定命名空间内带固定标签的 Pod 访问数据库
- 放行集群内多个来源:既允许管理命名空间,也允许本命名空间内特定角色
- 收紧默认拒绝后的放行清单设计
- 排查策略生效范围:确认某来源为何被放行
- 多环境共用策略模板时按环境标签区分
同一条目:两个条件同时满足
同一条目:两个条件同时满足
ingress:
- from:
- namespaceSelector:
matchLabels:
env: prod
podSelector: # 必须属于上述命名空间,且带 app=web
matchLabels:
app: web
ports:
- protocol: TCP
port: 5432两个条目:满足任一即可
两个条目:满足任一即可
ingress:
- from:
- namespaceSelector: # 条件一:prod 命名空间内任意 Pod
matchLabels:
env: prod
- podSelector: # 条件二:本命名空间内 app=web 的 Pod
matchLabels:
app: web写法与语义对照
| 写法 | 语义 | 风险 |
|---|---|---|
| 同一列表项内两个选择器 | 两个条件同时满足 | 缩进写错会变成放行更宽的条件 |
| 分成两个列表项 | 任一满足即放行 | 范围比预期大,需要仔细核对 |
| 命名空间选择器留空 | 匹配全部命名空间 | 相当于对全网开放 |
| 未写来源列表 | 默认拒绝全部来源 | 漏了必要放行会导致业务不通 |
策略写完后不要只看语法,要在受控环境验证连通性:从应当被拒绝的来源发起连接,确认真的被阻断,否则无法区分是策略正确还是插件没有执行。
命名空间标签是策略的引用点,改动标签会影响所有引用它的策略命中范围。批量调整标签前,先确认哪些策略依赖它。