Skip to content

Commit d4ffc45

Browse files
authored
Merge pull request #127 from qiangzii/master
Optimized for scenarios with unhealthy nodes and no backends
2 parents d993110 + baff6e0 commit d4ffc45

5 files changed

Lines changed: 52 additions & 13 deletions

File tree

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ test: fmt vet
4242
go test -v -cover ./pkg/...
4343
fmt:
4444
go fmt ./pkg/... ./cmd/...
45+
4546
vet:
4647
go vet ./pkg/... ./cmd/...
4748

pkg/controllers/clusternode/cluster_node_controller.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
genericcontrollermanager "k8s.io/controller-manager/app"
2222
"k8s.io/klog"
2323

24+
"github.com/yunify/qingcloud-cloud-controller-manager/pkg/controllers/utils"
2425
"github.com/yunify/qingcloud-cloud-controller-manager/pkg/qingcloud"
2526
)
2627

@@ -175,16 +176,18 @@ func (cnc *ClusterNodeController) handleNodesUpdate(key string) error {
175176

176177
// 1. get node list
177178
var nodes []*corev1.Node
178-
nodeList, err := cnc.nodeLister.List(labels.NewSelector())
179+
nodeList, err := cnc.nodeLister.List(labels.Everything())
179180
if err != nil {
180181
return fmt.Errorf("get node list error: %v", err)
181182
}
182183
for i, _ := range nodeList {
183-
nodes = append(nodes, nodeList[i])
184+
if utils.NodeConditionCheck(nodeList[i]) {
185+
nodes = append(nodes, nodeList[i])
186+
}
184187
}
185188

186189
// 2. list all service
187-
svcs, err := cnc.serviceLister.List(labels.NewSelector())
190+
svcs, err := cnc.serviceLister.List(labels.Everything())
188191
if err != nil {
189192
return fmt.Errorf("list service error: %v", err)
190193
}

pkg/controllers/endpoint/endpoint_controller.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import (
2020
cloudcontrollerconfig "k8s.io/cloud-provider/app/config"
2121
genericcontrollermanager "k8s.io/controller-manager/app"
2222
"k8s.io/klog"
23+
24+
"github.com/yunify/qingcloud-cloud-controller-manager/pkg/controllers/utils"
2325
)
2426

2527
const (
@@ -181,12 +183,14 @@ func (epc *EndpointController) handleEndpointsUpdate(key string) error {
181183

182184
// 2. get node list
183185
var nodes []*corev1.Node
184-
nodeList, err := epc.nodeLister.List(labels.NewSelector())
186+
nodeList, err := epc.nodeLister.List(labels.Everything())
185187
if err != nil {
186188
return fmt.Errorf("get node list error: %v", err)
187189
}
188190
for i, _ := range nodeList {
189-
nodes = append(nodes, nodeList[i])
191+
if utils.NodeConditionCheck(nodeList[i]) {
192+
nodes = append(nodes, nodeList[i])
193+
}
190194
}
191195

192196
// 3. update lb

pkg/controllers/utils/node.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package utils
2+
3+
import (
4+
corev1 "k8s.io/api/core/v1"
5+
"k8s.io/klog"
6+
)
7+
8+
// check if the node should be backend or not
9+
func NodeConditionCheck(node *corev1.Node) bool {
10+
if _, hasExcludeBalancerLabel := node.Labels[corev1.LabelNodeExcludeBalancers]; hasExcludeBalancerLabel {
11+
return false
12+
}
13+
14+
// If we have no info, don't accept
15+
if len(node.Status.Conditions) == 0 {
16+
return false
17+
}
18+
for _, cond := range node.Status.Conditions {
19+
// We consider the node for load balancing only when its NodeReady condition status is ConditionTrue
20+
if cond.Type == corev1.NodeReady && cond.Status != corev1.ConditionTrue {
21+
klog.V(4).Infof("Ignoring node %v with %v condition status %v", node.Name, cond.Type, cond.Status)
22+
return false
23+
}
24+
}
25+
return true
26+
}

pkg/qingcloud/qingcloud.go

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -200,10 +200,10 @@ func (qc *QingCloud) EnsureLoadBalancer(ctx context.Context, _ string, service *
200200
}
201201

202202
// filter nodes by service externalTrafficPolicy
203-
nodes, err = qc.filterNodes(ctx, service, nodes, conf)
204-
if err != nil {
205-
klog.Errorf("filterNodes for service %s with externalTrafficPolicy %s error: %v", service.Name, service.Spec.ExternalTrafficPolicy, err)
206-
return nil, err
203+
nodes, e := qc.filterNodes(ctx, service, nodes, conf)
204+
if e != nil {
205+
klog.Errorf("filterNodes for service %s/%s with externalTrafficPolicy %s error: %v", service.Namespace, service.Name, service.Spec.ExternalTrafficPolicy, e)
206+
return nil, e
207207
}
208208

209209
//1. ensure & update lb
@@ -262,7 +262,7 @@ func (qc *QingCloud) EnsureLoadBalancer(ctx context.Context, _ string, service *
262262
toDelete, toAdd := diffBackend(listener, nodes)
263263

264264
if len(toDelete) > 0 {
265-
klog.Infof("backend %s will be deleted for listener %s(%s) of lb %s",
265+
klog.Infof("backends %s will be deleted for listener %s(%s) of lb %s",
266266
spew.Sdump(toDelete), *listener.Spec.LoadBalancerListenerName, *listener.Spec.LoadBalancerListenerID, *lb.Status.LoadBalancerID)
267267
err = qc.Client.DeleteBackends(toDelete)
268268
if err != nil {
@@ -273,7 +273,7 @@ func (qc *QingCloud) EnsureLoadBalancer(ctx context.Context, _ string, service *
273273

274274
toAddBackends := generateLoadBalancerBackends(toAdd, listener, service.Spec.Ports)
275275
if len(toAddBackends) > 0 {
276-
klog.Infof("backend %s will be added for listener %s(%s) of lb %s",
276+
klog.Infof("backends %s will be added for listener %s(%s) of lb %s",
277277
spew.Sdump(toAddBackends), *listener.Spec.LoadBalancerListenerName, *listener.Spec.LoadBalancerListenerID, *lb.Status.LoadBalancerID)
278278
_, err = qc.Client.CreateBackends(toAddBackends)
279279
if err != nil {
@@ -414,7 +414,7 @@ func (qc *QingCloud) UpdateLoadBalancer(ctx context.Context, _ string, service *
414414
toDelete, toAdd := diffBackend(listener, nodes)
415415

416416
if len(toDelete) > 0 {
417-
klog.Infof("backend %s will be deleted for listener %s(%s) of lb %s",
417+
klog.Infof("backends %s will be deleted for listener %s(%s) of lb %s",
418418
spew.Sdump(toDelete), *listener.Spec.LoadBalancerListenerName, *listener.Spec.LoadBalancerListenerID, *lb.Status.LoadBalancerID)
419419
err = qc.Client.DeleteBackends(toDelete)
420420
if err != nil {
@@ -425,7 +425,7 @@ func (qc *QingCloud) UpdateLoadBalancer(ctx context.Context, _ string, service *
425425

426426
toAddBackends := generateLoadBalancerBackends(toAdd, listener, service.Spec.Ports)
427427
if len(toAddBackends) > 0 {
428-
klog.Infof("backend %s will be added for listener %s(%s) of lb %s",
428+
klog.Infof("backends %s will be added for listener %s(%s) of lb %s",
429429
spew.Sdump(toAddBackends), *listener.Spec.LoadBalancerListenerName, *listener.Spec.LoadBalancerListenerID, *lb.Status.LoadBalancerID)
430430
_, err = qc.Client.CreateBackends(toAddBackends)
431431
if err != nil {
@@ -567,6 +567,11 @@ func (qc *QingCloud) filterNodes(ctx context.Context, svc *v1.Service, nodes []*
567567
newNodes = append(newNodes, nodes[i])
568568
}
569569
}
570+
// if there are no available nodes , use all nodes
571+
if len(newNodes) == 0 {
572+
klog.Infof("there are no available nodes for service %s/%s, use all nodes!", svc.Namespace, svc.Name)
573+
newNodes = nodes
574+
}
570575
} else {
571576
// no need to filter
572577
newNodes = nodes

0 commit comments

Comments
 (0)