Skip to content

Commit 3fed28e

Browse files
committed
avoid to unbound other target on startup when port allocation conflict
Signed-off-by: roc <[email protected]>
1 parent f549189 commit 3fed28e

File tree

6 files changed

+57
-1
lines changed

6 files changed

+57
-1
lines changed

cmd/app/manager.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@ func runManager() {
8181
// setup manager
8282
SetupManager(mgr, opts)
8383

84-
// TODO: remove the tricky code in the future
8584
networkingv1alpha1.Init(mgr)
8685
kube.Init(mgr)
8786

cmd/app/setup_controller.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
package app
22

33
import (
4+
"context"
45
"os"
56

67
"github.com/tkestack/tke-extend-network-controller/internal/clbbinding"
78
"github.com/tkestack/tke-extend-network-controller/internal/controller"
89
"github.com/tkestack/tke-extend-network-controller/pkg/clusterinfo"
910
"github.com/tkestack/tke-extend-network-controller/pkg/util"
11+
corev1 "k8s.io/api/core/v1"
1012
ctrl "sigs.k8s.io/controller-runtime"
13+
"sigs.k8s.io/controller-runtime/pkg/client"
1114
)
1215

1316
func SetupControllers(mgr ctrl.Manager) {
@@ -55,6 +58,10 @@ func SetupControllers(mgr ctrl.Manager) {
5558
setupLog.Error(err, "unable to create controller", "controller", "Pod")
5659
os.Exit(1)
5760
}
61+
mgr.GetFieldIndexer().IndexField(context.Background(), &corev1.Pod{}, "status.podIP", func(o client.Object) []string {
62+
pod := o.(*corev1.Pod)
63+
return []string{pod.Status.PodIP}
64+
})
5865

5966
// Node controller
6067
if err := (&controller.NodeReconciler{
@@ -67,6 +74,17 @@ func SetupControllers(mgr ctrl.Manager) {
6774
setupLog.Error(err, "unable to create controller", "controller", "Node")
6875
os.Exit(1)
6976
}
77+
mgr.GetFieldIndexer().IndexField(context.Background(), &corev1.Node{}, "status.nodeIP", func(o client.Object) []string {
78+
node := o.(*corev1.Node)
79+
ret := []string{}
80+
for _, addr := range node.Status.Addresses {
81+
if addr.Type == corev1.NodeInternalIP {
82+
ret = append(ret, addr.Address)
83+
break
84+
}
85+
}
86+
return ret
87+
})
7088

7189
// GameServerSet controller
7290
if clusterinfo.OKGSupported {

internal/clbbinding/clbbinding.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ type CLBBinding interface {
1313
GetSpec() *networkingv1alpha1.CLBBindingSpec
1414
GetStatus() *networkingv1alpha1.CLBBindingStatus
1515
GetAssociatedObject(context.Context, client.Client) (Backend, error)
16+
GetAssociatedObjectByIP(context.Context, client.Client, string) (Backend, error)
1617
GetObject() client.Object
1718
GetType() string
1819
FetchObject(context.Context, client.Client) (client.Object, error)

internal/clbbinding/clbnodebinding.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,3 +88,16 @@ func (b *CLBNodeBinding) GetAssociatedObject(ctx context.Context, apiClient clie
8888
}
8989
return nodeBackend{node}, nil
9090
}
91+
92+
func (b *CLBNodeBinding) GetAssociatedObjectByIP(ctx context.Context, apiClient client.Client, ip string) (Backend, error) {
93+
nodeList := &corev1.NodeList{}
94+
if err := apiClient.List(ctx, nodeList, client.MatchingFields{
95+
"status.nodeIP": ip,
96+
}); err != nil {
97+
return nil, errors.WithStack(err)
98+
}
99+
if len(nodeList.Items) > 0 {
100+
return nodeBackend{&nodeList.Items[0]}, nil
101+
}
102+
return nil, nil
103+
}

internal/clbbinding/clbpodbinding.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,19 @@ func (b podBackend) TriggerReconcile() {
9393
}
9494
}
9595

96+
func (b *CLBPodBinding) GetAssociatedObjectByIP(ctx context.Context, apiClient client.Client, ip string) (Backend, error) {
97+
podList := &corev1.PodList{}
98+
if err := apiClient.List(ctx, podList, client.MatchingFields{
99+
"status.podIP": ip,
100+
}); err != nil {
101+
return nil, errors.WithStack(err)
102+
}
103+
if len(podList.Items) > 0 {
104+
return podBackend{&podList.Items[0], apiClient}, nil
105+
}
106+
return nil, nil
107+
}
108+
96109
func (b *CLBPodBinding) GetAssociatedObject(ctx context.Context, apiClient client.Client) (Backend, error) {
97110
pod := &corev1.Pod{}
98111
if err := apiClient.Get(ctx, client.ObjectKeyFromObject(b), pod); err != nil {

internal/controller/clbbinding.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,18 @@ func (r *CLBBindingReconciler[T]) ensurePortBound(ctx context.Context, bd clbbin
652652
}
653653
// 清理多余的 rs
654654
if len(targetToDelete) > 0 {
655+
for _, target := range targetToDelete {
656+
ip := target.TargetIP
657+
backend, err := bd.GetAssociatedObjectByIP(ctx, r.Client, ip)
658+
if err != nil {
659+
return errors.WithStack(err)
660+
}
661+
if backend != nil {
662+
msg := fmt.Sprintf("port conflict due to %s:%d/%s is already bound to %s", binding.LoadbalancerId, binding.LoadbalancerPort, binding.Protocol, backend.GetName())
663+
r.Recorder.Event(bd.GetObject(), corev1.EventTypeWarning, "OtherTargetBound", msg)
664+
return nil
665+
}
666+
}
655667
r.Recorder.Eventf(bd.GetObject(), corev1.EventTypeNormal, "DeregisterTarget", "remove unexpected target: %v", targetToDelete)
656668
if err := clb.DeregisterTargetsForListenerTryBatch(ctx, binding.Region, binding.LoadbalancerId, binding.ListenerId, targetToDelete...); err != nil {
657669
return errors.WithStack(err)

0 commit comments

Comments
 (0)