知乎团队在 Istio 使用 Opentelemetry 做可观测的最佳实践

本文涉及的产品
性能测试 PTS,5000VUM额度
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
可观测监控 Prometheus 版,每月50GB免费额度
简介: 云原生架构下,可观测领域的 OpenTelemetry 无疑是新时代的可观测标准。它提供的一些组件与工具极大地帮助了企业构建供应商无关的观测架构。

前言

云原生架构下,可观测领域的 OpenTelemetry 无疑是新时代的可观测标准。它提供的一些组件与工具极大地帮助了企业构建供应商无关的观测架构。

而在另一个领域,服务网格 ,Istio 也逐渐成为事实上的标准实现,它帮助企业从异构多语言微服务体系的复杂泥潭中解脱出来,无感知的为微服务增加动态管理、安全与可观测能力。

OpenTelemetry 与 Istio 的结合几乎可以说是天作之合,展现出 1 + 1 远大于 2 的能量!

OpenTelemetry 的基本架构

我们先了解一下 OpenTelemetry 的基本架构:

image.png

OpenTelemetry 基本上由三大件构成:

OTel Library:在几乎所有语言中为可观测提供统一的 API;

OTel Collector:数据收集程序,提供模型抽象,将统一的数据格式转换到不同后端供应商的数据格式;

其他的一些工具,比如各种 Auto Instruments。 OTel Collector 部署的结构可以拆分成两部分,一部分是 OTel Agent ,另一部分是 OTel Collector。 OTel Agent + OTel Collector 是我们向大家非常建议的架构。 至少对于容器集群来说,OTel Agent 几乎应该是必选项,在虚拟或者裸金属宿主机上可以通过 Agent 提供非常多的有用特性,比方说:批量的数据压缩、网络错误时的重试等等;

Istio 的可观测

Istio 通过自动代理进程流量,帮助进程自动记录流量的观测数据,这包括但不限于:

各类指标。比如 istio_requests_total 指标可以用来统计程序的进出流量的 RPS。

自动的分布式追踪。通过 Istio 数据面,为链路记录了真实可信的现场数据,包括流量本身的表现、延迟、错误原因等等。

进出流量的访问日志。Istio 数据面会自动打印出所有进出流量的日志,其中囊括非常多的信息,比如请求时间、请求的上下游耗时、包体积等等。 Istio 的可观测是完全插件化,可选择的。 但,不幸的是 OpenTelemetry 并不是 Istio 的开箱默认选择,我们需要做一些工作让他们一起 Work。

部署 Otel Agent

在 Kubernetes 集群中,为每台宿主机安装 Otel Agent 有三种选项:

使用官方提供的 Kubernetes Yaml 文件进行定制化安装。

使用 OpenTelemetry 提供的 helm 仓库。 两者都是非常好的选项,根据咱们自身的生产流程和情况进行选择即可。 我们在这里强调一下我们的生产使用的一些重点经验:

部署 Otel Agent 必须配置合适的 CPU 与内存使用,否则可能会影响服务容器的表现。

务必为 Otel Agent 注入与 CPU 限制匹配的 GOMAXPROCS 环境变量,才能正确发挥 Otel Agent 的性能。尤其在裸金属几十个上百个 CPU 核心的情况下,GOMAXPROCS 设置与否将会是影响 Agent 表现最为明显的因素。

HostNetwork 虽然是默认选项,我们强烈建议使用 HostPort 替代,以避免未知危险。

Otel 的 Receivers 配置一定要选择适当的端口,避免和主机上进程端口冲突,并且部署后检查是否有无法启动的 Agent 容器,如果有请手动解决此类问题。 由于是与 Istio 一起工作,我们在这里开启 OpenCensus Receiver 配置,方便 Istio 的追踪数据投递到 Otel Agent 中。

image.png

默认情况下 opencensus 监听的端口是 55678。

如果您的服务容器内还使用了其他的分布式追踪的协议,您可以在 receivers 开启,比如您可以同时还开启 Jaeger 协议的 receiver。这样您可以避免在集群内部署多个不同 Tracing 系统的 Agent,从而避免掉不必要的性能开销。

实际上我们的生产实践中也正是这么去做的,Istio 使用 opencensus 协议投递,而我们的服务内,由于历史原因代码中实际使用 Jaeger 协议,你看这就是 OpenTelemetry 的好处,几乎完全的供应商无关的使用体验。

接下来,我们配置完 exporters 信息,基本上 Otel Agent 就可以工作了。

我们可以在配置、部署完 OTel Agent 之后,进行一些实际的数据投递,来验证整个环节是否生效。

比如启动一些 Demo 应用,并产生流量,然后在 Query 侧查询是否存在相关数据。

配置 Istio 分布式追踪

在我们的实践中,我们遵循社区的最佳实践,使用 IstioOperator 安装、管理 Istio 配置。

通过修改我们的 IstioOperator 对象,即可完成分布式追踪的观测开启与配置。

image.png

这里可以注意到我们保留了 B3 上下文头部的感知,以保证与原有体系的兼容性。

这里可选的上下文非常多,比如 W3C_TRACE_CONTEXT、B3、CLOUD_TRACE_CONTEXT 等。

当我们修改完 IstioOperator 后,我们几乎立即得到了一个可用的 Tracing 接入。

但是如果你发现此时,Otel Agent 没有收到流量,请不要慌张,只是因为 Tracing 的配置实际是配置在了 Istio 数据面 Envoy 的启动配置文件中。

我们的修改如果想要生效,可以等待下一次服务重新部署即可,或者你也可以立即滚动重启一轮。

