|
|
@ -168,13 +168,22 @@ func (s *ResourceGenerator) listenersFromSnapshotConnectProxy(cfgSnap *proxycfg. |
|
|
|
// We do not match on all endpoints here since it would lead to load balancing across
|
|
|
|
// We do not match on all endpoints here since it would lead to load balancing across
|
|
|
|
// all instances when any instance address is dialed.
|
|
|
|
// all instances when any instance address is dialed.
|
|
|
|
for _, e := range endpoints { |
|
|
|
for _, e := range endpoints { |
|
|
|
if vip := e.Service.TaggedAddresses[virtualIPTag]; vip.Address != "" { |
|
|
|
if vip := e.Service.TaggedAddresses[structs.TaggedAddressVirtualIP]; vip.Address != "" { |
|
|
|
uniqueAddrs[vip.Address] = struct{}{} |
|
|
|
uniqueAddrs[vip.Address] = struct{}{} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// The virtualIPTag is used by consul-k8s to store the ClusterIP for a service.
|
|
|
|
|
|
|
|
// We only match on this virtual IP if the upstream is in the proxy's partition.
|
|
|
|
|
|
|
|
// This is because the IP is not guaranteed to be unique across k8s clusters.
|
|
|
|
|
|
|
|
if structs.EqualPartitions(e.Node.PartitionOrDefault(), cfgSnap.ProxyID.PartitionOrDefault()) { |
|
|
|
|
|
|
|
if vip := e.Service.TaggedAddresses[virtualIPTag]; vip.Address != "" { |
|
|
|
|
|
|
|
uniqueAddrs[vip.Address] = struct{}{} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
if len(uniqueAddrs) > 1 { |
|
|
|
if len(uniqueAddrs) > 2 { |
|
|
|
s.Logger.Warn("detected multiple virtual IPs for an upstream, all will be used to match traffic", |
|
|
|
s.Logger.Debug("detected multiple virtual IPs for an upstream, all will be used to match traffic", |
|
|
|
"upstream", id) |
|
|
|
"upstream", id, "ip_count", len(uniqueAddrs)) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// For every potential address we collected, create the appropriate address prefix to match on.
|
|
|
|
// For every potential address we collected, create the appropriate address prefix to match on.
|
|
|
|