From 8a8664601e1239116b0c61171deacbe2aa9befdf Mon Sep 17 00:00:00 2001 From: cmondragon Date: Wed, 5 Mar 2025 11:43:51 -0500 Subject: [PATCH 1/4] Update loadbalancer annotations --- vultr/loadbalancers.go | 74 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/vultr/loadbalancers.go b/vultr/loadbalancers.go index 8624ed09..e2bea6be 100644 --- a/vultr/loadbalancers.go +++ b/vultr/loadbalancers.go @@ -66,6 +66,9 @@ const ( annoVultrAlgorithm = "service.beta.kubernetes.io/vultr-loadbalancer-algorithm" annoVultrSSLRedirect = "service.beta.kubernetes.io/vultr-loadbalancer-ssl-redirect" annoVultrProxyProtocol = "service.beta.kubernetes.io/vultr-loadbalancer-proxy-protocol" + annoVultrLBHTTP2 = "service.beta.kubernetes.io/vultr-loadbalancer-http2" + annoVultrLBHTTP3 = "service.beta.kubernetes.io/vultr-loadbalancer-http3" + annoVultrLBTimeout = "service.beta.kubernetes.io/vultr-loadbalancer-timeout" annoVultrStickySessionEnabled = "service.beta.kubernetes.io/vultr-loadbalancer-sticky-session-enabled" annoVultrStickySessionCookieName = "service.beta.kubernetes.io/vultr-loadbalancer-sticky-session-cookie-name" @@ -76,6 +79,8 @@ const ( annoVultrNodeCount = "service.beta.kubernetes.io/vultr-loadbalancer-node-count" + annoVultrLBGlobalRegions = "service.beta.kubernetes.io/vultr-loadbalancer-global-regions" + // annoVultrLBSSLLastUpdatedTime is used to keep track of when a SVC is updated due to the SSL secret being updated annoVultrLBSSLLastUpdatedTime = "service.beta.kubernetes.io/vultr-loadbalancer-ssl-last-updated" @@ -418,6 +423,11 @@ func (l *loadbalancers) buildLoadBalancerRequest(service *v1.Service, nodes []*v return nil, err } + timeout, err := getTimeout(service) + if err != nil { + return nil, err + } + var ssl *govultr.SSL if secretName, ok := service.Annotations[annoVultrLBSSL]; ok { ssl, err = l.GetSSL(service, secretName) @@ -438,6 +448,11 @@ func (l *loadbalancers) buildLoadBalancerRequest(service *v1.Service, nodes []*v return nil, err } + globalRegions, err := getGlobalRegions(service) + if err != nil { + return nil, err + } + nodeC := 1 if count, ok := service.Annotations[annoVultrNodeCount]; ok { @@ -461,10 +476,14 @@ func (l *loadbalancers) buildLoadBalancerRequest(service *v1.Service, nodes []*v ForwardingRules: rules, // all always be set SSL: ssl, // will always be set SSLRedirect: govultr.BoolToBoolPtr(getSSLRedirect(service)), // need to check + HTTP2: govultr.BoolToBoolPtr(getHTTP2(service)), // need to check + HTTP3: govultr.BoolToBoolPtr(getHTTP3(service)), // need to check ProxyProtocol: govultr.BoolToBoolPtr(getProxyProtocol(service)), // need to check BalancingAlgorithm: getAlgorithm(service), // will always be set FirewallRules: firewallRules, // need to check + Timeout: timeout, // need to check VPC: govultr.StringToStringPtr(vpc), // need to check + GlobalRegions: globalRegions, // need to check Nodes: nodeC, // need to check }, nil } @@ -901,6 +920,61 @@ func getProxyProtocol(service *v1.Service) bool { return pass } +func getHTTP2(service *v1.Service) bool { + http2, ok := service.Annotations[annoVultrLBHTTP2] + if !ok { + return false + } + + protocolHTTP2, err := strconv.ParseBool(http2) + if err != nil { + return false + } + + return protocolHTTP2 +} + +func getHTTP3(service *v1.Service) bool { + http3, ok := service.Annotations[annoVultrLBHTTP3] + if !ok { + return false + } + + protocolHTTP3, err := strconv.ParseBool(http3) + if err != nil { + return false + } + + return protocolHTTP3 +} + +func getTimeout(service *v1.Service) (int, error) { + lbtimeout, ok := service.Annotations[annoVultrLBTimeout] + if !ok { + return 600, nil + } + + timeout, err := strconv.Atoi(lbtimeout) + if err != nil { + return 0, fmt.Errorf("invalid timeout value: %v", err) + } + return timeout, nil +} + +func getGlobalRegions(service *v1.Service) ([]string, error) { + regions, ok := service.Annotations[annoVultrLBGlobalRegions] + if !ok || regions == "" { + return nil, nil + } + + regionList := strings.Split(regions, ",") + for v := range regionList { + regionList[v] = strings.TrimSpace(regionList[v]) + } + + return regionList, nil +} + func buildFirewallRules(service *v1.Service) ([]govultr.LBFirewallRule, error) { lbFWRules := []govultr.LBFirewallRule{} fwRules := getFirewallRules(service) From d76e9f2f0bd7425400a03c9944157d3ed602093b Mon Sep 17 00:00:00 2001 From: cmondragon Date: Wed, 5 Mar 2025 13:44:39 -0500 Subject: [PATCH 2/4] fix linter warnings --- vultr/loadbalancers.go | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/vultr/loadbalancers.go b/vultr/loadbalancers.go index e2bea6be..1ab79cc6 100644 --- a/vultr/loadbalancers.go +++ b/vultr/loadbalancers.go @@ -97,6 +97,8 @@ const ( healthCheckUnhealthy = 5 healthCheckHealthy = 5 + defaultLBTimeout = 600 + lbStatusActive = "active" ) @@ -448,11 +450,6 @@ func (l *loadbalancers) buildLoadBalancerRequest(service *v1.Service, nodes []*v return nil, err } - globalRegions, err := getGlobalRegions(service) - if err != nil { - return nil, err - } - nodeC := 1 if count, ok := service.Annotations[annoVultrNodeCount]; ok { @@ -483,7 +480,7 @@ func (l *loadbalancers) buildLoadBalancerRequest(service *v1.Service, nodes []*v FirewallRules: firewallRules, // need to check Timeout: timeout, // need to check VPC: govultr.StringToStringPtr(vpc), // need to check - GlobalRegions: globalRegions, // need to check + GlobalRegions: getGlobalRegions(service), // need to check Nodes: nodeC, // need to check }, nil } @@ -951,7 +948,7 @@ func getHTTP3(service *v1.Service) bool { func getTimeout(service *v1.Service) (int, error) { lbtimeout, ok := service.Annotations[annoVultrLBTimeout] if !ok { - return 600, nil + return defaultLBTimeout, nil } timeout, err := strconv.Atoi(lbtimeout) @@ -961,18 +958,18 @@ func getTimeout(service *v1.Service) (int, error) { return timeout, nil } -func getGlobalRegions(service *v1.Service) ([]string, error) { - regions, ok := service.Annotations[annoVultrLBGlobalRegions] - if !ok || regions == "" { - return nil, nil - } +func getGlobalRegions(service *v1.Service) []string { + regions, ok := service.Annotations[annoVultrLBGlobalRegions] + if !ok || regions == "" { + return nil + } - regionList := strings.Split(regions, ",") - for v := range regionList { - regionList[v] = strings.TrimSpace(regionList[v]) - } + regionList := strings.Split(regions, ",") + for v := range regionList { + regionList[v] = strings.TrimSpace(regionList[v]) + } - return regionList, nil + return regionList } func buildFirewallRules(service *v1.Service) ([]govultr.LBFirewallRule, error) { From 7fb8ee097a2790a3eb5ee17ff94907afdad603f9 Mon Sep 17 00:00:00 2001 From: cmondragon Date: Wed, 5 Mar 2025 13:49:09 -0500 Subject: [PATCH 3/4] Fix formatting --- vultr/loadbalancers.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/vultr/loadbalancers.go b/vultr/loadbalancers.go index 1ab79cc6..371560f9 100644 --- a/vultr/loadbalancers.go +++ b/vultr/loadbalancers.go @@ -959,17 +959,17 @@ func getTimeout(service *v1.Service) (int, error) { } func getGlobalRegions(service *v1.Service) []string { - regions, ok := service.Annotations[annoVultrLBGlobalRegions] - if !ok || regions == "" { - return nil - } + regions, ok := service.Annotations[annoVultrLBGlobalRegions] + if !ok || regions == "" { + return nil + } - regionList := strings.Split(regions, ",") - for v := range regionList { - regionList[v] = strings.TrimSpace(regionList[v]) - } + regionList := strings.Split(regions, ",") + for v := range regionList { + regionList[v] = strings.TrimSpace(regionList[v]) + } - return regionList + return regionList } func buildFirewallRules(service *v1.Service) ([]govultr.LBFirewallRule, error) { From 5668f0ecb03bc8585c842a39b4e57c68be1b534b Mon Sep 17 00:00:00 2001 From: cmondragon Date: Thu, 6 Mar 2025 12:06:44 -0500 Subject: [PATCH 4/4] Remove load balancer GlobalRegion annotation --- vultr/loadbalancers.go | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/vultr/loadbalancers.go b/vultr/loadbalancers.go index 371560f9..022566e9 100644 --- a/vultr/loadbalancers.go +++ b/vultr/loadbalancers.go @@ -79,8 +79,6 @@ const ( annoVultrNodeCount = "service.beta.kubernetes.io/vultr-loadbalancer-node-count" - annoVultrLBGlobalRegions = "service.beta.kubernetes.io/vultr-loadbalancer-global-regions" - // annoVultrLBSSLLastUpdatedTime is used to keep track of when a SVC is updated due to the SSL secret being updated annoVultrLBSSLLastUpdatedTime = "service.beta.kubernetes.io/vultr-loadbalancer-ssl-last-updated" @@ -480,7 +478,6 @@ func (l *loadbalancers) buildLoadBalancerRequest(service *v1.Service, nodes []*v FirewallRules: firewallRules, // need to check Timeout: timeout, // need to check VPC: govultr.StringToStringPtr(vpc), // need to check - GlobalRegions: getGlobalRegions(service), // need to check Nodes: nodeC, // need to check }, nil } @@ -958,20 +955,6 @@ func getTimeout(service *v1.Service) (int, error) { return timeout, nil } -func getGlobalRegions(service *v1.Service) []string { - regions, ok := service.Annotations[annoVultrLBGlobalRegions] - if !ok || regions == "" { - return nil - } - - regionList := strings.Split(regions, ",") - for v := range regionList { - regionList[v] = strings.TrimSpace(regionList[v]) - } - - return regionList -} - func buildFirewallRules(service *v1.Service) ([]govultr.LBFirewallRule, error) { lbFWRules := []govultr.LBFirewallRule{} fwRules := getFirewallRules(service)