diff --git a/cmd/flagger/main.go b/cmd/flagger/main.go index 83105a971..04a17f0cb 100644 --- a/cmd/flagger/main.go +++ b/cmd/flagger/main.go @@ -168,15 +168,15 @@ func main() { if kubeconfigServiceMesh == "" { kubeconfigServiceMesh = kubeconfig } - cfgHost, err := clientcmd.BuildConfigFromFlags(masterURL, kubeconfigServiceMesh) + serviceMeshCfg, err := clientcmd.BuildConfigFromFlags(masterURL, kubeconfigServiceMesh) if err != nil { logger.Fatalf("Error building host kubeconfig: %v", err) } - cfgHost.QPS = float32(kubeconfigQPS) - cfgHost.Burst = kubeconfigBurst + serviceMeshCfg.QPS = float32(kubeconfigQPS) + serviceMeshCfg.Burst = kubeconfigBurst - meshClient, err := clientset.NewForConfig(cfgHost) + meshClient, err := clientset.NewForConfig(serviceMeshCfg) if err != nil { logger.Fatalf("Error building mesh clientset: %v", err) } @@ -212,7 +212,14 @@ func main() { // start HTTP server go server.ListenAndServe(port, 3*time.Second, logger, stopCh) - routerFactory := router.NewFactory(cfg, kubeClient, flaggerClient, ingressAnnotationsPrefix, ingressClass, logger, meshClient) + setOwnerRefs := true + // Router shouldn't set OwnerRefs on resources that they create since the + // service mesh/ingress controller is in a different cluster. + if cfg.Host != serviceMeshCfg.Host { + setOwnerRefs = false + } + + routerFactory := router.NewFactory(cfg, kubeClient, flaggerClient, ingressAnnotationsPrefix, ingressClass, logger, meshClient, setOwnerRefs) var configTracker canary.Tracker if enableConfigTracking { diff --git a/pkg/controller/scheduler_daemonset_fixture_test.go b/pkg/controller/scheduler_daemonset_fixture_test.go index 8ff046a83..7b7cfb7d3 100644 --- a/pkg/controller/scheduler_daemonset_fixture_test.go +++ b/pkg/controller/scheduler_daemonset_fixture_test.go @@ -92,7 +92,7 @@ func newDaemonSetFixture(c *flaggerv1.Canary) daemonSetFixture { } // init router - rf := router.NewFactory(nil, kubeClient, flaggerClient, "annotationsPrefix", "", logger, flaggerClient) + rf := router.NewFactory(nil, kubeClient, flaggerClient, "annotationsPrefix", "", logger, flaggerClient, true) // init observer observerFactory, _ := observers.NewFactory(testMetricsServerURL) diff --git a/pkg/controller/scheduler_deployment_fixture_test.go b/pkg/controller/scheduler_deployment_fixture_test.go index ef3eebda9..db54e7bc0 100644 --- a/pkg/controller/scheduler_deployment_fixture_test.go +++ b/pkg/controller/scheduler_deployment_fixture_test.go @@ -120,7 +120,7 @@ func newDeploymentFixture(c *flaggerv1.Canary) fixture { } // init router - rf := router.NewFactory(nil, kubeClient, flaggerClient, "annotationsPrefix", "", logger, flaggerClient) + rf := router.NewFactory(nil, kubeClient, flaggerClient, "annotationsPrefix", "", logger, flaggerClient, true) // init observer observerFactory, _ := observers.NewFactory(testMetricsServerURL) diff --git a/pkg/router/appmesh.go b/pkg/router/appmesh.go index 78f986d3d..c64244b18 100644 --- a/pkg/router/appmesh.go +++ b/pkg/router/appmesh.go @@ -43,6 +43,7 @@ type AppMeshRouter struct { appmeshClient clientset.Interface flaggerClient clientset.Interface logger *zap.SugaredLogger + setOwnerRefs bool } // Reconcile creates or updates App Mesh virtual nodes and virtual services @@ -161,16 +162,18 @@ func (ar *AppMeshRouter) reconcileVirtualNode(canary *flaggerv1.Canary, name str Namespace: canary.Namespace, Labels: metadata.Labels, Annotations: filterMetadata(metadata.Annotations), - OwnerReferences: []metav1.OwnerReference{ - *metav1.NewControllerRef(canary, schema.GroupVersionKind{ - Group: flaggerv1.SchemeGroupVersion.Group, - Version: flaggerv1.SchemeGroupVersion.Version, - Kind: flaggerv1.CanaryKind, - }), - }, }, Spec: vnSpec, } + if ar.setOwnerRefs { + virtualnode.OwnerReferences = []metav1.OwnerReference{ + *metav1.NewControllerRef(canary, schema.GroupVersionKind{ + Group: flaggerv1.SchemeGroupVersion.Group, + Version: flaggerv1.SchemeGroupVersion.Version, + Kind: flaggerv1.CanaryKind, + }), + } + } _, err = ar.appmeshClient.AppmeshV1beta1().VirtualNodes(canary.Namespace).Create(context.TODO(), virtualnode, metav1.CreateOptions{}) if err != nil { return fmt.Errorf("VirtualNode %s.%s create error %w", name, canary.Namespace, err) @@ -314,16 +317,18 @@ func (ar *AppMeshRouter) reconcileVirtualService(canary *flaggerv1.Canary, name ObjectMeta: metav1.ObjectMeta{ Name: name, Namespace: canary.Namespace, - OwnerReferences: []metav1.OwnerReference{ - *metav1.NewControllerRef(canary, schema.GroupVersionKind{ - Group: flaggerv1.SchemeGroupVersion.Group, - Version: flaggerv1.SchemeGroupVersion.Version, - Kind: flaggerv1.CanaryKind, - }), - }, }, Spec: vsSpec, } + if ar.setOwnerRefs { + virtualService.OwnerReferences = []metav1.OwnerReference{ + *metav1.NewControllerRef(canary, schema.GroupVersionKind{ + Group: flaggerv1.SchemeGroupVersion.Group, + Version: flaggerv1.SchemeGroupVersion.Version, + Kind: flaggerv1.CanaryKind, + }), + } + } // set App Mesh Gateway annotation on primary virtual service if canaryWeight == 0 { diff --git a/pkg/router/appmesh_v1beta2.go b/pkg/router/appmesh_v1beta2.go index 73346c733..018258601 100644 --- a/pkg/router/appmesh_v1beta2.go +++ b/pkg/router/appmesh_v1beta2.go @@ -44,6 +44,7 @@ type AppMeshv1beta2Router struct { flaggerClient clientset.Interface logger *zap.SugaredLogger labelSelector string + setOwnerRefs bool } // Reconcile creates or updates App Mesh virtual nodes and virtual services @@ -175,16 +176,18 @@ func (ar *AppMeshv1beta2Router) reconcileVirtualNode(canary *flaggerv1.Canary, n Namespace: canary.Namespace, Labels: metadata.Labels, Annotations: filterMetadata(metadata.Annotations), - OwnerReferences: []metav1.OwnerReference{ - *metav1.NewControllerRef(canary, schema.GroupVersionKind{ - Group: flaggerv1.SchemeGroupVersion.Group, - Version: flaggerv1.SchemeGroupVersion.Version, - Kind: flaggerv1.CanaryKind, - }), - }, }, Spec: vnSpec, } + if ar.setOwnerRefs { + virtualnode.OwnerReferences = []metav1.OwnerReference{ + *metav1.NewControllerRef(canary, schema.GroupVersionKind{ + Group: flaggerv1.SchemeGroupVersion.Group, + Version: flaggerv1.SchemeGroupVersion.Version, + Kind: flaggerv1.CanaryKind, + }), + } + } _, err = ar.appmeshClient.AppmeshV1beta2().VirtualNodes(canary.Namespace).Create(context.TODO(), virtualnode, metav1.CreateOptions{}) if err != nil { return fmt.Errorf("VirtualNode %s.%s create error %w", name, canary.Namespace, err) @@ -341,16 +344,18 @@ func (ar *AppMeshv1beta2Router) reconcileVirtualRouter(canary *flaggerv1.Canary, ObjectMeta: metav1.ObjectMeta{ Name: name, Namespace: canary.Namespace, - OwnerReferences: []metav1.OwnerReference{ - *metav1.NewControllerRef(canary, schema.GroupVersionKind{ - Group: flaggerv1.SchemeGroupVersion.Group, - Version: flaggerv1.SchemeGroupVersion.Version, - Kind: flaggerv1.CanaryKind, - }), - }, }, Spec: vrSpec, } + if ar.setOwnerRefs { + virtualRouter.OwnerReferences = []metav1.OwnerReference{ + *metav1.NewControllerRef(canary, schema.GroupVersionKind{ + Group: flaggerv1.SchemeGroupVersion.Group, + Version: flaggerv1.SchemeGroupVersion.Version, + Kind: flaggerv1.CanaryKind, + }), + } + } _, err = ar.appmeshClient.AppmeshV1beta2().VirtualRouters(canary.Namespace).Create(context.TODO(), virtualRouter, metav1.CreateOptions{}) if err != nil { @@ -363,13 +368,6 @@ func (ar *AppMeshv1beta2Router) reconcileVirtualRouter(canary *flaggerv1.Canary, ObjectMeta: metav1.ObjectMeta{ Name: name, Namespace: canary.Namespace, - OwnerReferences: []metav1.OwnerReference{ - *metav1.NewControllerRef(canary, schema.GroupVersionKind{ - Group: flaggerv1.SchemeGroupVersion.Group, - Version: flaggerv1.SchemeGroupVersion.Version, - Kind: flaggerv1.CanaryKind, - }), - }, }, Spec: appmeshv1.VirtualServiceSpec{ Provider: &appmeshv1.VirtualServiceProvider{ @@ -381,6 +379,15 @@ func (ar *AppMeshv1beta2Router) reconcileVirtualRouter(canary *flaggerv1.Canary, }, }, } + if ar.setOwnerRefs { + virtualService.OwnerReferences = []metav1.OwnerReference{ + *metav1.NewControllerRef(canary, schema.GroupVersionKind{ + Group: flaggerv1.SchemeGroupVersion.Group, + Version: flaggerv1.SchemeGroupVersion.Version, + Kind: flaggerv1.CanaryKind, + }), + } + } // set App Mesh Gateway annotation on primary virtual service if canaryWeight == 0 { diff --git a/pkg/router/contour.go b/pkg/router/contour.go index 9ca42a875..dd39413f8 100644 --- a/pkg/router/contour.go +++ b/pkg/router/contour.go @@ -41,6 +41,7 @@ type ContourRouter struct { flaggerClient clientset.Interface logger *zap.SugaredLogger ingressClass string + setOwnerRefs bool } // Reconcile creates or updates the HTTP proxy @@ -169,13 +170,6 @@ func (cr *ContourRouter) Reconcile(canary *flaggerv1.Canary) error { Namespace: canary.Namespace, Labels: metadata.Labels, Annotations: filterMetadata(metadata.Annotations), - OwnerReferences: []metav1.OwnerReference{ - *metav1.NewControllerRef(canary, schema.GroupVersionKind{ - Group: flaggerv1.SchemeGroupVersion.Group, - Version: flaggerv1.SchemeGroupVersion.Version, - Kind: flaggerv1.CanaryKind, - }), - }, }, Spec: newSpec, Status: contourv1.HTTPProxyStatus{ @@ -183,6 +177,15 @@ func (cr *ContourRouter) Reconcile(canary *flaggerv1.Canary) error { Description: "valid HTTPProxy", }, } + if cr.setOwnerRefs { + proxy.OwnerReferences = []metav1.OwnerReference{ + *metav1.NewControllerRef(canary, schema.GroupVersionKind{ + Group: flaggerv1.SchemeGroupVersion.Group, + Version: flaggerv1.SchemeGroupVersion.Version, + Kind: flaggerv1.CanaryKind, + }), + } + } if cr.ingressClass != "" { proxy.Annotations = map[string]string{ diff --git a/pkg/router/factory.go b/pkg/router/factory.go index 6009846ce..5bad74741 100644 --- a/pkg/router/factory.go +++ b/pkg/router/factory.go @@ -35,6 +35,7 @@ type Factory struct { ingressAnnotationsPrefix string ingressClass string logger *zap.SugaredLogger + setOwnerRefs bool } func NewFactory(kubeConfig *restclient.Config, kubeClient kubernetes.Interface, @@ -42,7 +43,8 @@ func NewFactory(kubeConfig *restclient.Config, kubeClient kubernetes.Interface, ingressAnnotationsPrefix string, ingressClass string, logger *zap.SugaredLogger, - meshClient clientset.Interface) *Factory { + meshClient clientset.Interface, + setOwnerRefs bool) *Factory { return &Factory{ kubeConfig: kubeConfig, meshClient: meshClient, @@ -51,6 +53,7 @@ func NewFactory(kubeConfig *restclient.Config, kubeClient kubernetes.Interface, ingressAnnotationsPrefix: ingressAnnotationsPrefix, ingressClass: ingressClass, logger: logger, + setOwnerRefs: setOwnerRefs, } } @@ -81,6 +84,7 @@ func (factory *Factory) MeshRouter(provider string, labelSelector string) Interf kubeClient: factory.kubeClient, appmeshClient: factory.meshClient, labelSelector: labelSelector, + setOwnerRefs: factory.setOwnerRefs, } case provider == flaggerv1.AppMeshProvider: return &AppMeshRouter{ @@ -88,6 +92,7 @@ func (factory *Factory) MeshRouter(provider string, labelSelector string) Interf flaggerClient: factory.flaggerClient, kubeClient: factory.kubeClient, appmeshClient: factory.meshClient, + setOwnerRefs: factory.setOwnerRefs, } case provider == flaggerv1.LinkerdProvider: return &SmiRouter{ @@ -96,6 +101,7 @@ func (factory *Factory) MeshRouter(provider string, labelSelector string) Interf kubeClient: factory.kubeClient, smiClient: factory.meshClient, targetMesh: flaggerv1.LinkerdProvider, + setOwnerRefs: factory.setOwnerRefs, } case provider == flaggerv1.IstioProvider: return &IstioRouter{ @@ -103,6 +109,7 @@ func (factory *Factory) MeshRouter(provider string, labelSelector string) Interf flaggerClient: factory.flaggerClient, kubeClient: factory.kubeClient, istioClient: factory.meshClient, + setOwnerRefs: factory.setOwnerRefs, } case strings.HasPrefix(provider, flaggerv1.SMIProvider+":v1alpha1"): mesh := strings.TrimPrefix(provider, flaggerv1.SMIProvider+":v1alpha1:") @@ -112,6 +119,7 @@ func (factory *Factory) MeshRouter(provider string, labelSelector string) Interf kubeClient: factory.kubeClient, smiClient: factory.meshClient, targetMesh: mesh, + setOwnerRefs: factory.setOwnerRefs, } case strings.HasPrefix(provider, flaggerv1.SMIProvider+":v1alpha2"): mesh := strings.TrimPrefix(provider, flaggerv1.SMIProvider+":v1alpha2:") @@ -121,6 +129,7 @@ func (factory *Factory) MeshRouter(provider string, labelSelector string) Interf kubeClient: factory.kubeClient, smiClient: factory.meshClient, targetMesh: mesh, + setOwnerRefs: factory.setOwnerRefs, } case strings.HasPrefix(provider, flaggerv1.SMIProvider+":v1alpha3"): mesh := strings.TrimPrefix(provider, flaggerv1.SMIProvider+":v1alpha3:") @@ -130,6 +139,7 @@ func (factory *Factory) MeshRouter(provider string, labelSelector string) Interf kubeClient: factory.kubeClient, smiClient: factory.meshClient, targetMesh: mesh, + setOwnerRefs: factory.setOwnerRefs, } case provider == flaggerv1.ContourProvider: return &ContourRouter{ @@ -138,6 +148,7 @@ func (factory *Factory) MeshRouter(provider string, labelSelector string) Interf kubeClient: factory.kubeClient, contourClient: factory.meshClient, ingressClass: factory.ingressClass, + setOwnerRefs: factory.setOwnerRefs, } case strings.HasPrefix(provider, flaggerv1.GlooProvider): return &GlooRouter{ @@ -145,22 +156,26 @@ func (factory *Factory) MeshRouter(provider string, labelSelector string) Interf flaggerClient: factory.flaggerClient, kubeClient: factory.kubeClient, glooClient: factory.meshClient, + setOwnerRefs: factory.setOwnerRefs, } case provider == flaggerv1.NGINXProvider: return &IngressRouter{ logger: factory.logger, kubeClient: factory.kubeClient, annotationsPrefix: factory.ingressAnnotationsPrefix, + setOwnerRefs: factory.setOwnerRefs, } case provider == flaggerv1.SkipperProvider: return &SkipperRouter{ - logger: factory.logger, - kubeClient: factory.kubeClient, + logger: factory.logger, + kubeClient: factory.kubeClient, + setOwnerRefs: factory.setOwnerRefs, } case provider == flaggerv1.TraefikProvider: return &TraefikRouter{ logger: factory.logger, traefikClient: factory.meshClient, + setOwnerRefs: factory.setOwnerRefs, } case provider == flaggerv1.OsmProvider: return &Smiv1alpha2Router{ @@ -169,6 +184,7 @@ func (factory *Factory) MeshRouter(provider string, labelSelector string) Interf kubeClient: factory.kubeClient, smiClient: factory.meshClient, targetMesh: flaggerv1.OsmProvider, + setOwnerRefs: factory.setOwnerRefs, } case provider == flaggerv1.KumaProvider: return &KumaRouter{ @@ -182,6 +198,7 @@ func (factory *Factory) MeshRouter(provider string, labelSelector string) Interf logger: factory.logger, kubeClient: factory.kubeClient, gatewayAPIClient: factory.meshClient, + setOwnerRefs: factory.setOwnerRefs, } case provider == flaggerv1.KubernetesProvider: return &NopRouter{} @@ -191,6 +208,7 @@ func (factory *Factory) MeshRouter(provider string, labelSelector string) Interf flaggerClient: factory.flaggerClient, kubeClient: factory.kubeClient, istioClient: factory.meshClient, + setOwnerRefs: factory.setOwnerRefs, } } } diff --git a/pkg/router/gateway_api.go b/pkg/router/gateway_api.go index c9b0888d5..215f3232d 100644 --- a/pkg/router/gateway_api.go +++ b/pkg/router/gateway_api.go @@ -54,6 +54,7 @@ type GatewayAPIRouter struct { gatewayAPIClient clientset.Interface kubeClient kubernetes.Interface logger *zap.SugaredLogger + setOwnerRefs bool } func (gwr *GatewayAPIRouter) Reconcile(canary *flaggerv1.Canary) error { @@ -138,17 +139,20 @@ func (gwr *GatewayAPIRouter) Reconcile(canary *flaggerv1.Canary) error { Namespace: hrNamespace, Labels: metadata.Labels, Annotations: filterMetadata(metadata.Annotations), - OwnerReferences: []metav1.OwnerReference{ - *metav1.NewControllerRef(canary, schema.GroupVersionKind{ - Group: flaggerv1.SchemeGroupVersion.Group, - Version: flaggerv1.SchemeGroupVersion.Version, - Kind: flaggerv1.CanaryKind, - }), - }, }, Spec: httpRouteSpec, } + if gwr.setOwnerRefs { + route.OwnerReferences = []metav1.OwnerReference{ + *metav1.NewControllerRef(canary, schema.GroupVersionKind{ + Group: flaggerv1.SchemeGroupVersion.Group, + Version: flaggerv1.SchemeGroupVersion.Version, + Kind: flaggerv1.CanaryKind, + }), + } + } + _, err := gwr.gatewayAPIClient.GatewayapiV1alpha2().HTTPRoutes(hrNamespace). Create(context.TODO(), route, metav1.CreateOptions{}) diff --git a/pkg/router/gloo.go b/pkg/router/gloo.go index 214d8addd..4972b9273 100644 --- a/pkg/router/gloo.go +++ b/pkg/router/gloo.go @@ -43,6 +43,7 @@ type GlooRouter struct { flaggerClient clientset.Interface logger *zap.SugaredLogger includeLabelPrefix []string + setOwnerRefs bool } // Reconcile creates or updates the Gloo Edge route table @@ -116,16 +117,18 @@ func (gr *GlooRouter) Reconcile(canary *flaggerv1.Canary) error { Namespace: canary.Namespace, Labels: metadata.Labels, Annotations: filterMetadata(metadata.Annotations), - OwnerReferences: []metav1.OwnerReference{ - *metav1.NewControllerRef(canary, schema.GroupVersionKind{ - Group: flaggerv1.SchemeGroupVersion.Group, - Version: flaggerv1.SchemeGroupVersion.Version, - Kind: flaggerv1.CanaryKind, - }), - }, }, Spec: newSpec, } + if gr.setOwnerRefs { + routeTable.OwnerReferences = []metav1.OwnerReference{ + *metav1.NewControllerRef(canary, schema.GroupVersionKind{ + Group: flaggerv1.SchemeGroupVersion.Group, + Version: flaggerv1.SchemeGroupVersion.Version, + Kind: flaggerv1.CanaryKind, + }), + } + } _, err = gr.glooClient.GatewayV1().RouteTables(canary.Namespace).Create(context.TODO(), routeTable, metav1.CreateOptions{}) if err != nil { @@ -310,21 +313,24 @@ func (gr *GlooRouter) getGlooUpstreamKubeService(canary *flaggerv1.Canary, svc * upstreamLabels := includeLabelsByPrefix(upstreamSpec.Labels, gr.includeLabelPrefix) - return &gloov1.Upstream{ + upstream := &gloov1.Upstream{ ObjectMeta: metav1.ObjectMeta{ Name: upstreamName, Namespace: canary.Namespace, Labels: upstreamLabels, - OwnerReferences: []metav1.OwnerReference{ - *metav1.NewControllerRef(canary, schema.GroupVersionKind{ - Group: flaggerv1.SchemeGroupVersion.Group, - Version: flaggerv1.SchemeGroupVersion.Version, - Kind: flaggerv1.CanaryKind, - }), - }, }, Spec: upstreamSpec, } + if gr.setOwnerRefs { + upstream.OwnerReferences = []metav1.OwnerReference{ + *metav1.NewControllerRef(canary, schema.GroupVersionKind{ + Group: flaggerv1.SchemeGroupVersion.Group, + Version: flaggerv1.SchemeGroupVersion.Version, + Kind: flaggerv1.CanaryKind, + }), + } + } + return upstream } func (gr *GlooRouter) getGlooConfigUpstream(canary *flaggerv1.Canary) (*gloov1.Upstream, error) { diff --git a/pkg/router/ingress.go b/pkg/router/ingress.go index 4890eea46..7fd9e4207 100644 --- a/pkg/router/ingress.go +++ b/pkg/router/ingress.go @@ -37,6 +37,7 @@ type IngressRouter struct { kubeClient kubernetes.Interface annotationsPrefix string logger *zap.SugaredLogger + setOwnerRefs bool } func (i *IngressRouter) Reconcile(canary *flaggerv1.Canary) error { @@ -75,20 +76,22 @@ func (i *IngressRouter) Reconcile(canary *flaggerv1.Canary) error { if errors.IsNotFound(err) { ing := &netv1.Ingress{ ObjectMeta: metav1.ObjectMeta{ - Name: canaryIngressName, - Namespace: canary.Namespace, - OwnerReferences: []metav1.OwnerReference{ - *metav1.NewControllerRef(canary, schema.GroupVersionKind{ - Group: flaggerv1.SchemeGroupVersion.Group, - Version: flaggerv1.SchemeGroupVersion.Version, - Kind: flaggerv1.CanaryKind, - }), - }, + Name: canaryIngressName, + Namespace: canary.Namespace, Annotations: i.makeAnnotations(ingressClone.Annotations), Labels: ingressClone.Labels, }, Spec: ingressClone.Spec, } + if i.setOwnerRefs { + ing.OwnerReferences = []metav1.OwnerReference{ + *metav1.NewControllerRef(canary, schema.GroupVersionKind{ + Group: flaggerv1.SchemeGroupVersion.Group, + Version: flaggerv1.SchemeGroupVersion.Version, + Kind: flaggerv1.CanaryKind, + }), + } + } _, err := i.kubeClient.NetworkingV1().Ingresses(canary.Namespace).Create(context.TODO(), ing, metav1.CreateOptions{}) if err != nil { diff --git a/pkg/router/istio.go b/pkg/router/istio.go index 8183e4a02..6c5b89e31 100644 --- a/pkg/router/istio.go +++ b/pkg/router/istio.go @@ -40,6 +40,7 @@ type IstioRouter struct { istioClient clientset.Interface flaggerClient clientset.Interface logger *zap.SugaredLogger + setOwnerRefs bool } // Reconcile creates or updates the Istio virtual service and destination rules @@ -73,16 +74,18 @@ func (ir *IstioRouter) reconcileDestinationRule(canary *flaggerv1.Canary, name s ObjectMeta: metav1.ObjectMeta{ Name: name, Namespace: canary.Namespace, - OwnerReferences: []metav1.OwnerReference{ - *metav1.NewControllerRef(canary, schema.GroupVersionKind{ - Group: flaggerv1.SchemeGroupVersion.Group, - Version: flaggerv1.SchemeGroupVersion.Version, - Kind: flaggerv1.CanaryKind, - }), - }, }, Spec: newSpec, } + if ir.setOwnerRefs { + destinationRule.OwnerReferences = []metav1.OwnerReference{ + *metav1.NewControllerRef(canary, schema.GroupVersionKind{ + Group: flaggerv1.SchemeGroupVersion.Group, + Version: flaggerv1.SchemeGroupVersion.Version, + Kind: flaggerv1.CanaryKind, + }), + } + } _, err = ir.istioClient.NetworkingV1alpha3().DestinationRules(canary.Namespace).Create(context.TODO(), destinationRule, metav1.CreateOptions{}) if err != nil { return fmt.Errorf("DestinationRule %s.%s create error: %w", name, canary.Namespace, err) @@ -223,16 +226,18 @@ func (ir *IstioRouter) reconcileVirtualService(canary *flaggerv1.Canary) error { Namespace: canary.Namespace, Labels: metadata.Labels, Annotations: filterMetadata(metadata.Annotations), - OwnerReferences: []metav1.OwnerReference{ - *metav1.NewControllerRef(canary, schema.GroupVersionKind{ - Group: flaggerv1.SchemeGroupVersion.Group, - Version: flaggerv1.SchemeGroupVersion.Version, - Kind: flaggerv1.CanaryKind, - }), - }, }, Spec: newSpec, } + if ir.setOwnerRefs { + virtualService.OwnerReferences = []metav1.OwnerReference{ + *metav1.NewControllerRef(canary, schema.GroupVersionKind{ + Group: flaggerv1.SchemeGroupVersion.Group, + Version: flaggerv1.SchemeGroupVersion.Version, + Kind: flaggerv1.CanaryKind, + }), + } + } _, err = ir.istioClient.NetworkingV1alpha3().VirtualServices(canary.Namespace).Create(context.TODO(), virtualService, metav1.CreateOptions{}) if err != nil { return fmt.Errorf("VirtualService %s.%s create error: %w", apexName, canary.Namespace, err) diff --git a/pkg/router/kuma.go b/pkg/router/kuma.go index 75b1b0fa6..7025808d5 100644 --- a/pkg/router/kuma.go +++ b/pkg/router/kuma.go @@ -11,7 +11,6 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime/schema" "go.uber.org/zap" "k8s.io/client-go/kubernetes" @@ -85,16 +84,10 @@ func (kr *KumaRouter) Reconcile(canary *flaggerv1.Canary) error { meshName = "default" } + // TrafficRoute is a cluster-scoped object, hence we don't set an owner reference. t := &kumav1alpha1.TrafficRoute{ ObjectMeta: metav1.ObjectMeta{ - Name: apexName, - OwnerReferences: []metav1.OwnerReference{ - *metav1.NewControllerRef(canary, schema.GroupVersionKind{ - Group: flaggerv1.SchemeGroupVersion.Group, - Version: flaggerv1.SchemeGroupVersion.Version, - Kind: flaggerv1.CanaryKind, - }), - }, + Name: apexName, Annotations: filterMetadata(metadata.Annotations), }, Spec: trSpec, diff --git a/pkg/router/skipper.go b/pkg/router/skipper.go index 29c459895..8285922fb 100644 --- a/pkg/router/skipper.go +++ b/pkg/router/skipper.go @@ -55,8 +55,9 @@ const ( ) type SkipperRouter struct { - kubeClient kubernetes.Interface - logger *zap.SugaredLogger + kubeClient kubernetes.Interface + logger *zap.SugaredLogger + setOwnerRefs bool } // Reconcile creates or updates the ingresses @@ -98,12 +99,14 @@ func (skp *SkipperRouter) Reconcile(canary *flaggerv1.Canary) error { iClone.Annotations = skp.makeAnnotations(iClone.Annotations, map[string]int{primarySvcName: 100, canarySvcName: 0}) iClone.Name = canaryIngressName iClone.Namespace = canary.Namespace - iClone.OwnerReferences = []metav1.OwnerReference{ - *metav1.NewControllerRef(canary, schema.GroupVersionKind{ - Group: flaggerv1.SchemeGroupVersion.Group, - Version: flaggerv1.SchemeGroupVersion.Version, - Kind: flaggerv1.CanaryKind, - }), + if skp.setOwnerRefs { + iClone.OwnerReferences = []metav1.OwnerReference{ + *metav1.NewControllerRef(canary, schema.GroupVersionKind{ + Group: flaggerv1.SchemeGroupVersion.Group, + Version: flaggerv1.SchemeGroupVersion.Version, + Kind: flaggerv1.CanaryKind, + }), + } } // search for existence diff --git a/pkg/router/smi.go b/pkg/router/smi.go index 45f96e4f1..e5fb58e78 100644 --- a/pkg/router/smi.go +++ b/pkg/router/smi.go @@ -42,6 +42,7 @@ type SmiRouter struct { smiClient clientset.Interface logger *zap.SugaredLogger targetMesh string + setOwnerRefs bool } // Reconcile creates or updates the SMI traffic split @@ -74,19 +75,21 @@ func (sr *SmiRouter) Reconcile(canary *flaggerv1.Canary) error { if errors.IsNotFound(err) { t := &smiv1alpha1.TrafficSplit{ ObjectMeta: metav1.ObjectMeta{ - Name: apexName, - Namespace: canary.Namespace, - OwnerReferences: []metav1.OwnerReference{ - *metav1.NewControllerRef(canary, schema.GroupVersionKind{ - Group: flaggerv1.SchemeGroupVersion.Group, - Version: flaggerv1.SchemeGroupVersion.Version, - Kind: flaggerv1.CanaryKind, - }), - }, + Name: apexName, + Namespace: canary.Namespace, Annotations: sr.makeAnnotations(canary.Spec.Service.Gateways), }, Spec: tsSpec, } + if sr.setOwnerRefs { + t.OwnerReferences = []metav1.OwnerReference{ + *metav1.NewControllerRef(canary, schema.GroupVersionKind{ + Group: flaggerv1.SchemeGroupVersion.Group, + Version: flaggerv1.SchemeGroupVersion.Version, + Kind: flaggerv1.CanaryKind, + }), + } + } _, err := sr.smiClient.SplitV1alpha1().TrafficSplits(canary.Namespace).Create(context.TODO(), t, metav1.CreateOptions{}) if err != nil { @@ -203,15 +206,8 @@ func (sr *SmiRouter) getWithConvert(canary *flaggerv1.Canary, host string) (*smi if errors.IsInvalid(err) { t := &smiv1alpha2.TrafficSplit{ ObjectMeta: metav1.ObjectMeta{ - Name: apexName, - Namespace: canary.Namespace, - OwnerReferences: []metav1.OwnerReference{ - *metav1.NewControllerRef(canary, schema.GroupVersionKind{ - Group: flaggerv1.SchemeGroupVersion.Group, - Version: flaggerv1.SchemeGroupVersion.Version, - Kind: flaggerv1.CanaryKind, - }), - }, + Name: apexName, + Namespace: canary.Namespace, Annotations: sr.makeAnnotations(canary.Spec.Service.Gateways), }, Spec: smiv1alpha2.TrafficSplitSpec{ @@ -228,6 +224,15 @@ func (sr *SmiRouter) getWithConvert(canary *flaggerv1.Canary, host string) (*smi }, }, } + if sr.setOwnerRefs { + t.OwnerReferences = []metav1.OwnerReference{ + *metav1.NewControllerRef(canary, schema.GroupVersionKind{ + Group: flaggerv1.SchemeGroupVersion.Group, + Version: flaggerv1.SchemeGroupVersion.Version, + Kind: flaggerv1.CanaryKind, + }), + } + } _, err := sr.smiClient.SplitV1alpha2().TrafficSplits(canary.Namespace).Update(context.TODO(), t, metav1.UpdateOptions{}) if err != nil { diff --git a/pkg/router/smi_v1alpha2.go b/pkg/router/smi_v1alpha2.go index 13b2220c1..a574cba9c 100644 --- a/pkg/router/smi_v1alpha2.go +++ b/pkg/router/smi_v1alpha2.go @@ -40,6 +40,7 @@ type Smiv1alpha2Router struct { smiClient clientset.Interface logger *zap.SugaredLogger targetMesh string + setOwnerRefs bool } // Reconcile creates or updates the SMI traffic split @@ -72,19 +73,21 @@ func (sr *Smiv1alpha2Router) Reconcile(canary *flaggerv1.Canary) error { if errors.IsNotFound(err) { t := &smiv1alpha2.TrafficSplit{ ObjectMeta: metav1.ObjectMeta{ - Name: apexName, - Namespace: canary.Namespace, - OwnerReferences: []metav1.OwnerReference{ - *metav1.NewControllerRef(canary, schema.GroupVersionKind{ - Group: flaggerv1.SchemeGroupVersion.Group, - Version: flaggerv1.SchemeGroupVersion.Version, - Kind: flaggerv1.CanaryKind, - }), - }, + Name: apexName, + Namespace: canary.Namespace, Annotations: sr.makeAnnotations(canary.Spec.Service.Gateways), }, Spec: tsSpec, } + if sr.setOwnerRefs { + t.OwnerReferences = []metav1.OwnerReference{ + *metav1.NewControllerRef(canary, schema.GroupVersionKind{ + Group: flaggerv1.SchemeGroupVersion.Group, + Version: flaggerv1.SchemeGroupVersion.Version, + Kind: flaggerv1.CanaryKind, + }), + } + } _, err := sr.smiClient.SplitV1alpha2().TrafficSplits(canary.Namespace).Create(context.TODO(), t, metav1.CreateOptions{}) if err != nil { diff --git a/pkg/router/smi_v1alpha3.go b/pkg/router/smi_v1alpha3.go index a6dc51123..dfb560445 100644 --- a/pkg/router/smi_v1alpha3.go +++ b/pkg/router/smi_v1alpha3.go @@ -40,6 +40,7 @@ type Smiv1alpha3Router struct { smiClient clientset.Interface logger *zap.SugaredLogger targetMesh string + setOwnerRefs bool } // Reconcile creates or updates the SMI traffic split @@ -72,19 +73,21 @@ func (sr *Smiv1alpha3Router) Reconcile(canary *flaggerv1.Canary) error { if errors.IsNotFound(err) { t := &smiv1alpha3.TrafficSplit{ ObjectMeta: metav1.ObjectMeta{ - Name: apexName, - Namespace: canary.Namespace, - OwnerReferences: []metav1.OwnerReference{ - *metav1.NewControllerRef(canary, schema.GroupVersionKind{ - Group: flaggerv1.SchemeGroupVersion.Group, - Version: flaggerv1.SchemeGroupVersion.Version, - Kind: flaggerv1.CanaryKind, - }), - }, + Name: apexName, + Namespace: canary.Namespace, Annotations: sr.makeAnnotations(canary.Spec.Service.Gateways), }, Spec: tsSpec, } + if sr.setOwnerRefs { + t.OwnerReferences = []metav1.OwnerReference{ + *metav1.NewControllerRef(canary, schema.GroupVersionKind{ + Group: flaggerv1.SchemeGroupVersion.Group, + Version: flaggerv1.SchemeGroupVersion.Version, + Kind: flaggerv1.CanaryKind, + }), + } + } _, err := sr.smiClient.SplitV1alpha3().TrafficSplits(canary.Namespace).Create(context.TODO(), t, metav1.CreateOptions{}) if err != nil { diff --git a/pkg/router/traefik.go b/pkg/router/traefik.go index af7c69bb5..ecc744478 100644 --- a/pkg/router/traefik.go +++ b/pkg/router/traefik.go @@ -35,6 +35,7 @@ import ( type TraefikRouter struct { traefikClient clientset.Interface logger *zap.SugaredLogger + setOwnerRefs bool } // Reconcile creates or updates the Traefik service @@ -73,16 +74,18 @@ func (tr *TraefikRouter) Reconcile(canary *flaggerv1.Canary) error { Namespace: canary.Namespace, Labels: tsMetadata.Labels, Annotations: filterMetadata(tsMetadata.Annotations), - OwnerReferences: []metav1.OwnerReference{ - *metav1.NewControllerRef(canary, schema.GroupVersionKind{ - Group: flaggerv1.SchemeGroupVersion.Group, - Version: flaggerv1.SchemeGroupVersion.Version, - Kind: flaggerv1.CanaryKind, - }), - }, }, Spec: newSpec, } + if tr.setOwnerRefs { + traefikService.OwnerReferences = []metav1.OwnerReference{ + *metav1.NewControllerRef(canary, schema.GroupVersionKind{ + Group: flaggerv1.SchemeGroupVersion.Group, + Version: flaggerv1.SchemeGroupVersion.Version, + Kind: flaggerv1.CanaryKind, + }), + } + } _, err = tr.traefikClient.TraefikV1alpha1().TraefikServices(canary.Namespace).Create(context.TODO(), traefikService, metav1.CreateOptions{}) if err != nil {