要理解策略和遥测,首先要理解 Mixer 的架构;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sUuojjzC-1664190859192)(https://istio.io/docs/concepts/policies-and-telemetry/topology-with-cache.svg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NghRMvEl-1664190859194)(https://istio.io/docs/concepts/policies-and-telemetry/machine.svg)]
适配器和模板(Template)
适配器 封装了 Mixer 和特定基础设施后端之间的接口,把 Mixer 和基础设施后端连接起来。Istio已经实现了多个适配器。各种适配器都需要参数配置才能工作。例如日志适配器可能需要 IP 地址和端口来进行日志的输出。Istio使用处理器(Handler)来给适配器配置参数来生成一个适配器实例;。
模板 定义了从特定请求的属性到适配器输入的映射关系。一个适配器可以支持任意数量的模板。一个模板代表了一条check或者report的data item;
TEMPLATE_VARIETY_CHECK
TEMPLATE_VARIETY_REPORT
TEMPLATE_VARIETY_QUOTA
TEMPLATE_VARIETY_ATTRIBUTE_GENERATOR
策略和遥控功能的控制能力包含了三种类型资源的配置:
配置一组处理器(Handler),用于确定正在使用的适配器组及其操作方式。处理器配置的一个例子如:为 Statsd 后端提供带有 IP 地址的 statsd 适配器。
配置一组实例(Instance),描述如何将请求属性映射到适配器输入。实例表示一个或多个适配器将操作的各种数据。例如,运维人员可能决定从诸如 destination.service 和 response.code 之类的属性中生成 requestcount 指标的实例。
配置一组规则(Rule),这些规则描述了何时调用特定适配器及哪些实例。规则包含 match 表达式和 action。match 表达式控制何时调用适配器,而 action 决定了要提供给适配器的一组实例。例如,规则可能会将生成的 requestcount 实例发送到 statsd 适配器。
Instance对应Template
Handler对应Adapter
apiVersion: config.istio.io/v1alpha2
kind: handler
metadata:
name: quotahandler
namespace: istio-system
spec:
compiledAdapter: memquota
params:
quotas:
- name: requestcountquota.instance.istio-system
maxAmount: 500
validDuration: 1s
# The first matching override is applied.
# A requestcount instance is checked against override dimensions.
overrides:
# The following override applies to 'reviews' regardless
# of the source.
- dimensions:
destination: reviews
maxAmount: 1
validDuration: 5s
# The following override applies to 'productpage' when
# the source is a specific ip address.
- dimensions:
destination: productpage
source: "10.28.11.20"
maxAmount: 500
validDuration: 1s
# The following override applies to 'productpage' regardless
# of the source.
- dimensions:
destination: productpage
maxAmount: 2
validDuration: 5s
---
apiVersion: config.istio.io/v1alpha2
kind: instance
metadata:
name: requestcountquota
namespace: istio-system
spec:
compiledTemplate: quota
params:
dimensions:
source: request.headers["x-forwarded-for"] | "unknown"
destination: destination.labels["app"] | destination.service.name | "unknown"
destinationVersion: destination.labels["version"] | "unknown"
参考
Mixer Out Of Process Adapter Dev GuideMixer Out of Process Adapter WalkthroughMixer Template Dev Guide