认证策略根据生效范围分为三类:网格范围的策略、命名空间范围的策略以及特定于服务的策略。
1.网格范围的策略
网格范围的策略(MeshPolicy)是针对网格中的所有工作负荷,这种策略的生效范围是整个网格内的所有服务,因此类型是MeshPolicy,名称必须是default,另外也不包含targets字段。
例如,使用如下示例中带有mode方式为PERMISSIVE值的临时策略。这种情况下,会将接收服务配置为接收两种类型的流量:纯文本和TLS。因此不会丢弃任何请求。一旦所有客户端切换到预期协议,无论是否有双向TLS,都可以将PERMISSIVE策略替换为最终策略。
apiVersion: "authentication.istio.io/v1alpha1"
kind: "MeshPolicy"
metadata:
name: "default"
spec:
peers:
- mtls:
mode: PERMISSIVE
2.命名空间范围的策略
除了为整个网格指定身份认证策略之外,Istio还允许你为特定命名空间指定策略。命名空间范围的策略优先于网格范围的策略。
下面的示例显示了为命名空间foo中的所有服务启用双向TLS的策略:
apiVersion: "authentication.istio.io/v1alpha1"
kind: "Policy"
metadata:
name: "default"
namespace: "nspolicy"
spec:
peers:
- mtls: {}
这段代码使用的类别是Policy而不是MeshPolicy,并指定了一个命名空间,在本例中为nspolicy。如果未指定命名空间值,则策略将应用于默认命名空间default。注意一点,类似于网格范围的策略,命名空间范围的策略必须命名为default,并且不限定任何特定的服务,也就没有targets字段。
3.特定于服务的策略
除了为整个网格或者特定命名空间指定身份认证策略之外,Istio还允许你为特定服务指定策略。一个命名空间范围的策略优先于网格范围的策略,而特定于服务的策略则具有更高的优先级。需要注意的是,不同于网格范围的策略以及命名空间范围的策略,特定于服务的策略可以自己命名,而且通过targets字段指定特定的服务名称。
执行以下命令,只为httpbin.bar服务新增一项策略:
apiVersion: "authentication.istio.io/v1alpha1"
kind: "Policy"
metadata:
name: "httpbin"
spec:
targets:
- name: httpbin
peers:
- mtls: {}