使用Envoy + Istio限制节流率

时间:2019-10-28 16:32:52

标签: thrift istio envoyproxy

我正在尝试通过允许用户向Pilot提供外部速率限制服务[3]作为环境变量,从而为Istio为Thrift协议栈[2]添加非常基本的rls [1]支持。我遇到了一个问题,该配置似乎被客户端拒绝了。

这是我的Istio控制平面代码的隔离和简化版本:

import (
    "github.com/envoyproxy/go-control-plane/envoy/api/v2/core"
    "istio.io/istio/pilot/pkg/model"
    "istio.io/istio/pilot/pkg/networking/util"
    ratelimit "github.com/envoyproxy/go-control-plane/envoy/config/ratelimit/v2"
    thrift_proxy "github.com/envoyproxy/go-control-plane/envoy/config/filter/network/thrift_proxy/v2alpha1"
    thrift_ratelimit "github.com/envoyproxy/go-control-plane/envoy/config/filter/thrift/rate_limit/v2alpha1"
)

// thriftListenerOpts are options for a Thrift listener
type thriftListenerOpts struct {
    // stat prefix for the thrift connection manager
    // DO not set this field. Will be overridden by buildCompleteFilterChain
    statPrefix  string
    transport   int
    protocol    int
    routeConfig *thrift_proxy.RouteConfiguration
}

func buildRatelimtedThriftProxy(node *model.Proxy, thriftOpts *thriftListenerOpts, ratelimitServiceUri string) *thrift_proxy.ThriftProxy {
    var ratelimitService *thrift_ratelimit.RateLimit
    var ratelimitFilter  *thrift_proxy.ThriftFilter
    var proxy *thrift_proxy.ThriftProxy

    proxy = &thrift_proxy.ThriftProxy{
        StatPrefix:  thriftOpts.statPrefix,
        Transport:   thrift_proxy.HEADER,
        Protocol:    thrift_proxy.BINARY,
        RouteConfig: thriftOpts.routeConfig,
    }

    ratelimitFilter = &thrift_proxy.ThriftFilter{
        Name: "config.filter.thrift.rate_limit.v2alpha1.RateLimit",
    }

    ratelimitService = &thrift_ratelimit.RateLimit{
        RateLimitService: &ratelimit.RateLimitServiceConfig{
            GrpcService: &core.GrpcService{
                TargetSpecifier: &core.GrpcService_GoogleGrpc_{
                    GoogleGrpc: &core.GrpcService_GoogleGrpc{
                        TargetUri: ratelimitServiceUri,
                    },
                },
            },
        },
    }

    if util.IsXDSMarshalingToAnyEnabled(node) {
        ratelimitFilter.ConfigType = &thrift_proxy.ThriftFilter_TypedConfig{TypedConfig: util.MessageToAny(ratelimitService)}
    } else {
        ratelimitFilter.ConfigType = &thrift_proxy.ThriftFilter_Config{Config: util.MessageToStruct(ratelimitService)}
    }

    proxy.ThriftFilters = append(proxy.ThriftFilters, ratelimitFilter)

    return proxy
}

在检查Envoy的管理界面的/config_dump端点时,如果未提供速率限制配置,则表示存在代理并且配置正确。一旦我尝试添加ratelimit配置,它就会完全消失。

我在做什么错了?

  1. 定义Thrift ratelimit api的源代码:https://github.com/envoyproxy/envoy/blob/master/api/envoy/config/filter/thrift/rate_limit/v2alpha1/rate_limit.proto#L9
  2. 在此处查看官方文档:https://www.envoyproxy.io/docs/envoy/latest/api-v2/config/filter/thrift/rate_limit/v2alpha1/rate_limit.proto
  3. 此处的参考实现:https://github.com/lyft/ratelimit

2 个答案:

答案 0 :(得分:1)

原来我的GrpcService配置不正确。它缺少StatPrefix字段。通过查看特使日志,我能够弄清楚这一点。通过运行递归验证的ratelimitService.Validate(),我也可以在我的代码中进行检查。

答案 1 :(得分:0)

Istio 中对 Thrift 和其他第 7 层协议的内置支持是有限的或没有。如果您想要 EnvoyProxy 端已经支持的全部功能,请考虑 Aeraki。 Aeraki 可以帮助在 Istio 服务网格中支持 Thrift 或其他第 7 层协议,包括流量管理,例如基于版本的路由和流量拆分,以及服务指标。

演示: http://aeraki.zhaohuabing.com:3000/d/pgz7wp-Gz/aeraki-demo?orgId=1&refresh=10s&kiosk https://www.youtube.com/watch?v=vrjp-Yg3Leg