From 205246bf4cbae2ea3db6cd378b5c070bb708869d Mon Sep 17 00:00:00 2001 From: yangyang Date: Thu, 29 Feb 2024 16:30:00 +0800 Subject: [PATCH] fix #6229 Signed-off-by: yangyang --- internal/envoy/v3/cluster_test.go | 47 +++++++++++++++++++++++++++++++ internal/envoy/v3/endpoint.go | 6 +++- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/internal/envoy/v3/cluster_test.go b/internal/envoy/v3/cluster_test.go index d8b4670a7fe..79ea1525873 100644 --- a/internal/envoy/v3/cluster_test.go +++ b/internal/envoy/v3/cluster_test.go @@ -72,6 +72,29 @@ func TestCluster(t *testing.T) { }, } + s3 := &core_v1.Service{ + ObjectMeta: meta_v1.ObjectMeta{ + Name: "kuard", + Namespace: "default", + }, + Spec: core_v1.ServiceSpec{ + ExternalName: "foo.io", + Ports: []core_v1.ServicePort{ + { + Name: "http", + Protocol: "TCP", + Port: 443, + TargetPort: intstr.FromInt(8080), + }, { + Name: "health-check", + Protocol: "TCP", + Port: 8998, + TargetPort: intstr.FromInt(8998), + }, + }, + }, + } + svcExternal := &core_v1.Service{ ObjectMeta: meta_v1.ObjectMeta{ Name: "kuard", @@ -196,6 +219,17 @@ func TestCluster(t *testing.T) { LoadAssignment: ExternalNameClusterLoadAssignment(service(s2)), }, }, + "externalName service healthcheckport": { + cluster: &dag.Cluster{ + Upstream: healthcheckService(s3), + }, + want: &envoy_config_cluster_v3.Cluster{ + Name: "default/kuard/443/da39a3ee5e", + AltStatName: "default_kuard_443", + ClusterDiscoveryType: ClusterDiscoveryType(envoy_config_cluster_v3.Cluster_STRICT_DNS), + LoadAssignment: ExternalNameClusterLoadAssignment(healthcheckService(s3)), + }, + }, "externalName service - dns-lookup-family v4": { cluster: &dag.Cluster{ Upstream: service(s2), @@ -1192,3 +1226,16 @@ func service(s *core_v1.Service, protocols ...string) *dag.Service { Protocol: protocol, } } + +func healthcheckService(s *core_v1.Service) *dag.Service { + return &dag.Service{ + Weighted: dag.WeightedService{ + Weight: 1, + ServiceName: s.Name, + ServiceNamespace: s.Namespace, + ServicePort: s.Spec.Ports[0], + HealthPort: s.Spec.Ports[1], + }, + ExternalName: s.Spec.ExternalName, + } +} diff --git a/internal/envoy/v3/endpoint.go b/internal/envoy/v3/endpoint.go index 823a36204bd..395c067442d 100644 --- a/internal/envoy/v3/endpoint.go +++ b/internal/envoy/v3/endpoint.go @@ -77,11 +77,15 @@ func ClusterLoadAssignment(name string, addrs ...*envoy_config_core_v3.Address) // ExternalNameClusterLoadAssignment creates a *envoy_config_endpoint_v3.ClusterLoadAssignment pointing to service's ExternalName DNS address. func ExternalNameClusterLoadAssignment(service *dag.Service) *envoy_config_endpoint_v3.ClusterLoadAssignment { - return ClusterLoadAssignment( + cla := ClusterLoadAssignment( xds.ClusterLoadAssignmentName( types.NamespacedName{Name: service.Weighted.ServiceName, Namespace: service.Weighted.ServiceNamespace}, service.Weighted.ServicePort.Name, ), SocketAddress(service.ExternalName, int(service.Weighted.ServicePort.Port)), ) + if service.Weighted.ServicePort.Port != service.Weighted.HealthPort.Port { + cla.Endpoints[0].LbEndpoints[0].GetEndpoint().HealthCheckConfig = HealthCheckConfig(service.Weighted.HealthPort.Port) + } + return cla }