2018-03-09 21:09:41 +00:00
/ *
Copyright 2016 The Kubernetes Authors .
Licensed under the Apache License , Version 2.0 ( the "License" ) ;
you may not use this file except in compliance with the License .
You may obtain a copy of the License at
http : //www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing , software
distributed under the License is distributed on an "AS IS" BASIS ,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
See the License for the specific language governing permissions and
limitations under the License .
* /
package loadbalancing
import (
2021-08-21 20:42:00 +00:00
networking "k8s.io/api/networking/v1"
2018-03-09 21:09:41 +00:00
"k8s.io/ingress-nginx/internal/ingress/annotations/parser"
"k8s.io/ingress-nginx/internal/ingress/resolver"
)
2024-09-06 14:59:43 +00:00
// LB Algorithms are defined in https://github.com/kubernetes/ingress-nginx/blob/d3e75b056f77be54e01bdb18675f1bb46caece31/rootfs/etc/nginx/lua/balancer.lua#L28
2023-07-22 03:32:07 +00:00
const (
2024-09-06 14:59:43 +00:00
loadBalanceAlgorithmAnnotation = "load-balance"
2023-07-22 03:32:07 +00:00
)
2024-09-06 14:59:43 +00:00
var loadBalanceAlgorithms = [ ] string { "round_robin" , "chash" , "chashsubset" , "sticky_balanced" , "sticky_persistent" , "ewma" }
2023-07-22 03:32:07 +00:00
var loadBalanceAnnotations = parser . Annotation {
Group : "backend" ,
Annotations : parser . AnnotationFields {
2024-09-06 14:59:43 +00:00
loadBalanceAlgorithmAnnotation : {
Validator : parser . ValidateOptions ( loadBalanceAlgorithms , true , true ) ,
2023-07-22 03:32:07 +00:00
Scope : parser . AnnotationScopeLocation ,
Risk : parser . AnnotationRiskLow ,
2024-09-06 14:59:43 +00:00
Documentation : ` This annotation allows setting the load balancing algorithm that should be used . If none is specified , defaults to
2023-07-22 03:32:07 +00:00
the default configured by Ingress admin , otherwise to round_robin ` ,
} ,
} ,
}
2018-03-09 21:09:41 +00:00
type loadbalancing struct {
2023-07-22 03:32:07 +00:00
r resolver . Resolver
annotationConfig parser . Annotation
2018-03-09 21:09:41 +00:00
}
2023-07-22 03:32:07 +00:00
// NewParser creates a new Load Balancer annotation parser
2018-03-09 21:09:41 +00:00
func NewParser ( r resolver . Resolver ) parser . IngressAnnotation {
2023-07-22 03:32:07 +00:00
return loadbalancing {
r : r ,
annotationConfig : loadBalanceAnnotations ,
}
2018-03-09 21:09:41 +00:00
}
// Parse parses the annotations contained in the ingress rule
// used to indicate if the location/s contains a fragment of
// configuration to be included inside the paths of the rules
2019-06-09 22:49:59 +00:00
func ( a loadbalancing ) Parse ( ing * networking . Ingress ) ( interface { } , error ) {
2024-09-06 14:59:43 +00:00
return parser . GetStringAnnotation ( loadBalanceAlgorithmAnnotation , ing , a . annotationConfig . Annotations )
2023-07-22 03:32:07 +00:00
}
func ( a loadbalancing ) GetDocumentation ( ) parser . AnnotationFields {
return a . annotationConfig . Annotations
}
func ( a loadbalancing ) Validate ( anns map [ string ] string ) error {
maxrisk := parser . StringRiskToRisk ( a . r . GetSecurityConfiguration ( ) . AnnotationsRiskLevel )
return parser . CheckAnnotationRisk ( anns , maxrisk , loadBalanceAnnotations . Annotations )
2018-03-09 21:09:41 +00:00
}