-
Notifications
You must be signed in to change notification settings - Fork 324
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Adding support for weighted k8s service #2293
Changes from all commits
fdef617
7d47c00
552c0e7
14fa790
9f396c3
3320b62
dc3e24e
3dad9a0
95b3f7c
fa54600
21984e9
31c1506
9a25cbf
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
```release-note:feature | ||
sync-catalog: add ability to support weighted loadbalancing by service annotation `consul.hashicorp.com/service-weight: <number>` | ||
``` |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -511,6 +511,19 @@ func (t *ServiceResource) generateRegistrations(key string) { | |
r.Service = &rs | ||
r.Service.ID = serviceID(r.Service.Service, ip) | ||
r.Service.Address = ip | ||
// Adding information about service weight. | ||
// Overrides the existing weight if present. | ||
if weight, ok := svc.Annotations[annotationServiceWeight]; ok && weight != "" { | ||
weightI, err := getServiceWeight(weight) | ||
if err == nil { | ||
r.Service.Weights = consulapi.AgentWeights{ | ||
Passing: weightI, | ||
} | ||
} else { | ||
t.Log.Debug("[generateRegistrations] service weight err: ", err) | ||
} | ||
} | ||
|
||
t.consulMap[key] = append(t.consulMap[key], &r) | ||
} | ||
|
||
|
@@ -547,6 +560,19 @@ func (t *ServiceResource) generateRegistrations(key string) { | |
r.Service.ID = serviceID(r.Service.Service, addr) | ||
r.Service.Address = addr | ||
|
||
// Adding information about service weight. | ||
// Overrides the existing weight if present. | ||
if weight, ok := svc.Annotations[annotationServiceWeight]; ok && weight != "" { | ||
weightI, err := getServiceWeight(weight) | ||
if err == nil { | ||
r.Service.Weights = consulapi.AgentWeights{ | ||
Passing: weightI, | ||
} | ||
} else { | ||
t.Log.Debug("[generateRegistrations] service weight err: ", err) | ||
} | ||
} | ||
|
||
t.consulMap[key] = append(t.consulMap[key], &r) | ||
} | ||
} | ||
|
@@ -999,3 +1025,18 @@ func (t *ServiceResource) isIngressService(key string) bool { | |
func consulHealthCheckID(k8sNS string, serviceID string) string { | ||
return fmt.Sprintf("%s/%s", k8sNS, serviceID) | ||
} | ||
|
||
// Calculates the passing service weight. | ||
func getServiceWeight(weight string) (int, error) { | ||
// error validation if the input param is a number. | ||
weightI, err := strconv.Atoi(weight) | ||
if err != nil { | ||
return -1, err | ||
} | ||
|
||
if weightI <= 1 { | ||
return -1, fmt.Errorf("expecting the service annotation %s value to be greater than 1", annotationServiceWeight) | ||
Comment on lines
+1037
to
+1038
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe we can add some additional checks here. Can the service weight be greater than 100? if it can, ignore this comment, but just wanted to ensure we have completeness here wrt failing for all invalid service weight! There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Hey thanks for sharing the thoughts. I couldn't find any documentation which mentions the weight to be percentage. To start with all the service default weight is set to 1 hence it is 1:1 which can be considered as equal ratio diversion. I guess in that case it is allowed to go beyond 100. I have seen some example on stackoverflow, users configuring it to 10000:1, not sure if it is valid scenario unless someone wants to do super safe canary test. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Cool! thanks for investigating this! |
||
} | ||
|
||
return weightI, nil | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
these lines 567 - 577 and lines 518 - 528 are exactly the same. can we take it out in a function as well?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The code at both place is constructing the CatalogRegistration object, there is no logic which is duplicate. Read the comment #2293 (comment)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this is ok to keep as is. it appears that the only behavior here is an assignment which IMO is not really duplication.