8000 Don't reload when `use-cluster-ip` endpoints update, and change the i… · nginx/kubernetes-ingress@5fe171f · GitHub < 8000 meta name="twitter:description" content="…ngress `use-cluster-ip` implementation to use the cluster ip instead of the fqdn (#5318) * change use-cluster-ip implementation to use the cluster ip instead of fqdn, don&amp;#39;t relaod when us..." />
[go: up one dir, main page]

Skip to content

Commit 5fe171f

Browse files
author
Jim Ryan
committed
Don't reload when use-cluster-ip endpoints update, and change the ingress use-cluster-ip implementation to use the cluster ip instead of the fqdn (#5318)
* change use-cluster-ip implementation to use the cluster ip instead of fqdn, don't relaod when use-cluster-ip endpoints update * Update controller.go * Fix vs use cluster ip test * move assert function to custom_assertions.py
1 parent 3b191c7 commit 5fe171f

File tree

10 files changed

+366
-41
lines changed

10 files changed

+366
-41
lines changed

internal/configs/ingress.go

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -534,34 +534,21 @@ func createUpstream(ingEx *IngressEx, name string, backend *networking.IngressBa
534534
endps = []string{}
535535
}
536536

537-
if cfg.UseClusterIP {
538-
fqdn := fmt.Sprintf("%s.%s.svc.cluster.local:%d", backend.Service.Name, ingEx.Ingress.Namespace, backend.Service.Port.Number)
537+
for _, endp := range endps {
539538
upsServers = append(upsServers, version1.UpstreamServer{
540-
Address: fqdn,
539+
Address: endp,
541540
MaxFails: cfg.MaxFails,
542541
MaxConns: cfg.MaxConns,
543542
FailTimeout: cfg.FailTimeout,
544543
SlowStart: cfg.SlowStart,
545544
Resolve: isExternalNameSvc,
546545
})
546+
}
547+
if len(upsServers) > 0 {
548+
sort.Slice(upsServers, func(i, j int) bool {
549+
return upsServers[i].Address < upsServers[j].Address
550+
})
547551
ups.UpstreamServers = upsServers
548-
} else {
549-
for _, endp := range endps {
550-
upsServers = append(upsServers, version1.UpstreamServer{
551-
Address: endp,
552-
MaxFails: cfg.MaxFails,
553-
MaxConns: cfg.MaxConns,
554-
FailTimeout: cfg.FailTimeout,
555-
SlowStart: cfg.SlowStart,
556-
Resolve: isExternalNameSvc,
557-
})
558-
}
559-
if len(upsServers) > 0 {
560-
sort.Slice(upsServers, func(i, j int) bool {
561-
return upsServers[i].Address < upsServers[j].Address
562-
})
563-
ups.UpstreamServers = upsServers
564-
}
565552
}
566553
}
567554

