mirror of
https://github.com/fluxcd/flagger.git
synced 2026-04-15 06:57:34 +00:00
Merge pull request #1183 from aryan9600/multi-cluster
Avoid setting owner refs if the service mesh/ingress is on a different cluster
This commit is contained in:
+12
-5
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
+19
-14
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
+10
-7
@@ -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{
|
||||
|
||||
+21
-3
@@ -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,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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{})
|
||||
|
||||
|
||||
+21
-15
@@ -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) {
|
||||
|
||||
+12
-9
@@ -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 {
|
||||
|
||||
+19
-14
@@ -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)
|
||||
|
||||
+2
-9
@@ -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,
|
||||
|
||||
+11
-8
@@ -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
|
||||
|
||||
+23
-18
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
+10
-7
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user