Skip to content

Commit

Permalink
Merge pull request #135 from backguynn/main
Browse files Browse the repository at this point in the history
Check if the external IP of the service needs to be updated
  • Loading branch information
UltraInstinct14 committed Apr 19, 2024
2 parents 6a9207d + febebbe commit deefd9b
Show file tree
Hide file tree
Showing 3 changed files with 90 additions and 45 deletions.
21 changes: 14 additions & 7 deletions .github/workflows/kube-loxilb-base-sanity.yml
Original file line number Diff line number Diff line change
Expand Up @@ -64,29 +64,33 @@ jobs:
- if: ${{ steps.get_results_json.outputs.GC_PASSED != 'True' }}
run: |
echo "gatewayClass passed: $steps.get_results_json.outputs.GC_PASSED"
echo "gatewayClass passed: ${{ steps.get_results_json.outputs.GC_PASSED }}"
kubectl get pods -A
kubectl get gatewayclass
kubectl -n kube-system logs "${{ steps.deploy_kube_loxilb.outputs.KUBE_LOXILB }}"
exit 1
- if: ${{ steps.get_results_json.outputs.GW_PASSED != 'True' }}
run: |
echo "gateway passed: $steps.get_results_json.outputs.GW_PASSED"
echo "gateway passed: ${{ steps.get_results_json.outputs.GW_PASSED }}"
kubectl get pods -A
kubectl get gateway
kubectl -n kube-system logs "${{ steps.deploy_kube_loxilb.outputs.KUBE_LOXILB }}"
exit 1
- if: ${{ steps.get_results_json.outputs.TCPROUTE_PASSED != 'llb-123.123.123.1' }}
run: |
echo "tcpRoute external IP: $steps.get_results_json.outputs.TCPROUTE_PASSED"
echo "tcpRoute external IP: ${{ steps.get_results_json.outputs.TCPROUTE_PASSED }}"
kubectl get pods -A
kubectl get tcproute
kubectl get svc tcproute-lb-service -o wide
kubectl -n kube-system logs "${{ steps.deploy_kube_loxilb.outputs.KUBE_LOXILB }}"
exit 1
- if: ${{ steps.get_results_json.outputs.UDPROUTE_PASSED != 'llb-123.123.123.1' }}
run: |
echo "udpRoute external IP: $steps.get_results_json.outputs.UDPROUTE_PASSED"
echo "udpRoute external IP: ${{ steps.get_results_json.outputs.UDPROUTE_PASSED }}"
kubectl get pods -A
kubectl get udproute
kubectl get svc udproute-lb-service -o wide
kubectl -n kube-system logs "${{ steps.deploy_kube_loxilb.outputs.KUBE_LOXILB }}"
Expand All @@ -113,20 +117,23 @@ jobs:
- if: ${{ steps.get_svc_results_json.outputs.IPERF_PASSED != 'llb-123.123.123.1' }}
run: |
echo "iperf-service external IP: $steps.get_results_json.outputs.IPERF_PASSED"
echo "iperf-service external IP: ${{ steps.get_results_json.outputs.IPERF_PASSED }}"
kubectl get pods -A
kubectl get svc -o wide
kubectl -n kube-system logs "${{ steps.deploy_kube_loxilb.outputs.KUBE_LOXILB }}"
exit 1
- if: ${{ steps.get_svc_results_json.outputs.SCTP_PASSED != 'llb-123.123.123.1' }}
run: |
echo "iperf-service external IP: $steps.get_results_json.outputs.SCTP_PASSED"
echo "iperf-service external IP: ${{ steps.get_results_json.outputs.SCTP_PASSED }}"
kubectl get pods -A
kubectl get svc -o wide
kubectl -n kube-system logs "${{ steps.deploy_kube_loxilb.outputs.KUBE_LOXILB }}"
exit 1
- if: ${{ steps.get_svc_results_json.outputs.UDP_PASSED != 'llb-123.123.123.1' }}
run: |
echo "iperf-service external IP: $steps.get_results_json.outputs.UDP_PASSED"
echo "iperf-service external IP: ${{ steps.get_results_json.outputs.UDP_PASSED }}"
kubectl get pods -A
kubectl get svc -o wide
kubectl -n kube-system logs "${{ steps.deploy_kube_loxilb.outputs.KUBE_LOXILB }}"
exit 1
Expand Down
14 changes: 14 additions & 0 deletions .github/workflows/run-preflight.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,22 @@
name: Run Preflight
on: [push]
jobs:
Check-Repogitory:
runs-on: ubuntu-20.04
outputs:
result: ${{ steps.check_repogitory.outputs.is_kube_loxilb }}
steps:
- name: check repository
id: check_repogitory
if: github.repository == 'loxilb-io/kube-loxilb'
run: |
echo "This workflow only runs on the loxilb-io/kube-loxilb repository."
echo "is_kube_loxilb=true" >> $GITHUB_OUTPUT
Run-Preflight:
runs-on: ubuntu-20.04
needs: Check-Repogitory
if: needs.Check-Repogitory.outputs.result == 'true'
permissions:
packages: write
steps:
Expand Down
100 changes: 62 additions & 38 deletions pkg/agent/manager/loadbalancer/loadbalancer.go
Original file line number Diff line number Diff line change
Expand Up @@ -297,15 +297,15 @@ func (m *Manager) processNextWorkItem() bool {
m.queue.Forget(key)
} else {
m.queue.AddRateLimited(key)
klog.Errorf("Error syncing Node %s, requeuing. Error: %v", key, err)
klog.Errorf("Error syncing LoadBalancer %s, requeuing. Error: %v", key, err)
}
return true
}

