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:
Stefan Prodan
2022-05-06 08:50:06 +03:00
committed by GitHub
17 changed files with 225 additions and 157 deletions
+12 -5
View File
@@ -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
View File
@@ -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 {
+28 -21
View File
@@ -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
View File
@@ -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
View File
@@ -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,
}
}
}
+11 -7
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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 {
+12 -9
View File
@@ -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 {
+12 -9
View File
@@ -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
View File
@@ -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 {