Istio 的 Telemetry API 是替代传统 MeshConfig 遥测配置的现代化方式,提供了更灵活的工具来定义服务网格中的 Tracing、Metrics 和 Access Logging。相比传统的 EnvoyFilter
和 MeshConfig
,Telemetry API 更具模块化、动态更新和跨层次配置能力。
在本篇中,我们将详解如何使用 Telemetry API 配置 Istio 遥测功能,涵盖 Tracing、Metrics 和 Logging 的具体实现,同时展示如何迁移过时的 MeshConfig 配置。
Istio 的遥测能力在早期版本中依赖于较为传统的配置方法,如 Mixer 和 MeshConfig 的 configOverride
,这些方法虽然能够满足基本需求,但在复杂场景下显得力不从心。为了解决这些问题,Istio 引入了基于 CRD 的 Telemetry API。
为了帮助读者了解 Telemetry API 的进化过程,以下是一些重要版本的更新信息:
EnvoyFilter
,完全依赖 Telemetry API 定义遥测行为。尽管传统的 MeshConfig 和 EnvoyFilter 提供了基础的遥测能力,但它们的配置方式在灵活性、动态性和扩展性方面存在诸多限制。为了更清晰地理解这些局限性,我们将从几个关键维度展开说明。
在介绍具体问题之前,我们先了解一下 MeshConfig 和 EnvoyFilter 的定位:MeshConfig 适用于全局配置,而 EnvoyFilter 用于细粒度的自定义。但正是这种分工,导致了它们在管理上的复杂性。
MeshConfig 用于集中定义全局网格行为,例如访问日志路径、追踪采样率和指标维度。虽然适合简单场景,但无法满足命名空间级或工作负载级的需求。
EnvoyFilter 则可以覆盖或扩展 Envoy 的配置,允许更细粒度的控制。但这种方式直接操作 Envoy 内部结构(xDS 字段),配置语言复杂且容易出错。
示例:通过 MeshConfig 配置访问日志
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
meshConfig:
accessLogFile: /dev/stdout
问题:
示例:通过 EnvoyFilter 自定义指标
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: custom-metric-filter
namespace: mynamespace
spec:
workloadSelector:
labels:
app: myapp # 选择特定的工作负载
configPatches:
- applyTo: HTTP_FILTER
match:
context: SIDECAR_INBOUND # 匹配入站流量
patch:
operation: ADD
filterClass: STATS # 指定为统计过滤器
value:
name: istio.request_operation # 自定义指标名称
typed_config:
"@type": type.googleapis.com/udpa.type.v1.TypedStruct
type_url: type.googleapis.com/envoy.extensions.filters.http.wasm.v3.Wasm
value:
config:
configuration: |
"attributes": [
{
"output_attribute": "istio_operationId",
"match": [
{
"value": "GetReviews",
"condition": "request.url_path == '/reviews' && request.method == 'GET'"
}
]
}
]
vm_config:
runtime: envoy.wasm.runtime.null
code:
local: { inline_string: "envoy.wasm.attributegen" }
问题:
虽然现代微服务环境强调动态调整配置,但 MeshConfig 和 EnvoyFilter 的动态性支持有限:
在多租户环境中,针对不同命名空间或工作负载自定义遥测配置非常重要。然而:
鉴于上述局限性,Istio 社区已经将传统的 MeshConfig 遥测配置标记为弃用。以下示例展示了这些配置的使用方式及其不足之处:
Access Logging 配置:
meshConfig:
accessLogFile: /dev/stdout
Trace Sampling 配置:
meshConfig:
enableTracing: true
extensionProviders:
- name: zipkin
zipkin:
service: zipkin.istio-system.svc.cluster.local
port: 9411
自定义 Metrics 标签:
meshConfig:
telemetry:
v2:
prometheus:
configOverride:
inboundSidecar:
metrics:
- name: requests_total
dimensions:
user-agent: request.headers['User-Agent']
通过上述例子可以看出,这些配置的灵活性和扩展性明显不足,难以应对复杂的生产环境需求。
在传统配置方式的基础上,Telemetry API 带来了多项改进,使其更适合现代化的服务网格管理需求:
为帮助理解 Telemetry API 的具体使用,我们以全局配置示例作为开始:
apiVersion: telemetry.istio.io/v1alpha1
kind: Telemetry
metadata:
name: mesh-default
namespace: istio-system
spec:
accessLogging:
- providers:
- name: envoy # better to use a built-in one
tracing:
- providers:
- name: "skywalking"
randomSamplingPercentage: 100.00
metrics:
- overrides:
- match:
metric: REQUEST_COUNT
mode: CLIENT
tagOverrides:
x_user_email:
value: |
'x-user-email' in request.headers ? request.headers['x-user-email'] : 'empty'
providers:
- name: prometheus
我们再以配置 SkyWalking 的采样率和 span tag 为例,演示如何使用 Telemetry API。
telemetry.istio.io/v1
。telemetry.istio.io/v1alpha1
。通过以下命令检查 Telemetry API 的 CRD 是否已安装:
kubectl get crds | grep telemetry
在集群中部署 SkyWalking OAP 服务:
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.24/samples/addons/extras/skywalking.yaml
检查服务状态:
kubectl get pods -n istio-system -l app=skywalking-oap
在 Istio 的 MeshConfig
中定义 SkyWalking 提供商。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio
namespace: istio-system
data:
mesh: |-
enableTracing: true
extensionProviders:
- name: "skywalking"
skywalking:
service: "tracing.istio-system.svc.cluster.local"
port: 11800
通过 Telemetry API,将 SkyWalking 设置为默认的 Tracing 提供商,并定义采样率。
你可以从使用 Telemetry API 从多个层级配置采样率,为了节约篇幅,我们仅演示在命名空间范围配置采样率,其他层级的配置请参考 Telemetry API。
apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
name: namespace-override
namespace: default
spec:
tracing:
- providers:
- name: skywalking
randomSamplingPercentage: 50
customTags:
env:
literal:
value: production
说明:
providers.name
:指定 SkyWalking 为默认的 Tracing 提供商。randomSamplingPercentage
:覆盖命名空间级别配置,设置 50% 的采样率。customTags
:为所有追踪数据添加 env=production
标签。访问网格中的服务(如 Bookinfo 示例应用)生成流量:
curl http://$GATEWAY_URL/productpage
查看追踪数据:
istioctl dashboard skywalking
打开浏览器访问 http://localhost:8080
,在追踪界面中查看生成的追踪信息。
点击一个span后,你可以看到其中的追加的 env: production
tag。
Telemetry API 通过其模块化设计、动态更新和多层级支持,大幅降低了服务网格中遥测配置的复杂性。相比 MeshConfig 和 EnvoyFilter,Telemetry API 是一套更灵活、高效的现代化解决方案。我们强烈推荐迁移到 Telemetry API,以充分利用其功能。
最后更新于 2024/12/11