Envoy网格接入


概览

Polaris 的服务网格方案中,Polaris 是您的控制平面,Envoy Sidecar 代理是您的数据平面。

Envoy网格接入 - 图1

  • 服务数据同步:polaris-controller 安装在用户的Kubernetes集群中,可以同步集群上的 Namespace,Service,Endpoints 等资源到 polaris 中,同时 polaris-controller 提供了 Envoy Sidecar 注入器功能,可以轻松地将 Envoy Sidecar 注入到您的 Kubernetes Pod 中,Envoy Sidecar 会自动去 Polaris 同步服务信息。

  • 规则数据下发:polaris控制面通过XDS v3标准协议与envoy进行交互,支持官方开源的envoy直接接入,当前支持的envoy版本为1.18

环境准备

部署polaris

如果已经部署好了polaris,可忽略这一步。

polaris支持在kubernetes环境中进行部署,注意必须保证暴露HTTP端口为8090,gRPC端口为8091。具体部署方案请参考:

部署 polaris-controller

您需要在应用所在的 Kubernetes 集群部署 polaris-controller ,用于将集群中的服务数据接入到polaris (如果已经部署可忽略)。如果您有多个 Kubernetes 集群需要接入 polaris ,需要在每个集群都部署 polaris-controller

部署包下载

polaris-controller的下载页面,根据您这边的kubernetes版本号(版本号小于等于1.21.x,选择k8s1.21.zip;版本号为1.22.x,选择k8s1.22.zip),下载最新版本polaris-controller安装包。

部署包安装

安装前,需确保kubectl命令已经加入环境变量Path中,并且可以访问kubernetes的APIServer。

polaris-controller-release_v1.3.0-beta.0.k8s1.21.zip为例:

解压并进入部署包:

  1. unzip polaris-controller-release_v1.3.0-beta.0.k8s1.21.zip
  2. cd polaris-controller-release_v1.3.0-beta.0.k8s1.21

查询用户token,由于controller需要直接访问polaris的控制台OpenAPI,因此需要填写token。

  • 打开北极星控制台,选择用户->用户列表->选择polaris用户->查看token,即可获取到token。

Envoy网格接入 - 图5

修改variables.txt文件,填写polaris的地址(只填IP或者域名,无需端口),如果在同一个集群中,则可以填写集群内域名,同时需要填写上一步所查询到的token

  1. #polaris地址,只填IP或者域名,无需端口
  2. POLARIS_HOST:polaris.polaris-system
  3. #polaris的用户token
  4. POLARIS_TOKEN:4azbewS+pdXvrMG1PtYV3SrcLxjmYd0IVNaX9oYziQygRnKzjcSbxl+Reg7zYQC1gRrGiLzmMY+w+aCxOYI=

执行安装部署。

  1. ./install.sh

快速接入

服务调用关系说明

Envoy网格接入 - 图6

启用 sidecar 自动注入功能

  • 创建命名空间 bookinfokubectl create namespace bookinfo

  • bookinfo 命名空间启用注入:

  1. kubectl label namespace bookinfo polaris-injection=enabled

使用一下命令来验证 bookinfo 命名空间是否已经正确启用:

  1. kubectl get namespace -L polaris-injection

此时应该返回:

  1. NAME STATUS AGE POLARIS-INJECTION
  2. bookinfo Active 3d2h enabled

部署样例

  • 下载样例部署文件:bookinfoEnvoy网格接入 - 图7 (opens new window)

  • 执行部署:kubectl create -f bookinfo.yaml

  • 查看容器注入是否注入成功

启动自动注入后,polaris-controller 会将 Envoy Sidecar 容器注入到在此命名空间下创建的 pod 中。

可以看到运行起来的 pod 均包含两个容器,其中第一个容器是用户的业务容器,第二个容器是由 Polaris Controller 注入器注入的 Envoy Sidecar 容器。您可以通过下面的命令来获取有关 pod 的更多信息:

  1. kubectl describe pods -l app=productpage --namespace=bookinfo

此时应返回:

  1. ... ...
  2. Init Containers:
  3. # polaris-bootstrap-writer 产生 Envoy 的 Bootstrap 配置
  4. polaris-bootstrap-writer:
  5. ... ...
  6. # istio-init 为 envoy sidecar 设置流量拦截
  7. istio-init:
  8. ... ...
  9. Containers:
  10. # demo 的业务容器
  11. productpage:
  12. ... ...
  13. # Envoy 是代理流量的容器
  14. envoy:
  15. ... ...
  • 打开productpage界面

通过productpage暴露的地址,可以访问productpage的主界面,进入Normal User或者TestUser后,可以看到(红、黑、无)三种形态的星星,代表demo已经部署成功。

使用服务治理能力

流量调度

北极星网格支持根据http请求的头部字段进行路由,支持通过path, header, query这3种类型的属性来进行路由。

  1. 使用场景

demo 项目中,productpage 会访问 reviews 服务,reviews 服务共有三个实例,三个实例分别部署了三个版本(会显示红、黑、无三种颜色的星星),需要保证特定的灰度用户(用户名为jason),请求到特定版本的 reviews 服务。

  1. 配置路由规则

为 reviews 服务创建路由规则。将请求中 header 包含字段 end-user=jason 的请求,路由到 version=v2 的服务实例中。同时再创建一条路由规则,指定标签键值为任意请求,路由到 version=v1 的服务实例中。

Envoy网格接入 - 图8

路由规则的标签填写格式要求:

  • 对于Path:标签KEY需要填写$path
  • 对于Header:标签KEY需要带上前缀$header,如$header.end-user
  • 对于Query:标签KEY需要带上前缀$query,如$query.end-user
  1. 验证路由是否生效

未登陆时,刷新 productpage 的页面,可以看到只返回没有颜色的星星(version=v1)。当使用 jason 登陆后,productpage 请求 reviews 时,会带上 header,end-user=jason,此时再刷新 productpage 页面,发现只会显示黑色的星星,即上面 version=v2 的实例。

访问限流

北极星网格支持单机限流和分布式限流,同时直接细粒度的配额的设置。

在envoy接入的场景中,受XDS协议的限制,当前限流粒度只能支持到header以及客户端IP这2个维度。

实现原理:polaris-sidecar提供标准的RLS协议Envoy网格接入 - 图9 (opens new window)的实现,使得envoy可以直接对接北极星的限流引擎。

Envoy网格接入 - 图10

  1. 使用场景

demo项目中,为details服务设置流量限制,对于jason用户的请求,设置访问的频率为5/m,其余请求不做限制。

  1. 设置限流规则

指定请求中 header 包含字段 end-user=jason 的请求,设置限流规则为5/m,限流类型为分布式限流。

Envoy网格接入 - 图11

详细的限流规则匹配及使用指南可参考:访问限流Envoy网格接入 - 图12 (opens new window)

  1. 验证限流是否生效

未登陆时,多次刷新界面,不会出现错误。

以jason用户身份登陆,一分钟刷新超过5次,details界面出现限流的错误信息。

可观测性(支持中)

相关链接

PolarisEnvoy网格接入 - 图13 (opens new window)

Polaris ControllerEnvoy网格接入 - 图14 (opens new window)

Polaris DemoEnvoy网格接入 - 图15 (opens new window)