Я пытаюсь добавить базовую поддержку rls [1] в стеки протоколов Istio для Thrift [2], позволяя пользователю предоставлять внешнюю службу ограничения скорости [3] в качестве переменной среды для Pilot. Я столкнулся с проблемой, когда клиент, кажется, отклонил конфигурацию.
Вот изолированная и упрощенная версия моего кода плоскости управления 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
}
При проверке/config_dump
конечная точка интерфейса администратора Envoy, когда конфигурация ratelimit не указана, прокси присутствует и настроен правильно. Как только я пытаюсь добавить конфигурацию ratelimit, она полностью исчезает.
Что я делаю не так?
- Исходный код, который определяет Thrift ratelimit api: https://github.com/envoyproxy/envoy/blob/master/api/envoy/config/filter/thrift/rate_limit/v2alpha1/rate_limit.proto#L9
- См. Официальные документы здесь: https://www.envoyproxy.io/docs/envoy/latest/api-v2/config/filter/thrift/rate_limit/v2alpha1/rate_limit.proto
- Ссылочная реализация здесь: https://github.com/lyft/ratelimit