SkyWalking 针对 gRPC 的负载均衡和自动扩容实践
  IAnf3sYdqT2F 2023年11月12日 15 0


背景介绍

在 Apache SkyWalking 中,OAP 通过 SkyWalking Agent、Envoy 或其他数据源获得指标、追踪、日志和事件数据。在 gRPC 协议下,通过与各个系统服务器进行来传输数据。当它连接通信生态时,当流量的服务在添加时,或者由于增加了 OAP 服务的流量负载高位时,OAP 集群使之增加了。所有的代理已经连接到以前的节点,由于这些新的 OAP 节点的负载率会很小。即使没有扩展,OAP 节点的负载率也不会平衡,因为比较代理会启动阶段的经常策略而保持连接。在现有的在这种情况下,保持所有节点的健康状态,允许在需要时进行扩展,将成为一个挑战。

在这篇文章中,我们主要讨论如何解决SkyWalking中的这一挑战。

如何实现平均均衡

SkyWalking 主要使用 gRPC 协议进行数据传输,所以本文主要介绍 gRPC 协议中负载的均衡。

代理或客户端

根据gRPC​​官方平均平均博客​​,有平均均衡的方法。

  1. 每个客户端选择一个服务为客户端,并使用一个服务。
  2. 代理。 代理服务器将信息负载均衡到客户端发送信息。

从可观察性系统结构的角度来看。

类别

优点

缺点

客户端

没有了额外的惊喜,所以表现不错

复杂的客户端(要检查每个人的连接、正常情况、健康状况);确保提供数据源复杂的客户端

代理

客户端简单

高迟

我们选择代理模式是出于以下原因:

  1. 可观察的数据时间对不是很敏感,传输造成的一点延迟是可以接受的。
  2. 作为一个观察性平台,我们不能/不应该要求改变客户端。他们决定自己的技术决定,并可能有自己的商业考虑。

传输策略

在路由模式下,我们应该确定和之间的传输模式。

数据协议需要不同的处理策略不同。有传输政策:

  1. 同步适用:用于需要在客户端交换数据的协议,例如SkyWalking动态配置服务。这种类型的协议提供实时结果。
  2. 当有数据处理的结果时,当使用不符合要求的情况下,日志的报告(如追踪报告)。

同步策略在收到客户端消息时,要求同时向服务器发送消息,并同步返回响应数据给下游客户端。情况下,只有在协议需要同步。

如下图所示,在客户端向代理发送请求消息后,代理将同步向服务器发送。当收到代理结果后,会返回给客户端。

SkyWalking 针对 gRPC 的负载均衡和自动扩容实践_SkyWalking

像这样的策略协议主要是因为被广泛使用的服务器。由于经常有类似的策略,SkyWalking 是一个很好的数据报告。一定的政策是按照步骤执行的。

  1. 代理接收数据并将其包装成一个事件对象。
  2. 一个事件被添加到项目中。
  3. 当达到一定的间隔时间或物品达到一定数量时,其中的元素将被并行并发送到OAP。

使用的好处是:

  1. 将数据接收和发送单独,以对抗影响。
  2. 有机会将事件和元素数字很好的将事件合并,这间隔时间的固定向 OAP 发送速度。
  3. 使用多线程的处理事件可以更充分地利用网络IO。

在收到消息后,代理将消息封装成一个并传播到消息中。发送者将发送的消息发送给他们的AP,将其发送到队列中的事件消息中。

SkyWalking 针对 gRPC 的负载均衡和自动扩容实践_rpc_02

路由

路由算法被用于将消息路由到本地的路由服务器节点。

轮询算法可以从边缘服务节点列表中按顺序选择。这种优势是,每个节点的出现次数是平均的。数据的大小时间,每个节点选择处理的数量相同的数据内容。

SkyWalking 针对 gRPC 的负载均衡和自动扩容实践_rpc_03

在Weight Round-Robin中,每个服务器节点都有各自的路由权重比。与Roundbin不同的是,每个不同的节点根据不同的权重设置,有更多的选择权。这种算法更适合在上游服务器节点机器配置不同时使用。

SkyWalking 针对 gRPC 的负载均衡和自动扩容实践_java_04

固定算法是一种算法。它可能会被路由到同一个混合的服务器上或路由器上,当确保服务器正常运行时,如果要缩小同一节点的路由;确保节点不存在,则无论如何都不会存在。重路由。这种算法主要用于 SkyWalking Meter 协议,因为要确保相同的服务实例的指标被发送到同一个 OAP 节点。步骤路由如下:

  1. 根据数据内容奇特的识别文字,越短越好。数据量是可控的。
  2. 从 LRU Cache 中获取身份的请求节点,如果存在就使用它。
  3. 根据结果​​,有时会发现哈希值,并从列出的列表中找到合适的服务器。
  4. 将前端服务器节点和标识之间的映射关系保存到 LRU Cache。

算法的优点是在空间连续保持数据与服务器服务器连接,相应的服务器可以更好地处理数据。

