From 40b5890aefc14376b5e18b471cbeccef94ee88e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E7=A5=96=E5=BB=BA?= Date: Fri, 10 Feb 2023 10:20:25 +0800 Subject: [PATCH] feat: support default service session stickiness timeout (#2311) --- Makefile.e2e | 11 ++++++++++- pkg/controller/endpoint.go | 21 ++++++++++++++------- pkg/controller/init.go | 10 ++++++++++ pkg/controller/vpc.go | 10 ++++++++++ pkg/ovs/ovn-nbctl-legacy.go | 10 ++++++++++ pkg/util/const.go | 2 ++ test/e2e/framework/image.go | 2 +- 7 files changed, 57 insertions(+), 9 deletions(-) diff --git a/Makefile.e2e b/Makefile.e2e index 10d419fb1db..454add420c6 100644 --- a/Makefile.e2e +++ b/Makefile.e2e @@ -3,10 +3,19 @@ E2E_IP_FAMILY := $(shell echo $${E2E_IP_FAMILY:-ipv4}) E2E_NETWORK_MODE := $(shell echo $${E2E_NETWORK_MODE:-overlay}) K8S_CONFORMANCE_E2E_FOCUS = "sig-network.*Conformance" "sig-network.*Feature:NoSNAT" -K8S_CONFORMANCE_E2E_SKIP = "sig-network.*Services.*session affinity" +K8S_CONFORMANCE_E2E_SKIP = K8S_NETPOL_E2E_FOCUS = "sig-network.*Feature:NetworkPolicy" K8S_NETPOL_E2E_SKIP = "sig-network.*NetworkPolicyLegacy" +ifeq ($(shell echo $(E2E_BRANCH) | grep -o ^release-),release-) +VERSION_NUM = $(subst release-,,$(E2E_BRANCH)) +VER_MAJOR = $(shell echo $(VERSION_NUM) | cut -f1 -d.) +VER_MINOR = $(shell echo $(VERSION_NUM) | cut -f2 -d.) +ifeq ($(shell test $(VER_MAJOR) -lt 1 -o \( $(VER_MAJOR) -eq 1 -a $(VER_MINOR) -lt 12 \) && echo true),true) +K8S_CONFORMANCE_E2E_SKIP += "sig-network.*Services.*session affinity" +endif +endif + ifeq ($(shell test $(E2E_IP_FAMILY) != ipv6 && echo true),true) K8S_CONFORMANCE_E2E_FOCUS += \ "sig-network.*Feature:Networking-IPv4" \ diff --git a/pkg/controller/endpoint.go b/pkg/controller/endpoint.go index 5179ce6bad0..fcaf8a2e9ed 100644 --- a/pkg/controller/endpoint.go +++ b/pkg/controller/endpoint.go @@ -176,8 +176,9 @@ func (c *Controller) handleUpdateEndpoint(key string) error { } tcpLb, udpLb := vpc.Status.TcpLoadBalancer, vpc.Status.UdpLoadBalancer + oldTcpLb, oldUdpLb := vpc.Status.TcpSessionLoadBalancer, vpc.Status.UdpSessionLoadBalancer if svc.Spec.SessionAffinity == v1.ServiceAffinityClientIP { - tcpLb, udpLb = vpc.Status.TcpSessionLoadBalancer, vpc.Status.UdpSessionLoadBalancer + tcpLb, udpLb, oldTcpLb, oldUdpLb = oldTcpLb, oldUdpLb, tcpLb, udpLb } for _, settingIP := range LbIPs { @@ -193,9 +194,12 @@ func (c *Controller) handleUpdateEndpoint(key string) error { return err } } else { - err = c.ovnLegacyClient.DeleteLoadBalancerVip(vip, tcpLb) - if err != nil { - klog.Errorf("failed to delete vip %s at tcp lb, %v", vip, err) + if err = c.ovnLegacyClient.DeleteLoadBalancerVip(vip, tcpLb); err != nil { + klog.Errorf("failed to delete vip %s from tcp lb %s: %v", vip, tcpLb, err) + return err + } + if err = c.ovnLegacyClient.DeleteLoadBalancerVip(vip, oldTcpLb); err != nil { + klog.Errorf("failed to delete vip %s from tcp lb %s: %v", vip, oldTcpLb, err) return err } } @@ -207,9 +211,12 @@ func (c *Controller) handleUpdateEndpoint(key string) error { return err } } else { - err = c.ovnLegacyClient.DeleteLoadBalancerVip(vip, udpLb) - if err != nil { - klog.Errorf("failed to delete vip %s at udp lb, %v", vip, err) + if err = c.ovnLegacyClient.DeleteLoadBalancerVip(vip, udpLb); err != nil { + klog.Errorf("failed to delete vip %s from udp lb %s: %v", vip, udpLb, err) + return err + } + if err = c.ovnLegacyClient.DeleteLoadBalancerVip(vip, oldUdpLb); err != nil { + klog.Errorf("failed to delete vip %s from udp lb %s: %v", vip, oldUdpLb, err) return err } } diff --git a/pkg/controller/init.go b/pkg/controller/init.go index 761c1cc3144..243da56a2d8 100644 --- a/pkg/controller/init.go +++ b/pkg/controller/init.go @@ -249,6 +249,11 @@ func (c *Controller) initLoadBalancer() error { klog.Infof("tcp session load balancer %s exists", vpcLb.TcpSessLoadBalancer) } + if err = c.ovnLegacyClient.SetLoadBalancerAffinityTimeout(vpcLb.TcpSessLoadBalancer, util.DefaultServiceSessionStickinessTimeout); err != nil { + klog.Errorf("failed to set service session stickiness timeout of cluster tcp session load balancer: %v", err) + return err + } + udpLb, err := c.ovnLegacyClient.FindLoadbalancer(vpcLb.UdpLoadBalancer) if err != nil { return fmt.Errorf("failed to find udp lb: %v", err) @@ -279,6 +284,11 @@ func (c *Controller) initLoadBalancer() error { klog.Infof("udp session load balancer %s exists", vpcLb.UdpSessLoadBalancer) } + if err = c.ovnLegacyClient.SetLoadBalancerAffinityTimeout(vpcLb.UdpSessLoadBalancer, util.DefaultServiceSessionStickinessTimeout); err != nil { + klog.Errorf("failed to set service session stickiness timeout of cluster udp session load balancer: %v", err) + return err + } + vpc.Status.TcpLoadBalancer = vpcLb.TcpLoadBalancer vpc.Status.TcpSessionLoadBalancer = vpcLb.TcpSessLoadBalancer vpc.Status.UdpLoadBalancer = vpcLb.UdpLoadBalancer diff --git a/pkg/controller/vpc.go b/pkg/controller/vpc.go index a8d6beee723..47f03c591c9 100644 --- a/pkg/controller/vpc.go +++ b/pkg/controller/vpc.go @@ -297,6 +297,11 @@ func (c *Controller) addLoadBalancer(vpc string) (*VpcLoadBalancer, error) { klog.Infof("tcp session load balancer %s exists", tcpSessionLb) } + if err = c.ovnLegacyClient.SetLoadBalancerAffinityTimeout(vpcLbConfig.TcpSessLoadBalancer, util.DefaultServiceSessionStickinessTimeout); err != nil { + klog.Errorf("failed to set service session stickiness timeout of cluster tcp session load balancer: %v", err) + return nil, err + } + udpLb, err := c.ovnLegacyClient.FindLoadbalancer(vpcLbConfig.UdpLoadBalancer) if err != nil { return nil, fmt.Errorf("failed to find udp lb %v", err) @@ -327,6 +332,11 @@ func (c *Controller) addLoadBalancer(vpc string) (*VpcLoadBalancer, error) { klog.Infof("udp session load balancer %s exists", udpSessionLb) } + if err = c.ovnLegacyClient.SetLoadBalancerAffinityTimeout(vpcLbConfig.UdpSessLoadBalancer, util.DefaultServiceSessionStickinessTimeout); err != nil { + klog.Errorf("failed to set service session stickiness timeout of cluster udp session load balancer: %v", err) + return nil, err + } + return vpcLbConfig, nil } diff --git a/pkg/ovs/ovn-nbctl-legacy.go b/pkg/ovs/ovn-nbctl-legacy.go index 07c155e3464..d240039e5c7 100644 --- a/pkg/ovs/ovn-nbctl-legacy.go +++ b/pkg/ovs/ovn-nbctl-legacy.go @@ -1479,6 +1479,16 @@ func (c LegacyClient) CreateLoadBalancer(lb, protocol, selectFields string) erro return err } +// SetLoadBalancerAffinityTimeout sets the LB's affinity timeout in seconds +func (c LegacyClient) SetLoadBalancerAffinityTimeout(lb string, timeout int) error { + output, err := c.ovnNbCommand("set", "load_balancer", lb, fmt.Sprintf("options:affinity_timeout=%d", timeout)) + if err != nil { + klog.Errorf("failed to set affinity timeout of LB %s to %d, error: %v, output: %s", lb, timeout, err, output) + return err + } + return nil +} + // CreateLoadBalancerRule create loadbalancer rul in ovn func (c LegacyClient) CreateLoadBalancerRule(lb, vip, ips, protocol string) error { _, err := c.ovnNbCommand(MayExist, "lb-add", lb, vip, ips, strings.ToLower(protocol)) diff --git a/pkg/util/const.go b/pkg/util/const.go index 1ff0f60577e..06cb9636aa4 100644 --- a/pkg/util/const.go +++ b/pkg/util/const.go @@ -202,4 +202,6 @@ const ( U2OInterconnName = "u2o-interconnection.%s.%s" U2OExcludeIPAg = "%s.u2o_exclude_ip.%s" + + DefaultServiceSessionStickinessTimeout = 10800 ) diff --git a/test/e2e/framework/image.go b/test/e2e/framework/image.go index 83bdad7e26f..67c4e367ae4 100644 --- a/test/e2e/framework/image.go +++ b/test/e2e/framework/image.go @@ -3,5 +3,5 @@ package framework const ( PauseImage = "kubeovn/pause:3.2" BusyBoxImage = "busybox:stable" - AgnhostImage = "kubeovn/agnhost:2.40" + AgnhostImage = "kubeovn/agnhost:2.43" )