全览

最后我们看一下整体的全览。

image.png

服务进程和服务网格数据面 Istio-Proxy 均把自身的 tracing 数据投递到 OTel Agent,然后由 OtelAgent 处理后再投递到 Kafka 或 Jaeger Collector 或是其他供应商后端系统。

OpenTelemetry 不仅帮助我们服务网格 Istio 接入了分布式追踪,还统一了 Tracing Agent。

OpenTelemetry 能帮助 Istio 做到的事情也不止于此。

比方说作为 Istio 服务网格的数据面 Envoy,本身是支持将访问日志投递到 OpenTelemetry Agent 的,那么通过 Istio 的 EnvoyFilter 扩展,我们还能非常容易的接入 OpenTelemetry 的日志体系。

我们坚信 OpenTelemetry 与 Istio 服务网格未来会结合的更加紧密,OpenTelemetry 最终将全面地、彻底地接管 Istio 服务网格可观测体系!

作者介绍

唐阳,知乎核心架构平台工程师,负责服务网格等基础设施。

目录
相关文章
|
17天前
|
监控 安全 Cloud Native
云原生安全:Istio在微服务架构中的安全策略与实践
【10月更文挑战第26天】随着云计算的发展,云原生架构成为企业数字化转型的关键。微服务作为其核心组件,虽具备灵活性和可扩展性,但也带来安全挑战。Istio作为开源服务网格,通过双向TLS加密、细粒度访问控制和强大的审计监控功能,有效保障微服务间的通信安全,成为云原生安全的重要工具。
39 2
|
1月前
|
Kubernetes 安全 微服务
使用 Istio 缓解电信 5G IoT 微服务 Pod 架构的安全挑战
使用 Istio 缓解电信 5G IoT 微服务 Pod 架构的安全挑战
53 8
|
1月前
|
Kubernetes 负载均衡 安全
Istio在微服务中释放服务网格的力量
Istio在微服务中释放服务网格的力量
50 4
|
3月前
|
负载均衡 监控 安全
Istio:微服务治理的超级英雄,一键解锁你的服务网格超能力,让管理复杂变简单!
【8月更文挑战第31天】随着云原生技术的发展,微服务架构成为主流,但其复杂性与管理难题也随之增加。Istio作为开源服务网格平台,通过独特的数据平面和控制平面设计,实现了微服务通信的透明管理,简化了治理复杂度。本文将对比Istio与传统微服务管理方法,详细介绍Istio的架构及其工作原理,包括Envoy代理、服务发现、负载均衡、流量管理、安全认证以及监控等功能。Istio不仅简化了微服务治理,还提供了强大的流量控制和安全机制,使开发者能更高效地管理应用。
71 2
|
3月前
|
开发者 项目管理 开发工具
震惊!单人开发者如何成功过渡到团队协作?Xamarin 项目管理经验大揭秘,让你的开发之路一帆风顺!
【8月更文挑战第31天】Xamarin 是移动应用开发领域的热门跨平台工具,适用于个人开发者及团队。个人开发时需明确需求、运用版本控制(如 Git)并合理规划项目结构以增强代码可维护性。团队协作时,则需建立有效沟通渠道、统一代码规范、严格版本控制及合理分配任务,以提升开发效率与项目质量。
64 1
|
3月前
|
Kubernetes 安全 微服务
使用 Istio 缓解电信 5G IoT 微服务 Pod 架构的安全挑战
在5G电信领域,Kubernetes集群中部署微服务至关重要,但也带来了重大的安全挑战。Istio作为一个强大的开源服务网格,能有效地管理这些微服务间的通信,通过其控制平面自动将Sidecar代理注入到各微服务Pod中,确保了安全且高效的通信。Istio的架构由数据平面和控制平面组成,其中Sidecar代理作为Envoy代理运行在每个Pod中,拦截并管理网络流量。此外,Istio支持多种Kubernetes发行版和服务,如EKS等,不仅增强了安全性,还提高了应用性能和可观测性。
75 0
使用 Istio 缓解电信 5G IoT 微服务 Pod 架构的安全挑战
|
5月前
|
Kubernetes 监控 负载均衡
Istio:微服务开发的终极利器,你还在为繁琐的通信和部署流程烦恼吗?
本文介绍了服务网格(Service Mesh)的概念及其在微服务架构中的重要性。微服务强调围绕业务构建团队和去中心化的数据管理,带来更高的灵活性和扩展性。然而,随着服务数量增加,网络通信成为挑战,包括服务发现、路由和安全等问题。 Service Mesh如Istio应运而生,通过边车代理解决服务间通信,提供服务发现、负载均衡、智能路由、安全和监控等功能。它与Kubernetes结合,增强了容器环境的服务管理能力。Istio的bookinfo示例展示了其在多语言微服务中的应用,简化了代码中的服务调用逻辑,使开发更专注于业务本身。
674 3
Istio:微服务开发的终极利器,你还在为繁琐的通信和部署流程烦恼吗?
|
Dubbo Java 应用服务中间件
开源微服务如何选型?Spring Cloud、Dubbo、gRPC、Istio 详细对比
开源微服务如何选型?Spring Cloud、Dubbo、gRPC、Istio 详细对比
1092 7
|
安全 前端开发 Cloud Native
Istio 探索:微服务的流量管理、安全性和策略加固
Istio 探索:微服务的流量管理、安全性和策略加固
98 0
|
Kubernetes 前端开发 Dubbo
Spring Boot+gRPC构建微服务并部署到Istio(详细教程)
Spring Boot+gRPC构建微服务并部署到Istio(详细教程)