如下图所示,图片被分成两部分:

  1. 一路走来表示相同的数据内容总是被路由到同一个服务器节点。
  2. 从代表数据获取数据路由算法。从中获取数字算法,并使用剩余数据获取位置。

SkyWalking 针对 gRPC 的负载均衡和自动扩容实践_java_05

我们选择使用 Round-Robin 和 Fixed 算法的组合进行路由。

  1. 固定路由适用于特定的协议,主要在向 SkyWalking Meter 协议提交数据时使用。
  2. 当 SkyWalking OAP 集群就被部署时,默认的配置需要注意的相同,所以没有必要使用权重 Round-Robin 算法。

负载均衡如何?

代理仍然需要处理从客户端到自身的均衡问题,特别是在生产环境中部署代理集群的时候。

有办法来解决这个问题:

  1. 连接管理:在使用客户端​​max_connection​​​配置来指定每个连接的最大连接时间。欲了解更多信息,请阅读​​提案​​。
  2. 公司:代理有调度,当不及时,积极联络代理。
  3. 资源限制 + HPA:限制每个代理的连接资源情况,达到资源限制时不再接受新连接。并利用 Kubernetes 的 HPA 机制来动态扩展代理的数量。

类别

连接管理

图书馆

资源限制 + HPA

优点

使用简单

确保每个代理中的连接数是亲人的

使用简单

缺点

客户端需要确保数据不丢失;客户端需要接受 GOWAY 的响应

可能会导致某些不同的流量突然出现;每个客户需要确保数据不丢失

不会在每个实例中特别平均

选择我们的资源限制+HPA 是出于这些原因:

  1. 易于配置和使用代理,根据基本的数据指标,易于理解。
  2. 没有因连接协议而导致的数据丢失。当客户端不需要实施任何其他来阻止数据遗弃,特别是客户端是一个商业产品时。
  3. 代理服务器中每个节点的连接需要特别平衡,只要代理节点本身就是性能的。

SkyWalking-卫星

我们已经在 SkyWalking ​​-Satellite​​项目中实现了这个代理。它被客户端和 SkyWalking OAP 之间,有效地解决了平均平均问题。

部署系统后选择卫星会从客户端的发送标签,选择 Kubernetes 设备或通过卫星手动配置,将 OAP 的所有节点,集中到前面的 OAP 节点。

如下图所示,各个连接节点将与各个OAP卫星保持连接,Saite将与各个OAP建立连接,并告诉同步的AP节点。

SkyWalking 针对 gRPC 的负载均衡和自动扩容实践_负载均衡_06

在扩展中,我们需要在 SWCK 中部署​​SWCK​​并配置 HPA。

部署完成后,将进行以下步骤:

  1. 从 OAP 中读取的指标。HP 要求 SWCK 显示地报告中的 OAP 的指标。
  2. 当 Kubernetes HPA 进行扩展到符合预期的范围时,Satellite 会自动将值进行扩展。

HPA 使用 SWCK 部署目的地来承载 OAP 的当期。

SkyWalking 针对 gRPC 的负载均衡和自动扩容实践_java_07

例子

在本节中,我们将展示不同的情况。

  1. SkyWalking 扩展:在 SkyWalking OAP 扩展之后,将通过 Satellite 自动负载实现均衡。
  2. 卫星扩展:卫星自身的流量负载均衡。

注意:所有命令都可以通过​​GitHub​​访问。

SkyWalking 扩展

我们将使用​​bookinfo 应用程序​​演示如何将 Apache SkyWalking 8.9.1 与 Apache SkyWalking-Satellite 0.5.0 集成,并通过 Envoy ALS 协议观察服务网格。

在开始之前,请确保你已经有一个 Kubernetes 环境。

安装 Istio

Istio 提供了一个非常方便的服务方法来配置 Envoy 代理并启用访问日志。下面的步骤:

  1. 在本地安装 istioctl 以帮助管理 Istio 服务网格。
  2. 将 Istio 安装到 Kubernetes 环境中,使用演示配置,并启用 Envoy ALS。将 ALS 消息传送到 Satellite 上。我们稍后将部署的 Satellite。
  3. 将标签添加到自定义空间中,这样 Istio 就可以在你以后部署应用程序时自动注入 Envoy sidecar 代理。
# install istioctl
export ISTIO_VERSION=1.12.0
curl -L https://istio.io/downloadIstio | sh -
sudo mv $PWD/istio-$ISTIO_VERSION/bin/istioctl /usr/local/bin/

# install istio
istioctl install -y --set profile=demo \ --set meshConfig.enableEnvoyAccessLogService=true \ --set meshConfig.defaultConfig.envoyAccessLogService.address=skywalking-system-satellite.skywalking-system:11800

# enbale envoy proxy in default namespace
kubectl label namespace default istio-injection=enabled


安装 SWCK

SWCK 为用户部署和升级基于 Kubernetes 的 SkyWalking 相关组件提供了自动便利。Satellite 的扩展功能主要依赖于 SWCK。更多信息,你可以参考​​文档​​。


