From 0fa916749149c67fcb1c51fbdcab20d738854560 Mon Sep 17 00:00:00 2001 From: hanxiantao <601803023@qq.com> Date: Sun, 12 May 2024 16:31:08 +0800 Subject: [PATCH] fix: fix when multiple http2Rpc config constructHttp2RpcEnvoyFilter (#926) --- pkg/ingress/config/ingress_config.go | 134 ++++++++++++++------------- 1 file changed, 69 insertions(+), 65 deletions(-) diff --git a/pkg/ingress/config/ingress_config.go b/pkg/ingress/config/ingress_config.go index 1864fe09b3..4e8e208e35 100644 --- a/pkg/ingress/config/ingress_config.go +++ b/pkg/ingress/config/ingress_config.go @@ -513,6 +513,7 @@ func (m *IngressConfig) convertEnvoyFilter(convertOptions *common.ConvertOptions var envoyFilters []config.Config mappings := map[string]*common.Rule{} + initHttp2RpcGlobalConfig := true for _, routes := range convertOptions.HTTPRoutes { for _, route := range routes { if strings.HasSuffix(route.HTTPRoute.Name, "app-root") { @@ -522,12 +523,13 @@ func (m *IngressConfig) convertEnvoyFilter(convertOptions *common.ConvertOptions http2rpc := route.WrapperConfig.AnnotationsConfig.Http2Rpc if http2rpc != nil { IngressLog.Infof("Found http2rpc for name %s", http2rpc.Name) - envoyFilter, err := m.constructHttp2RpcEnvoyFilter(http2rpc, route, m.namespace) + envoyFilter, err := m.constructHttp2RpcEnvoyFilter(http2rpc, route, m.namespace, initHttp2RpcGlobalConfig) if err != nil { IngressLog.Infof("Construct http2rpc EnvoyFilter error %v", err) } else { IngressLog.Infof("Append http2rpc EnvoyFilter for name %s", http2rpc.Name) envoyFilters = append(envoyFilters, *envoyFilter) + initHttp2RpcGlobalConfig = false } } @@ -1143,7 +1145,7 @@ func (m *IngressConfig) applyCanaryIngresses(convertOptions *common.ConvertOptio } } -func (m *IngressConfig) constructHttp2RpcEnvoyFilter(http2rpcConfig *annotations.Http2RpcConfig, route *common.WrapperHTTPRoute, namespace string) (*config.Config, error) { +func (m *IngressConfig) constructHttp2RpcEnvoyFilter(http2rpcConfig *annotations.Http2RpcConfig, route *common.WrapperHTTPRoute, namespace string, initHttp2RpcGlobalConfig bool) (*config.Config, error) { mappings := m.http2rpcs IngressLog.Infof("Found http2rpc mappings %v", mappings) if _, exist := mappings[http2rpcConfig.Name]; !exist { @@ -1163,75 +1165,39 @@ func (m *IngressConfig) constructHttp2RpcEnvoyFilter(http2rpcConfig *annotations if err != nil { return nil, errors.New(err.Error()) } - - return &config.Config{ - Meta: config.Meta{ - GroupVersionKind: gvk.EnvoyFilter, - Name: common.CreateConvertedName(constants.IstioIngressGatewayName, http2rpcConfig.Name), - Namespace: namespace, - }, - Spec: &networking.EnvoyFilter{ - ConfigPatches: []*networking.EnvoyFilter_EnvoyConfigObjectPatch{ - { - ApplyTo: networking.EnvoyFilter_HTTP_FILTER, - Match: &networking.EnvoyFilter_EnvoyConfigObjectMatch{ - Context: networking.EnvoyFilter_GATEWAY, - ObjectTypes: &networking.EnvoyFilter_EnvoyConfigObjectMatch_Listener{ - Listener: &networking.EnvoyFilter_ListenerMatch{ - FilterChain: &networking.EnvoyFilter_ListenerMatch_FilterChainMatch{ - Filter: &networking.EnvoyFilter_ListenerMatch_FilterMatch{ - Name: "envoy.filters.network.http_connection_manager", - SubFilter: &networking.EnvoyFilter_ListenerMatch_SubFilterMatch{ - Name: "envoy.filters.http.router", - }, - }, - }, + configPatches := []*networking.EnvoyFilter_EnvoyConfigObjectPatch{ + { + ApplyTo: networking.EnvoyFilter_HTTP_ROUTE, + Match: &networking.EnvoyFilter_EnvoyConfigObjectMatch{ + Context: networking.EnvoyFilter_GATEWAY, + ObjectTypes: &networking.EnvoyFilter_EnvoyConfigObjectMatch_RouteConfiguration{ + RouteConfiguration: &networking.EnvoyFilter_RouteConfigurationMatch{ + Vhost: &networking.EnvoyFilter_RouteConfigurationMatch_VirtualHostMatch{ + Route: &networking.EnvoyFilter_RouteConfigurationMatch_RouteMatch{ + Name: httpRoute.Name, }, }, }, - Patch: &networking.EnvoyFilter_Patch{ - Operation: networking.EnvoyFilter_Patch_INSERT_BEFORE, - Value: buildPatchStruct(`{ - "name":"envoy.filters.http.http_dubbo_transcoder", - "typed_config":{ - "@type":"type.googleapis.com/udpa.type.v1.TypedStruct", - "type_url":"type.googleapis.com/envoy.extensions.filters.http.http_dubbo_transcoder.v3.HttpDubboTranscoder" - } - }`), - }, }, - { - ApplyTo: networking.EnvoyFilter_HTTP_ROUTE, - Match: &networking.EnvoyFilter_EnvoyConfigObjectMatch{ - Context: networking.EnvoyFilter_GATEWAY, - ObjectTypes: &networking.EnvoyFilter_EnvoyConfigObjectMatch_RouteConfiguration{ - RouteConfiguration: &networking.EnvoyFilter_RouteConfigurationMatch{ - Vhost: &networking.EnvoyFilter_RouteConfigurationMatch_VirtualHostMatch{ - Route: &networking.EnvoyFilter_RouteConfigurationMatch_RouteMatch{ - Name: httpRoute.Name, - }, - }, - }, - }, - }, - Patch: &networking.EnvoyFilter_Patch{ - Operation: networking.EnvoyFilter_Patch_MERGE, - Value: typeStruct, + }, + Patch: &networking.EnvoyFilter_Patch{ + Operation: networking.EnvoyFilter_Patch_MERGE, + Value: typeStruct, + }, + }, + { + ApplyTo: networking.EnvoyFilter_CLUSTER, + Match: &networking.EnvoyFilter_EnvoyConfigObjectMatch{ + Context: networking.EnvoyFilter_GATEWAY, + ObjectTypes: &networking.EnvoyFilter_EnvoyConfigObjectMatch_Cluster{ + Cluster: &networking.EnvoyFilter_ClusterMatch{ + Service: httpRouteDestination.Destination.Host, }, }, - { - ApplyTo: networking.EnvoyFilter_CLUSTER, - Match: &networking.EnvoyFilter_EnvoyConfigObjectMatch{ - Context: networking.EnvoyFilter_GATEWAY, - ObjectTypes: &networking.EnvoyFilter_EnvoyConfigObjectMatch_Cluster{ - Cluster: &networking.EnvoyFilter_ClusterMatch{ - Service: httpRouteDestination.Destination.Host, - }, - }, - }, - Patch: &networking.EnvoyFilter_Patch{ - Operation: networking.EnvoyFilter_Patch_MERGE, - Value: buildPatchStruct(`{ + }, + Patch: &networking.EnvoyFilter_Patch{ + Operation: networking.EnvoyFilter_Patch_MERGE, + Value: buildPatchStruct(`{ "upstream_config": { "name":"envoy.upstreams.http.dubbo_tcp", "typed_config":{ @@ -1240,9 +1206,47 @@ func (m *IngressConfig) constructHttp2RpcEnvoyFilter(http2rpcConfig *annotations } } }`), + }, + }, + } + if initHttp2RpcGlobalConfig { + configPatches = append(configPatches, &networking.EnvoyFilter_EnvoyConfigObjectPatch{ + ApplyTo: networking.EnvoyFilter_HTTP_FILTER, + Match: &networking.EnvoyFilter_EnvoyConfigObjectMatch{ + Context: networking.EnvoyFilter_GATEWAY, + ObjectTypes: &networking.EnvoyFilter_EnvoyConfigObjectMatch_Listener{ + Listener: &networking.EnvoyFilter_ListenerMatch{ + FilterChain: &networking.EnvoyFilter_ListenerMatch_FilterChainMatch{ + Filter: &networking.EnvoyFilter_ListenerMatch_FilterMatch{ + Name: "envoy.filters.network.http_connection_manager", + SubFilter: &networking.EnvoyFilter_ListenerMatch_SubFilterMatch{ + Name: "envoy.filters.http.router", + }, + }, + }, }, }, }, + Patch: &networking.EnvoyFilter_Patch{ + Operation: networking.EnvoyFilter_Patch_INSERT_BEFORE, + Value: buildPatchStruct(`{ + "name":"envoy.filters.http.http_dubbo_transcoder", + "typed_config":{ + "@type":"type.googleapis.com/udpa.type.v1.TypedStruct", + "type_url":"type.googleapis.com/envoy.extensions.filters.http.http_dubbo_transcoder.v3.HttpDubboTranscoder" + } + }`), + }, + }) + } + return &config.Config{ + Meta: config.Meta{ + GroupVersionKind: gvk.EnvoyFilter, + Name: common.CreateConvertedName(constants.IstioIngressGatewayName, http2rpcConfig.Name), + Namespace: namespace, + }, + Spec: &networking.EnvoyFilter{ + ConfigPatches: configPatches, }, }, nil }