From 955d385b839ecf19ed077109fddae9fc9ac49e98 Mon Sep 17 00:00:00 2001 From: ErwinsExpertise Date: Mon, 6 Mar 2023 10:12:49 -0500 Subject: [PATCH] ipv6 support for vlb --- vultr/instances.go | 4 ++++ vultr/instancesv2.go | 5 ++++ vultr/loadbalancers.go | 52 ++++++++++++++++++++++++++++++++---------- 3 files changed, 49 insertions(+), 12 deletions(-) diff --git a/vultr/instances.go b/vultr/instances.go index 9f7a83bc..de6af036 100644 --- a/vultr/instances.go +++ b/vultr/instances.go @@ -153,6 +153,10 @@ func (i *instances) nodeAddresses(instance *govultr.Instance) ([]v1.NodeAddress, v1.NodeAddress{Type: v1.NodeExternalIP, Address: instance.MainIP}, // public IP ) + if instance.V6MainIP != "" { + addresses = append(addresses, v1.NodeAddress{Type: v1.NodeExternalIP, Address: instance.V6MainIP}) // IPv6 + } + return addresses, nil } diff --git a/vultr/instancesv2.go b/vultr/instancesv2.go index 6f31d0b0..a5c61c65 100644 --- a/vultr/instancesv2.go +++ b/vultr/instancesv2.go @@ -111,6 +111,11 @@ func (i *instancesv2) nodeAddresses(instance *govultr.Instance) ([]v1.NodeAddres v1.NodeAddress{Type: v1.NodeInternalIP, Address: instance.InternalIP}, // private IP v1.NodeAddress{Type: v1.NodeExternalIP, Address: instance.MainIP}, // public IP ) + + if instance.V6MainIP != "" { + addresses = append(addresses, v1.NodeAddress{Type: v1.NodeExternalIP, Address: instance.V6MainIP}) // IPv6 + } + return addresses, nil } diff --git a/vultr/loadbalancers.go b/vultr/loadbalancers.go index e840d753..8e14e6ef 100644 --- a/vultr/loadbalancers.go +++ b/vultr/loadbalancers.go @@ -105,13 +105,17 @@ func (l *loadbalancers) GetLoadBalancer(ctx context.Context, clusterName string, return nil, false, err } + enabledIPv6 := checkEnabledIPv6(service) + var ingress []v1.LoadBalancerIngress + + ingress = append(ingress, v1.LoadBalancerIngress{Hostname: lb.Label, IP: lb.IPV4}) + + if enabledIPv6 { + ingress = append(ingress, v1.LoadBalancerIngress{Hostname: lb.Label, IP: lb.IPV6}) + } + return &v1.LoadBalancerStatus{ - Ingress: []v1.LoadBalancerIngress{ - { - IP: lb.IPV4, - Hostname: lb.Label, - }, - }, + Ingress: ingress, }, true, nil } @@ -148,13 +152,17 @@ func (l *loadbalancers) EnsureLoadBalancer(ctx context.Context, clusterName stri return nil, fmt.Errorf("load-balancer is not yet active - current status: %s", lb2.Status) } + enabledIPv6 := checkEnabledIPv6(service) + var ingress []v1.LoadBalancerIngress + + ingress = append(ingress, v1.LoadBalancerIngress{Hostname: lb2.Label, IP: lb2.IPV4}) + + if enabledIPv6 { + ingress = append(ingress, v1.LoadBalancerIngress{Hostname: lb2.Label, IP: lb2.IPV6}) + } + return &v1.LoadBalancerStatus{ - Ingress: []v1.LoadBalancerIngress{ - { - IP: lb2.IPV4, - Hostname: lb2.Label, - }, - }, + Ingress: ingress, }, nil } @@ -849,3 +857,23 @@ func getBackendProtocol(service *v1.Service) string { return "" } } + +// checkEnabledIPv6 checks whether or not IPv6 is requested on the resource +func checkEnabledIPv6(service *v1.Service) bool { + if family := service.Spec.IPFamilies; len(family) >= 1 { + for _, fam := range family { + if fam == "IPv6" { + return true + } + } + } + + if service.Spec.IPFamilyPolicy != nil { + policy := *service.Spec.IPFamilyPolicy + if policy == v1.IPFamilyPolicyPreferDualStack || policy == v1.IPFamilyPolicyRequireDualStack { + return true + } + } + + return false +}