# Install cert-manager
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.3.1/cert-manager.yaml

# Deploy SWCK
mkdir -p skywalking-swck && cd skywalking-swck
wget https://dlcdn.apache.org/skywalking/swck/0.6.1/skywalking-swck-0.6.1-bin.tgz
tar -zxvf skywalking-swck-0.6.1-bin.tgz
cd


部署 Apache SkyWalking 和 Apache SkyWalking-Satellite

我们提供了一个简单的脚本来部署SkyWalking的OAP、用户界面和卫星。


# Create the skywalking components namespace
kubectl create namespace skywalking-system
kubectl label namespace skywalking-system swck-injection=enabled
# Deploy components


部署 Bookinfo 应用程序


export ISTIO_VERSION=1.12.0
kubectl apply -f https://raw.githubusercontent.com/istio/istio/$ISTIO_VERSION/samples/bookinfo/platform/kube/bookinfo.yaml
kubectl wait --for=condition=Ready pods --all --timeout=1200s
kubectl port-forward service/productpage 9080


你应该看到,请打开浏览器并访问播放器://localhost:9080080打开你的浏览器应用程序。

然后,你可以在 SkyWalking Web 上查看 Bookinfo 应用程序的布局结构和显示。你可以看到 UI,Satellite 已经在工作。

部署监控器

我们 OpenTelemetry Collect 来收集 OAP 中的指标并需要进行或安装分析。


# Add OTEL collector


请打开浏览器,访问 http://localhost:8080/,并在仪表板上创建一个新项目。下图的 SkyWalking Web UI 显示了数据内容的应用方式。

SkyWalking 针对 gRPC 的负载均衡和自动扩容实践_运维_08

扩容OAP

通过 Deployment,扩容 OAP 的数量。


kubectl scale --replicas=3


完成

之后,你会看到 OAP 的数量变成了 3 个,而且 ALS 的一个流量被平衡到了每个 OAP。

SkyWalking 针对 gRPC 的负载均衡和自动扩容实践_SkyWalking_09

扩容卫星

在我们完成了 SkyWalking Scaling 之后,我们将进行 Satellite Scaling 演示。

部署 SWCK HPA

SWCK 提供了一个 AP 来实现 Kubernetes 外部指标监控,通过读取 SkyWalking OAP 中的指标来适应 HPA。我们将 Satellite 中的指标服务显示给 O,并配置 HPA 来扩展 Satellite。

将 SWCK 安装到 Kubernetes 环境中。


kubectl apply -f skywalking-swck/config/adapter-bundle.yaml


创建 HPA 资源,并限制每个 Satellite 最多可处理 10 个连接。


kubectl apply -f https://raw.githubusercontent.com/mrproliu/sw-satellite-demo-scripts/5821a909b647f7c8f99c70378e197630836f45f7/resources/satellite-hpa.yaml


然后,你可以看到我们在一个卫星上建立了 9 个连接。一个 Envoy 可以代理多个连接到卫星。


$ kubectl get HorizontalPodAutoscaler -n skywalking-system
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
hpa-demo Deployment/skywalking-system-satellite 9/10 1 3 1


扩容应用

扩容应用程序可以建立更多与 Satellite 的连接,以验证 HPA 是否生效。


kubectl scale --replicas=3


完成

下,Satellite 将部署一个实例,一个实例只能接受 11 个连接。HPA 资源限制一个 Satellite 处理 10 个连接,并使用稳定的使 Satellite 稳定扩展的窗口。在这种情况下,我们在扩展后将 Bookinfo应用程序部署在 10 个多个实例中,这意味着将有 10 个多个连接建立到 Satellite 上。

所以资源运行后,卫星会自动在 HP 2 中通过一个官方实例。你可以了解单个​​文档​​的扩容/缩容的计算算法。运行下面的命令来查看运行状态。


$ kubectl get HorizontalPodAutoscaler -n skywalking-system --watch
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
hpa-demo Deployment/skywalking-system-satellite 11/10 1 3 1 3m31s
hpa-demo Deployment/skywalking-system-satellite 11/10 1 3 1 4m20s
hpa-demo Deployment/skywalking-system-satellite 11/10 1 3 2 4m38s
hpa-demo Deployment/skywalking-system-satellite 11/10 1 3 2 5m8s
hpa-demo Deployment/skywalking-system-satellite 6/10 1 3 2


通过观察“连接数”指标,我们将看到,当每个 gRPC 的连接数超过 10 个连接时,那么卫星通过 HPA 规则扩展。结果是,连接数自动下降到正常(在此进行中,小10个例子)

swctl metrics linear --name satellite_service_grpc_connect_count --service-name satellite::satellite-service

SkyWalking 针对 gRPC 的负载均衡和自动扩容实践_负载均衡_10

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月12日 0

暂无评论

推荐阅读
IAnf3sYdqT2F
最新推荐 更多