Skip to content
This repository has been archived by the owner on May 13, 2024. It is now read-only.

Commit

Permalink
feat: FLB supports service tags (#301)
Browse files Browse the repository at this point in the history
* feat: FLB supports service tags

Signed-off-by: Lin Yang <reaver@flomesh.io>

feat: FLB supports service tags

Signed-off-by: Lin Yang <reaver@flomesh.io>

* fix: only send tags with ports defined in svc annotation

Signed-off-by: Lin Yang <reaver@flomesh.io>

* fix: check empty string

Signed-off-by: Lin Yang <reaver@flomesh.io>

* fix: invalid header format

Signed-off-by: Lin Yang <reaver@flomesh.io>

* refactor: add logs for debugging

Signed-off-by: Lin Yang <reaver@flomesh.io>

* refactor: add logs for debugging

Signed-off-by: Lin Yang <reaver@flomesh.io>

* fix: wrong variable ref

Signed-off-by: Lin Yang <reaver@flomesh.io>

---------

Signed-off-by: Lin Yang <reaver@flomesh.io>
  • Loading branch information
reaver-flomesh committed Aug 23, 2023
1 parent 4aab911 commit 8a2452e
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 4 deletions.
74 changes: 70 additions & 4 deletions controllers/flb/service_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,14 @@ package flb
import (
"context"
_ "embed"
"encoding/json"
"fmt"
"github.com/flomesh-io/fsm-classic/pkg/commons"
"github.com/flomesh-io/fsm-classic/pkg/config"
"github.com/flomesh-io/fsm-classic/pkg/flb"
"github.com/flomesh-io/fsm-classic/pkg/kube"
"github.com/flomesh-io/fsm-classic/pkg/util"
"github.com/ghodss/yaml"
"github.com/go-resty/resty/v2"
"github.com/sethvargo/go-retry"
corev1 "k8s.io/api/core/v1"
Expand Down Expand Up @@ -75,7 +77,18 @@ const (
flbAlgoHeaderName = "X-Flb-Algo"
flbUserHeaderName = "X-Flb-User"
flbK8sClusterHeaderName = "X-Flb-K8s-Cluster"
flbDefaultSettingKey = "flb.flomesh.io/default-setting"
/*
- port: 80
tags:
abc: def
123: 456
- port: 443
tags:
xyz: abc
789: 123
*/
flbTagsHeaderName = "X-Flb-Tags"
flbDefaultSettingKey = "flb.flomesh.io/default-setting"
)

// ServiceReconciler reconciles a Service object
Expand Down Expand Up @@ -114,6 +127,11 @@ type FlbResponse struct {
LBIPs []string `json:"LBIPs"`
}

type serviceTag struct {
Port int32 `json:"port"`
Tags map[string]string `json:"tags"`
}

func New(client client.Client, api *kube.K8sAPI, scheme *runtime.Scheme, recorder record.EventRecorder, cfgStore *config.Store) *ServiceReconciler {
klog.V(5).Infof("Creating FLB service reconciler ...")

Expand Down Expand Up @@ -471,7 +489,7 @@ func (r *ServiceReconciler) deleteEntryFromFLB(ctx context.Context, svc *corev1.
result[svcKey] = make([]string, 0)
}

params := getFlbParameters(svc)
params := r.getFlbParameters(svc)
if _, err := r.updateFLB(svc, params, result, true); err != nil {
return ctrl.Result{}, err
}
Expand All @@ -496,7 +514,7 @@ func (r *ServiceReconciler) createOrUpdateFlbEntry(ctx context.Context, svc *cor

klog.V(5).Infof("Endpoints of Service %s/%s: %s", svc.Namespace, svc.Name, endpoints)

params := getFlbParameters(svc)
params := r.getFlbParameters(svc)
resp, err := r.updateFLB(svc, params, endpoints, false)
if err != nil {
return ctrl.Result{}, err
Expand Down Expand Up @@ -572,7 +590,7 @@ func (r *ServiceReconciler) getEndpoints(ctx context.Context, svc *corev1.Servic
return result, nil
}

func getFlbParameters(svc *corev1.Service) map[string]string {
func (r *ServiceReconciler) getFlbParameters(svc *corev1.Service) map[string]string {
if svc.Annotations == nil {
return map[string]string{}
}
Expand All @@ -586,7 +604,55 @@ func getFlbParameters(svc *corev1.Service) map[string]string {
flbWriteTimeoutHeaderName: svc.Annotations[commons.FlbWriteTimeoutAnnotation],
flbIdleTimeoutHeaderName: svc.Annotations[commons.FlbIdleTimeoutAnnotation],
flbAlgoHeaderName: getValidAlgo(svc.Annotations[commons.FlbAlgoAnnotation]),
flbTagsHeaderName: r.getTags(svc),
}
}

func (r *ServiceReconciler) getTags(svc *corev1.Service) string {
rawTags, ok := svc.Annotations[commons.FlbTagsAnnotation]

if !ok || len(rawTags) == 0 {
return ""
}

tags := make([]serviceTag, 0)
if err := yaml.Unmarshal([]byte(rawTags), &tags); err != nil {
klog.Errorf("Failed to unmarshal tags: %s, it' not in a valid format", err)
defer r.Recorder.Eventf(svc, corev1.EventTypeWarning, "InvalidTagFormat", "Format of annotation %s is not valid", commons.FlbTagsAnnotation)
return ""
}
klog.V(5).Infof("Unmarshalled tags of service %s/%s: %v", svc.Namespace, svc.Name, tags)

svcPorts := make(map[int32]bool)
for _, port := range svc.Spec.Ports {
svcPorts[port.Port] = true
}
klog.V(5).Infof("Ports of service %s/%s: %v", svc.Namespace, svc.Name, svcPorts)

resultTags := make([]serviceTag, 0)
for _, tag := range tags {
if _, ok := svcPorts[tag.Port]; !ok {
continue
}
resultTags = append(resultTags, tag)
}
klog.V(5).Infof("Valid tags for service %s/%s: %v", svc.Namespace, svc.Name, resultTags)

if len(resultTags) == 0 {
return ""
}

resultTagsBytes, err := json.Marshal(resultTags)
if err != nil {
klog.Errorf("Failed to marshal tags: %s", err)
defer r.Recorder.Eventf(svc, corev1.EventTypeWarning, "MarshalJson", "Failed marshal tags to JSON: %s", err)
return ""
}

tagsJson := string(resultTagsBytes)
klog.V(5).Infof("tagsJson: %s", tagsJson)

return tagsJson
}

func (r *ServiceReconciler) updateFLB(svc *corev1.Service, params map[string]string, result map[string][]string, del bool) (*FlbResponse, error) {
Expand Down
1 change: 1 addition & 0 deletions deploy/fsm.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1660,6 +1660,7 @@ data:
defaultAddressPool: ZGVmYXVsdA==
defaultAlgo: cnI=
defaultCluster: ZGVmYXVsdA==
k8sCluster: VU5LTk9XTg==
password: YWRtaW4=
username: YWRtaW4=
kind: Secret
Expand Down
13 changes: 13 additions & 0 deletions samples/flb/values.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
fsm:
logLevel: 5
flb:
enabled: true
strictMode: false
secretName: fsm-flb-secret
baseUrl: http://192.168.12.5:30000
username: admin
password: Flomesh@2023
k8sCluster: "test1"
defaultCluster: default
defaultAddressPool: default
defaultAlgo: rr

0 comments on commit 8a2452e

Please sign in to comment.