Skip to content

Commit 739b317

Browse files
authored
LB: Stop recreating monitors if no-HTTP is forced (kubernetes#2040)
PR kubernetes#2000 had added falling back to regular nodePort healthchecks when Octavia wouldn't support HTTP monitor, but ommitted healthmonitor update code, resulting in constant delete-and-recreate cycles. This commit fixes this by making sure update code correctly checks if HTTP monitor is expected.
1 parent 23c82d3 commit 739b317

File tree

1 file changed

+21
-32
lines changed

1 file changed

+21
-32
lines changed

pkg/openstack/loadbalancer.go

Lines changed: 21 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1177,8 +1177,8 @@ func (lbaas *LbaasV2) ensureOctaviaHealthMonitor(lbID string, name string, pool
11771177
return err
11781178
}
11791179
//Recreate health monitor with correct protocol if externalTrafficPolicy was changed
1180-
if (svcConf.healthCheckNodePort > 0 && monitor.Type != "HTTP") ||
1181-
(svcConf.healthCheckNodePort == 0 && monitor.Type == "HTTP") {
1180+
createOpts := lbaas.buildMonitorCreateOpts(svcConf, port)
1181+
if createOpts.Type != monitor.Type {
11821182
klog.InfoS("Recreating health monitor for the pool", "pool", pool.ID, "oldMonitor", monitorID)
11831183
if err := openstackutil.DeleteHealthMonitor(lbaas.lb, monitorID, lbID); err != nil {
11841184
return err
@@ -1221,6 +1221,18 @@ func (lbaas *LbaasV2) ensureOctaviaHealthMonitor(lbID string, name string, pool
12211221
return nil
12221222
}
12231223

1224+
func (lbaas *LbaasV2) canUseHTTPMonitor(port corev1.ServicePort) bool {
1225+
if lbaas.opts.LBProvider == "ovn" {
1226+
// ovn-octavia-provider doesn't support HTTP monitors at all. We got to avoid creating it with ovn.
1227+
return false
1228+
} else if port.Protocol == corev1.ProtocolUDP {
1229+
// Older Octavia versions or OVN provider doesn't support HTTP monitors on UDP pools. We got to check if that's the case.
1230+
return openstackutil.IsOctaviaFeatureSupported(lbaas.lb, openstackutil.OctaviaFeatureHTTPMonitorsOnUDP, lbaas.opts.LBProvider)
1231+
}
1232+
1233+
return true
1234+
}
1235+
12241236
// buildMonitorCreateOpts returns a v2monitors.CreateOpts without PoolID for consumption of both, fully popuplated Loadbalancers and Monitors.
12251237
func (lbaas *LbaasV2) buildMonitorCreateOpts(svcConf *serviceConfig, port corev1.ServicePort) v2monitors.CreateOpts {
12261238
opts := v2monitors.CreateOpts{
@@ -1232,22 +1244,11 @@ func (lbaas *LbaasV2) buildMonitorCreateOpts(svcConf *serviceConfig, port corev1
12321244
if port.Protocol == corev1.ProtocolUDP {
12331245
opts.Type = "UDP-CONNECT"
12341246
}
1235-
if svcConf.healthCheckNodePort > 0 {
1236-
setHTTPHealthMonitor := true
1237-
if lbaas.opts.LBProvider == "ovn" {
1238-
// ovn-octavia-provider doesn't support HTTP monitors at all. We got to avoid creating it with ovn.
1239-
setHTTPHealthMonitor = false
1240-
} else if opts.Type == "UDP-CONNECT" {
1241-
// Older Octavia versions or OVN provider doesn't support HTTP monitors on UDP pools. We got to check if that's the case.
1242-
setHTTPHealthMonitor = openstackutil.IsOctaviaFeatureSupported(lbaas.lb, openstackutil.OctaviaFeatureHTTPMonitorsOnUDP, lbaas.opts.LBProvider)
1243-
}
1244-
1245-
if setHTTPHealthMonitor {
1246-
opts.Type = "HTTP"
1247-
opts.URLPath = "/healthz"
1248-
opts.HTTPMethod = "GET"
1249-
opts.ExpectedCodes = "200"
1250-
}
1247+
if svcConf.healthCheckNodePort > 0 && lbaas.canUseHTTPMonitor(port) {
1248+
opts.Type = "HTTP"
1249+
opts.URLPath = "/healthz"
1250+
opts.HTTPMethod = "GET"
1251+
opts.ExpectedCodes = "200"
12511252
}
12521253
return opts
12531254
}
@@ -1373,20 +1374,8 @@ func (lbaas *LbaasV2) buildBatchUpdateMemberOpts(port corev1.ServicePort, nodes
13731374
Name: &node.Name,
13741375
SubnetID: &svcConf.lbMemberSubnetID,
13751376
}
1376-
if svcConf.healthCheckNodePort > 0 {
1377-
useHealthCheckNodePort := true
1378-
if lbaas.opts.LBProvider == "ovn" {
1379-
// ovn-octavia-provider doesn't support HTTP monitors at all, if we have it we got to rely on NodePort
1380-
// and UDP-CONNECT health monitor.
1381-
useHealthCheckNodePort = false
1382-
} else if port.Protocol == "UDP" {
1383-
// Older Octavia versions doesn't support HTTP monitors on UDP pools. If we have one like that, we got
1384-
// to rely on checking the NodePort instead.
1385-
useHealthCheckNodePort = openstackutil.IsOctaviaFeatureSupported(lbaas.lb, openstackutil.OctaviaFeatureHTTPMonitorsOnUDP, lbaas.opts.LBProvider)
1386-
}
1387-
if useHealthCheckNodePort {
1388-
member.MonitorPort = &svcConf.healthCheckNodePort
1389-
}
1377+
if svcConf.healthCheckNodePort > 0 && lbaas.canUseHTTPMonitor(port) {
1378+
member.MonitorPort = &svcConf.healthCheckNodePort
13901379
}
13911380
members = append(members, member)
13921381
newMembers.Insert(fmt.Sprintf("%s-%s-%d-%d", node.Name, addr, member.ProtocolPort, svcConf.healthCheckNodePort))

0 commit comments

Comments
 (0)