Istio 1.24 PeerAuthentication 文档详细总结
一、核心定义与作用
PeerAuthentication 是 Istio 中用于定义入站连接双向 TLS(mTLS)要求的核心配置资源,其作用根据部署模式有所差异:
- Sidecar 模式:决定 Envoy 代理边车(Sidecar)的入站连接是否允许或强制使用 mTLS。
- Ambient 模式:由 ztunnel 节点代理为 Pod 透明启用安全机制(代理间通信通过 HBONE 协议加密,默认含 mTLS),因此不支持 DISABLE 模式;STRICT 模式可确保无法建立绕过网格的连接。
二、关键配置结构与字段解析
1. PeerAuthentication 核心字段
该资源包含三个核心配置字段,用于定位目标工作负载并设置 mTLS 规则,具体如下表:
| 字段名 | 类型 | 描述 |
|---|---|---|
| selector | WorkloadSelector | 定位应用政策的工作负载,匹配同命名空间的工作负载;若在根命名空间,匹配全网格工作负载。未设置时,应用于政策所在命名空间的所有工作负载(根命名空间则为全网格)。 |
| mtls | MutualTLS | 工作负载的全局 mTLS 配置,未定义时继承父级(命名空间或网格级)配置。 |
| portLevelMtls | map<uint32, MutualTLS> | 端口级 mTLS 配置,仅当设置 selector 时生效,端口指工作负载端口(非 Kubernetes 服务端口)。 |
2. MutualTLS 结构体
仅包含一个关键字段 mode,用于定义 mTLS 运行模式,依赖 Mode 枚举值配置。
3. Mode 枚举值(mTLS 模式)
Mode 决定了 peer 认证的 mTLS 行为,共四种取值,具体说明如下表:
| 模式值 | 描述 |
|---|---|
| UNSET | 继承父级配置(若存在);无父级时,等效于 PERMISSIVE 模式。 |
| DISABLE | 禁用 mTLS,连接不通过隧道加密(Ambient 模式不支持此值)。 |
| PERMISSIVE | 宽松模式,连接可采用明文或 mTLS 隧道加密。 |
| STRICT | 严格模式,强制要求连接为 mTLS 隧道(必须提供客户端证书)。 |
三、典型配置示例解析
文档提供 4 个核心示例,覆盖不同场景下的 mTLS 政策配置:
1. 命名空间级强制严格 mTLS
为 foo 命名空间下所有工作负载强制启用 mTLS,政策命名为 default,无需 selector(默认应用于全命名空间)。
apiVersion: security.istio.io/v1
kind: PeerAuthentication
metadata:
name: default
namespace: foo
spec:
mtls:
mode: STRICT
- 若需网格级政策,将该配置部署至 Istio 安装的根命名空间即可。
2. 命名空间宽松 + 特定工作负载严格
foo 命名空间默认允许明文 /mTLS 混合连接,但对 app: finance 标签的工作负载强制严格 mTLS,通过两个政策组合实现:
- 命名空间级政策(default):mode: PERMISSIVE;
- 工作负载级政策(finance):通过 selector 定位 finance 工作负载,设置 mode: STRICT。
3. 工作负载级严格 + 特定端口禁用
对 foo 命名空间下 finance 工作负载强制严格 mTLS,但通过 portLevelMtls 例外配置,允许其 8080 端口使用明文:
spec:
selector: # 定位 finance 工作负载
matchLabels:
app: finance
mtls:
mode: STRICT # 全局严格模式
portLevelMtls:
8080: # 工作负载的 8080 端口禁用 mTLS
mode: DISABLE
4. 继承父配置 + 特定端口禁用
finance 工作负载继承命名空间 / 网格级 mTLS 配置(mtls.mode: UNSET),仅针对 8080 端口禁用 mTLS,适用于需局部例外的场景。
四、关键注意事项
- Ambient 模式限制:不支持 DISABLE 模式,STRICT 模式用于阻断绕过网格的连接。
- 端口定义规则:portLevelMtls 中的端口始终指向工作负载自身的端口,与 Kubernetes Service 端口无关。
- 政策作用范围:根命名空间的 PeerAuthentication 可覆盖全网格工作负载,非根命名空间仅作用于自身命名空间。
- 继承优先级:工作负载级政策优先级高于命名空间级,命名空间级高于网格级;portLevelMtls 优先级高于全局 mtls 配置。