func (m *Manager) syncLoadBalancer(lb LbCacheKey) error {
startTime := time.Now()
defer func() {
klog.V(4).Infof("Finished syncing endpoints %s. (%v)", lb.Name, time.Since(startTime))
klog.V(4).Infof("Finished syncing LoadBalancer service %s. (%v)", lb.Name, time.Since(startTime))
}()

svcNs := lb.Namespace
Expand Down Expand Up @@ -748,35 +748,7 @@ func (m *Manager) addLoadBalancer(svc *corev1.Service) error {
}
}

// Update endpoint list if the list has changed
for _, sp := range m.lbCache[cacheKey].LbServicePairs {
for _, lb := range sp.LbModelList {
if len(endpointIPs) == len(lb.Endpoints) {
nEps := 0
for _, ep := range endpointIPs {
found := false
for _, oldEp := range lb.Endpoints {
if ep == oldEp.EndpointIP {
found = true
nEps++
break
}
}
if !found {
break
}
}
if nEps != len(endpointIPs) {
update = true
}
} else {
update = true
}
}
if update {
klog.Infof("%s: Endpoint update", cacheKey)
}
}
update = m.checkUpdateEndpoints(cacheKey, endpointIPs) || m.checkUpdateExternalIP(ingSvcPairs, svc)

if !update {
// TODO: Some cloud providers(e.g: K3d) delete external IPs assigned by kube-loxilb, so you can reach this syntax:
Expand Down Expand Up @@ -857,17 +829,17 @@ func (m *Manager) addLoadBalancer(svc *corev1.Service) error {
errChList = append(errChList, ch)
}

isError := true
var loxilbAPIErr error
for _, errCh := range errChList {
err := <-errCh
if err == nil {
isError = false
if err != nil {
loxilbAPIErr = err
}
}
if isError {
retIPAMOnErr = isError
klog.Errorf("failed to add load-balancer - spair(%s)", GenSPKey(sp.ExternalIP, sp.Port, sp.Protocol))
return fmt.Errorf("failed to add loxiLB loadBalancer - spair(%s)", GenSPKey(sp.ExternalIP, sp.Port, sp.Protocol))
if loxilbAPIErr != nil {
retIPAMOnErr = true
klog.Errorf("failed to add load-balancer - spair(%s). err: %v", GenSPKey(sp.ExternalIP, sp.Port, sp.Protocol), loxilbAPIErr)
return fmt.Errorf("failed to add loxiLB loadBalancer - spair(%s). err: %v", GenSPKey(sp.ExternalIP, sp.Port, sp.Protocol), loxilbAPIErr)
}

sp.LbModelList = append(sp.LbModelList, lbModel)
Expand Down Expand Up @@ -1124,6 +1096,58 @@ func (m *Manager) getEndpointsForLB(nodes []*corev1.Node, addrType string) []str
return endpoints
}

func (m *Manager) checkUpdateExternalIP(ingSvcPairs []SvcPair, svc *corev1.Service) bool {
for _, ingSvcPair := range ingSvcPairs {
if ingSvcPair.InRange || ingSvcPair.StaticIP {
retIngress := corev1.LoadBalancerIngress{Hostname: "llb-" + ingSvcPair.IPString}
if !m.checkServiceIngressIPExists(svc, retIngress.Hostname) {
klog.V(4).Infof("checkUpdateExternalIP: ingSvcPair %v has external IP but service %s has no IP. need update.", ingSvcPair, svc.Name)
return true
}
}
}

return false
}

func (m *Manager) checkUpdateEndpoints(cacheKey string, endpointIPs []string) bool {
var update bool

for _, sp := range m.lbCache[cacheKey].LbServicePairs {
// Update external IP if has changed

// Update endpoint list if the list has changed
for _, lb := range sp.LbModelList {
if len(endpointIPs) == len(lb.Endpoints) {
nEps := 0
for _, ep := range endpointIPs {
found := false
for _, oldEp := range lb.Endpoints {
if ep == oldEp.EndpointIP {
found = true
nEps++
break
}
}
if !found {
break
}
}
if nEps != len(endpointIPs) {
update = true
}
} else {
update = true
}
}
if update {
klog.Infof("%s: Endpoint update", cacheKey)
}
}

return update
}

func (m *Manager) checkServiceIngressIPExists(service *corev1.Service, newIngress string) bool {
for _, ingress := range service.Status.LoadBalancer.Ingress {
if ingress.IP != "" {
Expand Down

0 comments on commit deefd9b

Please sign in to comment.