internal/configs/ingress_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -700,7 +700,7 @@ func createExpectedConfigForMergeableCafeIngressWithUseClusterIP() version1.Ingr
700700
UpstreamZoneSize: upstreamZoneSize,
701701
UpstreamServers: []version1.UpstreamServer{
702702
{
703-
Address: "coffee-svc.default.svc.cluster.local:80",
703+
Address: "10.0.0.1:80",
704704
MaxFails: 1,
705705
MaxConns: 0,
706706
FailTimeout: "10s",
@@ -803,7 +803,7 @@ func createExpectedConfigForCafeIngressWithUseClusterIP() version1.IngressNginxC
803803
UpstreamZoneSize: upstreamZoneSize,
804804
UpstreamServers: []version1.UpstreamServer{
805805
{
806-
Address: "coffee-svc.default.svc.cluster.local:80",
806+
Address: "10.0.0.1:80",
807807
MaxFails: 1,
808808
MaxConns: 0,
809809
FailTimeout: "10s",
@@ -817,7 +817,7 @@ func createExpectedConfigForCafeIngressWithUseClusterIP() version1.IngressNginxC
817817
UpstreamZoneSize: upstreamZoneSize,
818818
UpstreamServers: []version1.UpstreamServer{
819819
{
820-
Address: "tea-svc.default.svc.cluster.local:80",
820+
Address: "10.0.0.2:80",
821821
MaxFails: 1,
822822
MaxConns: 0,
823823
FailTimeout: "10s",

internal/k8s/controller.go

Lines changed: 101 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -842,35 +842,51 @@ func (lbc *LoadBalancerController) syncEndpointSlices(task task) bool {
842842
}
843843

844844
endpointSlice := obj.(*discovery_v1.EndpointSlice)
845-
svcResource := lbc.configuration.FindResourcesForService(endpointSlice.Namespace, endpointSlice.Labels["kubernetes.io/service-name"])
845+
svcName := endpointSlice.Labels["kubernetes.io/service-name"]
846+
svcResource := lbc.configuration.FindResourcesForService(endpointSlice.Namespace, svcName)
846847

847848
resourceExes := lbc.createExtendedResources(svcResource)
848849

849850
if len(resourceExes.IngressExes) > 0 {
< BB54 /code>
850-
resourcesFound = true
851-
glog.V(3).Infof("Updating EndpointSlices for %v", resourceExes.IngressExes)
852-
err = lbc.configurator.UpdateEndpoints(resourceExes.IngressExes)
853-
if err != nil {
854-
glog.Errorf("Error updating EndpointSlices for %v: %v", resourceExes.IngressExes, err)
851+
for _, ingEx := range resourceExes.IngressExes {
852+
if lbc.ingressRequiresEndpointsUpdate(ingEx, svcName) {
853+
resourcesFound = true
854+
glog.V(3).Infof("Updating EndpointSlices for %v", resourceExes.IngressExes)
855+
err = lbc.configurator.UpdateEndpoints(resourceExes.IngressExes)
856+
if err != nil {
857+
glog.Errorf("Error updating EndpointSlices for %v: %v", resourceExes.IngressExes, err)
858+
}
859+
break
860+
}
855861
}
856862
}
857863

858864
if len(resourceExes.MergeableIngresses) > 0 {
859-
resourcesFound = true
860-
glog.V(3).Infof("Updating EndpointSlices for %v", resourceExes.MergeableIngresses)
861-
err = lbc.configurator.UpdateEndpointsMergeableIngress(resourceExes.MergeableIngresses)
862-
if err != nil {
863-
glog.Errorf("Error updating EndpointSlices for %v: %v", resourceExes.MergeableIngresses, err)
865+
for _, mergeableIngresses := range resourceExes.MergeableIngresses {
866+
if lbc.mergeableIngressRequiresEndpointsUpdate(mergeableIngresses, svcName) {
867+
resourcesFound = true
868+
glog.V(3).Infof("Updating EndpointSlices for %v", resourceExes.MergeableIngresses)
869+
err = lbc.configurator.UpdateEndpointsMergeableIngress(resourceExes.MergeableIngresses)
870+
if err != nil {
871+
glog.Errorf("Error updating EndpointSlices for %v: %v", resourceExes.MergeableIngresses, err)
872+
}
873+
break
874+
}
864875
}
865876
}
866877

867878
if lbc.areCustomResourcesEnabled {
868879
if len(resourceExes.VirtualServerExes) > 0 {
869-
resourcesFound = true
870-
glog.V(3).Infof("Updating EndpointSlices for %v", resourceExes.VirtualServerExes)
871-
err := lbc.configurator.UpdateEndpointsForVirtualServers(resourceExes.VirtualServerExes)
872-
if err != nil {
873-
glog.Errorf("Error updating EndpointSlices for %v: %v", resourceExes.VirtualServerExes, err)
880+
for _, vsEx := range resourceExes.VirtualServerExes {
881+
if lbc.virtualServerRequiresEndpointsUpdate(vsEx, svcName) {
882+
resourcesFound = true
883+
glog.V(3).Infof("Updating EndpointSlices for %v", resourceExes.VirtualServerExes)
884+
err := lbc.configurator.UpdateEndpointsForVirtualServers(resourceExes.VirtualServerExes)
885+
if err != nil {
886+
glog.Errorf("Error updating EndpointSlices for %v: %v", resourceExes.VirtualServerExes, err)
887+
}
888+
break
889+
}
874890
}
875891
}
876892

@@ -886,6 +902,63 @@ func (lbc *LoadBalancerController) syncEndpointSlices(task task) bool {
886902
return resourcesFound
887903
}
888904

905+
func (lbc *LoadBalancerController) virtualServerRequiresEndpointsUpdate(vsEx *configs.VirtualServerEx, serviceName string) bool {
906+
for _, upstream := range vsEx.VirtualServer.Spec.Upstreams {
907+
if upstream.Service == serviceName && !upstream.UseClusterIP {
908+
return true
909+
}
910+
}
911+
912+
for _, vsr := range vsEx.VirtualServerRoutes {
913+
for _, upstream := range vsr.Spec.Upstreams {
914+
if upstream.Service == serviceName && !upstream.UseClusterIP {
915+
return true
916+
}
917+
}
918+
}
919+
920+
return false
921+
}
922+
923+
func (lbc *LoadBalancerController) ingressRequiresEndpointsUpdate(ingressEx *configs.IngressEx, serviceName string) bool {
924+
hasUseClusterIPAnnotation := ingressEx.Ingress.Annotations[useClusterIPAnnotation] == "true"
925+
926+
for _, rule := range ingressEx.Ingress.Spec.Rules {
927+
if http := rule.HTTP; http != nil {
928+
for _, path := range http.Paths {
929+
if path.Backend.Service != nil && path.Backend.Service.Name == serviceName {
930+
if !hasUseClusterIPAnnotation {
931+
return true
932+
}
933+
}
934+
}
935+
}
936+
}
937+
938+
if http := ingressEx.Ingress.Spec.DefaultBackend; http != nil {
939+
if http.Service != nil && http.Service.Name == serviceName {
940+
if !hasUseClusterIPAnnotation {
941+
return true
942+
}
943+
}
944+
}
945+
946+
return false
947+
}
948+
949+
func (lbc *LoadBalancerController) mergeableIngressRequiresEndpointsUpdate(mergeableIngresses *configs.MergeableIngresses, serviceName string) bool {
950+
masterIngress := mergeableIngresses.Master
951+
minions := mergeableIngresses.Minions
952+
953+
for _, minion := range minions {
954+
if lbc.ingressRequiresEndpointsUpdate(minion, serviceName) {
955+
return true
956+
}
957+
}
958+
959+
return lbc.ingressRequiresEndpointsUpdate(masterIngress, serviceName)
960+
}
961+
889962
func (lbc *LoadBalancerController) createExtendedResources(resources []Resource) configs.ExtendedResources {
890963
var result configs.ExtendedResources
891964

@@ -2793,6 +2866,7 @@ func (lbc *LoadBalancerController) createMergeableIngresses(ingConfig *IngressCo
27932866
}
27942867

27952868
func (lbc *LoadBalancerController) createIngressEx(ing *networking.Ingress, validHosts map[string]bool, validMinionPaths map[string]bool) *configs.IngressEx {
2869+
var endps []string
27962870
ingEx := &configs.IngressEx{
27972871
Ingress: ing,
27982872
ValidHosts: validHosts,
@@ -2874,6 +2948,7 @@ func (lbc *LoadBalancerController) createIngressEx(ing *networking.Ingress, vali
28742948
ingEx.HealthChecks = make(map[string]*api_v1.Probe)
28752949
ingEx.ExternalNameSvcs = make(map[string]bool)
28762950
ingEx.PodsByIP = make(map[string]configs.PodInfo)
2951+
hasUseClusterIP := ingEx.Ingress.Annotations[configs.UseClusterIPAnnotation] == "true"
28772952

28782953
if ing.Spec.DefaultBackend != nil {
28792954
podEndps := []podEndpoint{}
@@ -2892,7 +2967,11 @@ func (lbc *LoadBalancerController) createIngressEx(ing *networking.Ingress, vali
28922967
glog.Warningf("Error retrieving endpoints for the service %v: %v", ing.Spec.DefaultBackend.Service.Name, err)
28932968
}
28942969

2895-
endps := getIPAddressesFromEndpoints(podEndps)
2970+
if svc != nil && !external && hasUseClusterIP {
2971+
endps = []string{ipv6SafeAddrPort(svc.Spec.ClusterIP, ing.Spec.DefaultBackend.Service.Port.Number)}
2972+
} else {
2973+
endps = getIPAddressesFromEndpoints(podEndps)
2974+
}
28962975

28972976
// endps is empty if there was any error before this point
28982977
ingEx.Endpoints[ing.Spec.DefaultBackend.Service.Name+configs.GetBackendPortAsString(ing.Spec.DefaultBackend.Service.Port)] = endps
@@ -2948,7 +3027,11 @@ func (lbc *LoadBalancerController) createIngressEx(ing *networking.Ingress, vali
29483027
glog.Warningf("Error retrieving endpoints for the service %v: %v", path.Backend.Service.Name, err)
29493028
}
29503029

2951-
endps := getIPAddressesFromEndpoints(podEndps)
3030+
if svc != nil && !external && hasUseClusterIP {
3031+
endps = []string{ipv6SafeAddrPort(svc.Spec.ClusterIP, path.Backend.Service.Port.Number)}
3032+
} else {
3033+
endps = getIPAddressesFromEndpoints(podEndps)
3034+
}
29523035

29533036
// endps is empty if there was any error before this point
29543037
ingEx.Endpoints[path.Backend.Service.Name+configs.GetBackendPortAsString(path.Backend.Service.Port)] = endps
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
apiVersion: networking.k8s.io/v1
2+
kind: Ingress
3+
metadata:
4+
name: use-cluster-ip-ingress-minion
5+
annotations:
6+
nginx.org/use-cluster-ip: "true"
7+
nginx.org/mergeable-ingress-type: "minion"
8+
spec:
9+
ingressClassName: nginx
10+
rules:
11+
- host: use-cluster-ip.example.com
12+
http:
13+
paths:
14+
- path: /backend1
15+
pathType: Prefix
16+
backend:
17+
service:
18+
name: backend1-svc
19+
port:
20+
number: 80
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
apiVersion: networking.k8s.io/v1
2+
kind: Ingress
3+
metadata:
4+
annotations:
5+
nginx.org/mergeable-ingress-type: "master"
6+
name: use-cluster-ip-ingress-master
7+
spec:
8+
ingressClassName: nginx
9+
rules:
10+
- host: use-cluster-ip.example.com
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
apiVersion: networking.k8s.io/v1
2+
kind: Ingress
3+
metadata:
4+
annotations:
5+
nginx.org/use-cluster-ip: "true"
6+
name: use-cluster-ip-ingress
7+
spec:
8+
ingressClassName: nginx
9+
rules:
10+
- host: use-cluster-ip.example.com
11+
http:
12+
paths:
13+
- path: /backend1
14+
pathType: Prefix
15+
backend:
16+
service:
17+
name: backend1-svc
18+
port:
19+
number: 80
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
apiVersion: k8s.nginx.org/v1
2+
kind: VirtualServer
3+
metadata:
4+
name: virtual-server
5+
spec:
6+
host: virtual-server.example.com
7+
upstreams:
8+
- name: backend1
9+
service: backend1-svc
10+
port: 80
11+
use-cluster-ip: true
12+
- name: backend2
13+
service: backend2-svc
14+
port: 80
15+
routes:
16+
- path: "/backend1"
17+
action:
18+
pass: backend1
19+
- path: "/backend2"
20+
action:
21+
pass: backend2

0 commit comments

Comments
 (0)
0