You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by pc...@apache.org on 2024/06/13 10:38:48 UTC

(camel-k) 01/03: fix(install): simplify kustomize procedure

This is an automated email from the ASF dual-hosted git repository.

pcongiusti pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-k.git

commit e117f51ad262c6c46a40023ab3ca1601863da066
Author: Pasquale Congiusti <pa...@gmail.com>
AuthorDate: Fri Jun 7 15:36:42 2024 +0200

    fix(install): simplify kustomize procedure
---
 e2e/install/kustomize/operator_test.go             | 171 --------
 e2e/install/kustomize/setup_test.go                | 246 ++++++++---
 e2e/install/kustomize/uninstall_test.go            | 126 ------
 e2e/install/upgrade/cli_upgrade_test.go            |   3 -
 e2e/install/upgrade/kustomize_upgrade_test.go      | 164 ++++++++
 install/Makefile                                   | 465 ---------------------
 install/base/config                                |   1 +
 install/{setup => base}/kustomization.yaml         |   4 +-
 install/config                                     |   1 -
 install/operator/kustomization.yaml                |  50 ---
 .../kubernetes/descoped/integration-platform.yaml  |  25 +-
 .../kubernetes/descoped}/kustomization.yaml        |  11 +-
 .../descoped}/patch-watch-namespace-global.yaml    |   2 +-
 .../namespaced/integration-platform.yaml           |  25 +-
 .../kubernetes/namespaced}/kustomization.yaml      |  23 +-
 .../patch-image-pull-policy-always.yaml            |   0
 .../patch-install-default-kamelets.yaml            |   0
 .../kubernetes/namespaced}/patch-log-level.yaml    |   0
 .../namespaced}/patch-node-selector.yaml           |   0
 .../kubernetes/namespaced}/patch-ports.yaml        |   0
 .../namespaced}/patch-resource-requirements.yaml   |   0
 .../kubernetes/namespaced}/patch-toleration.yaml   |   0
 install/script/Makefile                            |   1 -
 install/script/check_crd_api_support.sh            |   1 -
 install/script/check_platform.sh                   |   1 -
 install/script/help.sh                             |  30 --
 install/setup-cluster/kustomization.yaml           |  22 -
 pkg/resources/config/manager/kustomization.yaml    |   9 -
 pkg/resources/config/manifests/kustomization.yaml  |   1 -
 .../config/manifests/patch-delete-pvc.yaml         |  28 --
 .../operator-cluster-role-binding-events.yaml      |   1 -
 .../operator-cluster-role-binding-keda.yaml        |   1 -
 .../operator-cluster-role-binding-knative.yaml     |   1 -
 .../operator-cluster-role-binding-leases.yaml      |   1 -
 .../operator-cluster-role-binding-podmonitors.yaml |   1 -
 .../operator-cluster-role-binding-strimzi.yaml     |   1 -
 .../descoped/operator-cluster-role-binding.yaml    |   1 -
 37 files changed, 423 insertions(+), 994 deletions(-)

diff --git a/e2e/install/kustomize/operator_test.go b/e2e/install/kustomize/operator_test.go
deleted file mode 100644
index c8d686241..000000000
--- a/e2e/install/kustomize/operator_test.go
+++ /dev/null
@@ -1,171 +0,0 @@
-//go:build integration
-// +build integration
-
-// To enable compilation of this file in Goland, go to "Settings -> Go -> Vendoring & Build Tags -> Custom Tags" and add "integration"
-
-/*
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements.  See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License.  You may obtain a copy of the License at
-
-   http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package kustomize
-
-import (
-	"context"
-	"fmt"
-	"os"
-	"testing"
-
-	corev1 "k8s.io/api/core/v1"
-
-	. "github.com/apache/camel-k/v2/e2e/support"
-	testutil "github.com/apache/camel-k/v2/e2e/support/util"
-	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
-	"github.com/apache/camel-k/v2/pkg/util/kubernetes"
-
-	. "github.com/onsi/gomega"
-)
-
-func TestOperatorBasic(t *testing.T) {
-	makeDir := testutil.MakeTempCopyDir(t, "../../../install")
-	os.Setenv("CAMEL_K_TEST_MAKE_DIR", makeDir)
-
-	ctx := TestContext()
-
-	// Ensure no CRDs are already installed
-	g := NewWithT(t)
-	g.Expect(UninstallAll(t, ctx)).To(Succeed())
-
-	// Return the cluster to previous state
-	defer Cleanup(t, ctx)
-
-	WithNewTestNamespace(t, func(ctx context.Context, g *WithT, ns string) {
-		namespaceArg := fmt.Sprintf("NAMESPACE=%s", ns)
-		ExpectExecSucceed(t, g, Make(t, "setup-cluster", namespaceArg))
-		ExpectExecSucceed(t, g, Make(t, "setup", namespaceArg))
-		// Skip default kamelets installation for faster test runs
-		ExpectExecSucceed(t, g, Make(t, "operator",
-			namespaceArg,
-			"INSTALL_DEFAULT_KAMELETS=false"))
-
-		// Refresh the test client to account for the newly installed CRDs
-		RefreshClient(t)
-
-		g.Eventually(OperatorPod(t, ctx, ns)).ShouldNot(BeNil())
-		g.Eventually(OperatorPodPhase(t, ctx, ns), TestTimeoutMedium).Should(Equal(corev1.PodRunning))
-
-		// Check if restricted security context has been applyed
-		operatorPod := OperatorPod(t, ctx, ns)()
-		g.Expect(operatorPod.Spec.Containers[0].SecurityContext.RunAsNonRoot).To(Equal(kubernetes.DefaultOperatorSecurityContext().RunAsNonRoot))
-		g.Expect(operatorPod.Spec.Containers[0].SecurityContext.Capabilities).To(Equal(kubernetes.DefaultOperatorSecurityContext().Capabilities))
-		g.Expect(operatorPod.Spec.Containers[0].SecurityContext.SeccompProfile).To(Equal(kubernetes.DefaultOperatorSecurityContext().SeccompProfile))
-		g.Expect(operatorPod.Spec.Containers[0].SecurityContext.AllowPrivilegeEscalation).To(Equal(kubernetes.DefaultOperatorSecurityContext().AllowPrivilegeEscalation))
-
-		g.Eventually(Platform(t, ctx, ns)).ShouldNot(BeNil())
-		registry := os.Getenv("KIND_REGISTRY")
-		if registry != "" {
-			g.Eventually(PlatformHas(t, ctx, ns, func(pl *v1.IntegrationPlatform) bool {
-				return pl.Status.Build.Registry.Address == registry
-			}), TestTimeoutShort).Should(BeTrue())
-		}
-
-	})
-}
-
-func TestOperatorKustomizeAlternativeImage(t *testing.T) {
-	makeDir := testutil.MakeTempCopyDir(t, "../../../install")
-	os.Setenv("CAMEL_K_TEST_MAKE_DIR", makeDir)
-
-	ctx := TestContext()
-
-	// Ensure no CRDs are already installed
-	g := NewWithT(t)
-	g.Expect(UninstallAll(t, ctx)).To(Succeed())
-
-	// Return the cluster to previous state
-	defer Cleanup(t, ctx)
-
-	WithNewTestNamespace(t, func(ctx context.Context, g *WithT, ns string) {
-		namespaceArg := fmt.Sprintf("NAMESPACE=%s", ns)
-		ExpectExecSucceed(t, g, Make(t, "setup-cluster", namespaceArg))
-		ExpectExecSucceed(t, g, Make(t, "setup", namespaceArg))
-
-		// Skip default kamelets installation for faster test runs
-		newImage := "quay.io/kameltest/kamel-operator"
-		newTag := "1.1.1"
-		ExpectExecSucceed(t, g, Make(t, "operator",
-			fmt.Sprintf("CUSTOM_IMAGE=%s", newImage),
-			fmt.Sprintf("CUSTOM_VERSION=%s", newTag),
-			namespaceArg,
-			"INSTALL_DEFAULT_KAMELETS=false"))
-
-		// Refresh the test client to account for the newly installed CRDs
-		RefreshClient(t)
-
-		g.Eventually(OperatorImage(t, ctx, ns)).Should(Equal(fmt.Sprintf("%s:%s", newImage, newTag)))
-	})
-}
-
-func TestOperatorKustomizeGlobal(t *testing.T) {
-	makeDir := testutil.MakeTempCopyDir(t, "../../../install")
-	os.Setenv("CAMEL_K_TEST_MAKE_DIR", makeDir)
-
-	ctx := TestContext()
-
-	// Ensure no CRDs are already installed
-	g := NewWithT(t)
-	g.Expect(UninstallAll(t, ctx)).To(Succeed())
-
-	// Return the cluster to previous state
-	defer Cleanup(t, ctx)
-
-	WithNewTestNamespace(t, func(ctx context.Context, g *WithT, ns string) {
-		namespaceArg := fmt.Sprintf("NAMESPACE=%s", ns)
-		ExpectExecSucceed(t, g, Make(t, "setup-cluster", namespaceArg))
-		ExpectExecSucceed(t, g, Make(t, "setup", namespaceArg, "GLOBAL=true"))
-
-		// Skip default kamelets installation for faster test runs
-		ExpectExecSucceed(t, g, Make(t, "operator",
-			namespaceArg,
-			"GLOBAL=true",
-			"INSTALL_DEFAULT_KAMELETS=false"))
-
-		// Refresh the test client to account for the newly installed CRDs
-		RefreshClient(t)
-
-		podFunc := OperatorPod(t, ctx, ns)
-		g.Eventually(podFunc).ShouldNot(BeNil())
-		g.Eventually(OperatorPodPhase(t, ctx, ns), TestTimeoutMedium).Should(Equal(corev1.PodRunning))
-		pod := podFunc()
-
-		containers := pod.Spec.Containers
-		g.Expect(containers).NotTo(BeEmpty())
-
-		envvars := containers[0].Env
-		g.Expect(envvars).NotTo(BeEmpty())
-
-		found := false
-		for _, v := range envvars {
-			if v.Name == "WATCH_NAMESPACE" {
-				g.Expect(v.Value).To(Equal("\"\""))
-				found = true
-				break
-			}
-		}
-		g.Expect(found).To(BeTrue())
-
-		g.Eventually(Platform(t, ctx, ns)).ShouldNot(BeNil())
-	})
-}
diff --git a/e2e/install/kustomize/setup_test.go b/e2e/install/kustomize/setup_test.go
index 79a2d1b72..90db17876 100644
--- a/e2e/install/kustomize/setup_test.go
+++ b/e2e/install/kustomize/setup_test.go
@@ -26,73 +26,219 @@ import (
 	"context"
 	"fmt"
 	"os"
+	"os/exec"
 	"testing"
 
+	corev1 "k8s.io/api/core/v1"
+
 	. "github.com/apache/camel-k/v2/e2e/support"
 	testutil "github.com/apache/camel-k/v2/e2e/support/util"
-	"github.com/apache/camel-k/v2/pkg/util/defaults"
+	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
+	"github.com/apache/camel-k/v2/pkg/util/kubernetes"
+
 	. "github.com/onsi/gomega"
 )
 
-func TestSetupKustomizeBasic(t *testing.T) {
+func TestKustomizeNamespaced(t *testing.T) {
+	// TODO, likely we need to adjust this test with a Kustomize overlay for Openshift
+	// which would not require the registry setting
+	registry := os.Getenv("KIND_REGISTRY")
+	kustomizeDir := testutil.MakeTempCopyDir(t, "../../../install")
 	ctx := TestContext()
 	g := NewWithT(t)
-	makeDir := testutil.MakeTempCopyDir(t, "../../../install")
-	os.Setenv("CAMEL_K_TEST_MAKE_DIR", makeDir)
-
-	// Ensure no CRDs are already installed
-	g.Expect(UninstallAll(t, ctx)).To(Succeed())
-	g.Eventually(CRDs(t)).Should(HaveLen(0))
-
-	// Return the cluster to previous state
-	defer Cleanup(t, ctx)
+	g.Expect(registry).NotTo(Equal(""))
+	// Ensure no CRDs are already installed: we can skip to check as it may fail
+	// if no CRDs was previously installed.
+	UninstallAll(t, ctx)
 
 	WithNewTestNamespace(t, func(ctx context.Context, g *WithT, ns string) {
-		namespaceArg := fmt.Sprintf("NAMESPACE=%s", ns)
-		ExpectExecSucceed(t, g, Make(t, "setup-cluster", namespaceArg))
-		g.Eventually(CRDs(t)).Should(HaveLen(GetExpectedCRDs(defaults.Version)))
-
-		ExpectExecSucceed(t, g, Make(t, "setup", namespaceArg))
-
-		kpRoles := ExpectedKubePromoteRoles
-		opRoles := kpRoles + ExpectedOSPromoteRoles
-		g.Eventually(Role(t, ctx, ns)).Should(Or(HaveLen(kpRoles), HaveLen(opRoles)))
-
-		kcRoles := ExpectedKubeClusterRoles
-		ocRoles := kcRoles + ExpectedOSClusterRoles
-		g.Eventually(ClusterRole(t, ctx)).Should(Or(HaveLen(kcRoles), HaveLen(ocRoles)))
-
-		// Tidy up to ensure next test works
-		g.Expect(Kamel(t, ctx, "uninstall", "-n", ns).Execute()).To(Succeed())
+		// We must change a few values in the Kustomize config
+		ExpectExecSucceed(t, g,
+			exec.Command(
+				"sed",
+				"-i",
+				fmt.Sprintf("s/namespace: .*/namespace: %s/", ns),
+				fmt.Sprintf("%s/overlays/kubernetes/namespaced/kustomization.yaml", kustomizeDir),
+			))
+		ExpectExecSucceed(t, g,
+			exec.Command(
+				"sed",
+				"-i",
+				fmt.Sprintf("s/address: .*/address: %s/", registry),
+				fmt.Sprintf("%s/overlays/kubernetes/namespaced/integration-platform.yaml", kustomizeDir),
+			))
+
+		ExpectExecSucceed(t, g, Kubectl(
+			"apply",
+			"-k",
+			fmt.Sprintf("%s/overlays/kubernetes/namespaced", kustomizeDir),
+			"--server-side",
+		))
+		// Refresh the test client to account for the newly installed CRDs
+		RefreshClient(t)
+		g.Eventually(OperatorPod(t, ctx, ns)).ShouldNot(BeNil())
+		g.Eventually(OperatorPodPhase(t, ctx, ns), TestTimeoutMedium).Should(Equal(corev1.PodRunning))
+		// Check if restricted security context has been applied
+		operatorPod := OperatorPod(t, ctx, ns)()
+		g.Expect(operatorPod.Spec.Containers[0].SecurityContext.RunAsNonRoot).To(
+			Equal(kubernetes.DefaultOperatorSecurityContext().RunAsNonRoot),
+		)
+		g.Expect(operatorPod.Spec.Containers[0].SecurityContext.Capabilities).To(
+			Equal(kubernetes.DefaultOperatorSecurityContext().Capabilities),
+		)
+		g.Expect(operatorPod.Spec.Containers[0].SecurityContext.SeccompProfile).To(
+			Equal(kubernetes.DefaultOperatorSecurityContext().SeccompProfile),
+		)
+		g.Expect(operatorPod.Spec.Containers[0].SecurityContext.AllowPrivilegeEscalation).To(
+			Equal(kubernetes.DefaultOperatorSecurityContext().AllowPrivilegeEscalation),
+		)
+		g.Eventually(Platform(t, ctx, ns)).ShouldNot(BeNil())
+		g.Eventually(PlatformHas(t, ctx, ns, func(pl *v1.IntegrationPlatform) bool {
+			return pl.Status.Build.Registry.Address == registry
+		}), TestTimeoutShort).Should(BeTrue())
+
+		// Test a simple integration is running
+		g.Expect(KamelRun(t, ctx, ns, "files/yaml.yaml").Execute()).To(Succeed())
+		g.Eventually(IntegrationPodPhase(t, ctx, ns, "yaml"), TestTimeoutLong).Should(Equal(corev1.PodRunning))
+		g.Eventually(IntegrationConditionStatus(t, ctx, ns, "yaml", v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
+		g.Eventually(IntegrationLogs(t, ctx, ns, "yaml"), TestTimeoutShort).Should(ContainSubstring("Magicstring!"))
+
+		// Test operator only uninstall
+		ExpectExecSucceed(t, g, Kubectl(
+			"delete",
+			"deploy,configmap,secret,sa,rolebindings,clusterrolebindings,roles,clusterroles",
+			"-l",
+			"app=camel-k",
+			"-n",
+			ns,
+		))
+		g.Eventually(OperatorPod(t, ctx, ns)).Should(BeNil())
+		g.Eventually(Integration(t, ctx, ns, "yaml"), TestTimeoutShort).ShouldNot(BeNil())
+		g.Eventually(IntegrationConditionStatus(t, ctx, ns, "yaml", v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
+
+		// Test CRD uninstall (will remove Integrations as well)
+		ExpectExecSucceed(t, g, Kubectl(
+			"delete",
+			"crd",
+			"-l",
+			"app=camel-k",
+			"-n",
+			ns,
+		))
+		g.Eventually(OperatorPod(t, ctx, ns)).Should(BeNil())
+		g.Eventually(Integration(t, ctx, ns, "yaml"), TestTimeoutShort).Should(BeNil())
+		g.Eventually(CRDs(t)).Should(BeNil())
 	})
-
 }
 
-func TestSetupKustomizeGlobal(t *testing.T) {
-	makeDir := testutil.MakeTempCopyDir(t, "../../../install")
-	os.Setenv("CAMEL_K_TEST_MAKE_DIR", makeDir)
-
+func TestKustomizeDescoped(t *testing.T) {
+	// TODO, likely we need to adjust this test with a Kustomize overlay for Openshift
+	// which would not require the registry setting
+	registry := os.Getenv("KIND_REGISTRY")
+	kustomizeDir := testutil.MakeTempCopyDir(t, "../../../install")
 	ctx := TestContext()
-
-	// Ensure no CRDs are already installed
 	g := NewWithT(t)
-	g.Expect(UninstallAll(t, ctx)).To(Succeed())
-	g.Eventually(CRDs(t)).Should(HaveLen(0))
-
-	// Return the cluster to previous state
-	defer Cleanup(t, ctx)
+	g.Expect(registry).NotTo(Equal(""))
+	// Ensure no CRDs are already installed: we can skip to check as it may fail
+	// if no CRDs was previously installed.
+	UninstallAll(t, ctx)
 
 	WithNewTestNamespace(t, func(ctx context.Context, g *WithT, ns string) {
-		namespaceArg := fmt.Sprintf("NAMESPACE=%s", ns)
-		ExpectExecSucceed(t, g, Make(t, "setup-cluster", namespaceArg))
-		g.Eventually(CRDs(t)).Should(HaveLen(GetExpectedCRDs(defaults.Version)))
-
-		ExpectExecSucceed(t, g, Make(t, "setup", "GLOBAL=true", namespaceArg))
-
-		g.Eventually(Role(t, ctx, ns)).Should(HaveLen(0))
-
-		kcpRoles := ExpectedKubeClusterRoles + ExpectedKubePromoteRoles
-		ocpRoles := kcpRoles + ExpectedOSClusterRoles + ExpectedOSPromoteRoles
-		g.Eventually(ClusterRole(t, ctx)).Should(Or(HaveLen(kcpRoles), HaveLen(ocpRoles)))
+		// We must change a few values in the Kustomize config
+		ExpectExecSucceed(t, g,
+			exec.Command(
+				"sed",
+				"-i",
+				fmt.Sprintf("s/namespace: .*/namespace: %s/", ns),
+				fmt.Sprintf("%s/overlays/kubernetes/descoped/kustomization.yaml", kustomizeDir),
+			))
+		ExpectExecSucceed(t, g,
+			exec.Command(
+				"sed",
+				"-i",
+				fmt.Sprintf("s/address: .*/address: %s/", registry),
+				fmt.Sprintf("%s/overlays/kubernetes/descoped/integration-platform.yaml", kustomizeDir),
+			))
+
+		ExpectExecSucceed(t, g, Kubectl(
+			"apply",
+			"-k",
+			fmt.Sprintf("%s/overlays/kubernetes/descoped", kustomizeDir),
+			"--server-side",
+		))
+
+		// Refresh the test client to account for the newly installed CRDs
+		RefreshClient(t)
+
+		podFunc := OperatorPod(t, ctx, ns)
+		g.Eventually(podFunc).ShouldNot(BeNil())
+		g.Eventually(OperatorPodPhase(t, ctx, ns), TestTimeoutMedium).Should(Equal(corev1.PodRunning))
+		pod := podFunc()
+
+		containers := pod.Spec.Containers
+		g.Expect(containers).NotTo(BeEmpty())
+
+		envvars := containers[0].Env
+		g.Expect(envvars).NotTo(BeEmpty())
+
+		found := false
+		for _, v := range envvars {
+			if v.Name == "WATCH_NAMESPACE" {
+				g.Expect(v.Value).To(Equal(""))
+				found = true
+				break
+			}
+		}
+		g.Expect(found).To(BeTrue())
+		// Check if restricted security context has been applied
+		operatorPod := OperatorPod(t, ctx, ns)()
+		g.Expect(operatorPod.Spec.Containers[0].SecurityContext.RunAsNonRoot).To(
+			Equal(kubernetes.DefaultOperatorSecurityContext().RunAsNonRoot),
+		)
+		g.Expect(operatorPod.Spec.Containers[0].SecurityContext.Capabilities).To(
+			Equal(kubernetes.DefaultOperatorSecurityContext().Capabilities),
+		)
+		g.Expect(operatorPod.Spec.Containers[0].SecurityContext.SeccompProfile).To(
+			Equal(kubernetes.DefaultOperatorSecurityContext().SeccompProfile),
+		)
+		g.Expect(operatorPod.Spec.Containers[0].SecurityContext.AllowPrivilegeEscalation).To(
+			Equal(kubernetes.DefaultOperatorSecurityContext().AllowPrivilegeEscalation),
+		)
+		g.Eventually(Platform(t, ctx, ns)).ShouldNot(BeNil())
+
+		// We need a different namespace from the global operator
+		WithNewTestNamespace(t, func(ctx context.Context, g *WithT, nsIntegration string) {
+			// Test a simple integration is running
+			g.Expect(KamelRun(t, ctx, nsIntegration, "files/yaml.yaml").Execute()).To(Succeed())
+			g.Eventually(IntegrationPodPhase(t, ctx, nsIntegration, "yaml"), TestTimeoutLong).Should(Equal(corev1.PodRunning))
+			g.Eventually(IntegrationConditionStatus(t, ctx, nsIntegration, "yaml", v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
+			g.Eventually(IntegrationLogs(t, ctx, nsIntegration, "yaml"), TestTimeoutShort).Should(ContainSubstring("Magicstring!"))
+
+			// Test operator only uninstall
+			ExpectExecSucceed(t, g, Kubectl(
+				"delete",
+				"deploy,configmap,secret,sa,rolebindings,clusterrolebindings,roles,clusterroles",
+				"-l",
+				"app=camel-k",
+				"-n",
+				ns,
+			))
+			g.Eventually(OperatorPod(t, ctx, ns)).Should(BeNil())
+			g.Eventually(Integration(t, ctx, nsIntegration, "yaml"), TestTimeoutShort).ShouldNot(BeNil())
+			g.Eventually(IntegrationConditionStatus(t, ctx, nsIntegration, "yaml", v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
+
+			// Test CRD uninstall (will remove Integrations as well)
+			ExpectExecSucceed(t, g, Kubectl(
+				"delete",
+				"crd",
+				"-l",
+				"app=camel-k",
+				"-n",
+				ns,
+			))
+			g.Eventually(OperatorPod(t, ctx, ns)).Should(BeNil())
+			g.Eventually(Integration(t, ctx, nsIntegration, "yaml"), TestTimeoutShort).Should(BeNil())
+			g.Eventually(CRDs(t)).Should(BeNil())
+		})
 	})
 }
diff --git a/e2e/install/kustomize/uninstall_test.go b/e2e/install/kustomize/uninstall_test.go
deleted file mode 100644
index 305fa7512..000000000
--- a/e2e/install/kustomize/uninstall_test.go
+++ /dev/null
@@ -1,126 +0,0 @@
-//go:build integration
-// +build integration
-
-// To enable compilation of this file in Goland, go to "Settings -> Go -> Vendoring & Build Tags -> Custom Tags" and add "integration"
-
-/*
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements.  See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License.  You may obtain a copy of the License at
-
-   http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package kustomize
-
-import (
-	"context"
-	"fmt"
-	"os"
-	"testing"
-
-	corev1 "k8s.io/api/core/v1"
-
-	. "github.com/apache/camel-k/v2/e2e/support"
-	testutil "github.com/apache/camel-k/v2/e2e/support/util"
-	"github.com/apache/camel-k/v2/pkg/util/defaults"
-	. "github.com/onsi/gomega"
-)
-
-func TestKustomizeUninstallBasic(t *testing.T) {
-	ctx := TestContext()
-	g := NewWithT(t)
-	makeDir := testutil.MakeTempCopyDir(t, "../../../install")
-	os.Setenv("CAMEL_K_TEST_MAKE_DIR", makeDir)
-
-	// Ensure no CRDs are already installed
-	g.Expect(UninstallAll(t, ctx)).To(Succeed())
-	g.Eventually(CRDs(t)).Should(HaveLen(0))
-
-	// Return the cluster to previous state
-	defer Cleanup(t, ctx)
-
-	WithNewTestNamespace(t, func(ctx context.Context, g *WithT, ns string) {
-		namespaceArg := fmt.Sprintf("NAMESPACE=%s", ns)
-		ExpectExecSucceed(t, g, Make(t, "setup-cluster", namespaceArg))
-		ExpectExecSucceed(t, g, Make(t, "setup", namespaceArg))
-		ExpectExecSucceed(t, g, Make(t, "platform", namespaceArg))
-		// Skip default kamelets installation for faster test runs
-		ExpectExecSucceed(t, g, Make(t, "operator", namespaceArg, "INSTALL_DEFAULT_KAMELETS=false"))
-		g.Eventually(OperatorPod(t, ctx, ns)).ShouldNot(BeNil())
-		g.Eventually(OperatorPodPhase(t, ctx, ns), TestTimeoutMedium).Should(Equal(corev1.PodRunning))
-
-		// Do uninstall
-		ExpectExecSucceed(t, g, Make(t, "uninstall", namespaceArg))
-
-		// Refresh the test client to account for the newly installed CRDs
-		RefreshClient(t)
-
-		g.Eventually(OperatorPod(t, ctx, ns)).Should(BeNil())
-		g.Eventually(Platform(t, ctx, ns)).Should(BeNil())
-		// The operator can dynamically create a for its builders
-		// so, in case there is a build strategy "pod", expect this to have 1 role
-		g.Eventually(Role(t, ctx, ns)).Should(BeNil())
-		g.Eventually(ClusterRole(t, ctx)).Should(BeNil())
-		// CRDs should be still there
-		g.Eventually(CRDs(t)).Should(HaveLen(GetExpectedCRDs(defaults.Version)))
-
-		// Do uninstall all
-		ExpectExecSucceed(t, g, Make(t, "uninstall", namespaceArg, "UNINSTALL_ALL=true"))
-
-		g.Eventually(CRDs(t)).Should(BeNil())
-	})
-
-}
-
-func TestUninstallGlobal(t *testing.T) {
-	ctx := TestContext()
-	g := NewWithT(t)
-	makeDir := testutil.MakeTempCopyDir(t, "../../../install")
-	os.Setenv("CAMEL_K_TEST_MAKE_DIR", makeDir)
-
-	// Ensure no CRDs are already installed
-	g.Expect(UninstallAll(t, ctx)).To(Succeed())
-	g.Eventually(CRDs(t)).Should(HaveLen(0))
-
-	// Return the cluster to previous state
-	defer Cleanup(t, ctx)
-
-	WithNewTestNamespace(t, func(ctx context.Context, g *WithT, ns string) {
-		namespaceArg := fmt.Sprintf("NAMESPACE=%s", ns)
-		ExpectExecSucceed(t, g, Make(t, "setup-cluster", namespaceArg))
-		ExpectExecSucceed(t, g, Make(t, "setup", namespaceArg, "GLOBAL=true"))
-		ExpectExecSucceed(t, g, Make(t, "platform", namespaceArg))
-		// Skip default kamelets installation for faster test runs
-		ExpectExecSucceed(t, g, Make(t, "operator", namespaceArg, "GLOBAL=true", "INSTALL_DEFAULT_KAMELETS=false"))
-		g.Eventually(OperatorPod(t, ctx, ns)).ShouldNot(BeNil())
-		g.Eventually(OperatorPodPhase(t, ctx, ns), TestTimeoutMedium).Should(Equal(corev1.PodRunning))
-
-		// Do uninstall
-		ExpectExecSucceed(t, g, Make(t, "uninstall", namespaceArg))
-
-		// Refresh the test client to account for the newly installed CRDs
-		RefreshClient(t)
-
-		g.Eventually(OperatorPod(t, ctx, ns)).Should(BeNil())
-		g.Eventually(Platform(t, ctx, ns)).Should(BeNil())
-		g.Eventually(Role(t, ctx, ns)).Should(BeNil())
-		g.Eventually(ClusterRole(t, ctx)).Should(BeNil())
-		// CRDs should be still there
-		g.Eventually(CRDs(t)).Should(HaveLen(GetExpectedCRDs(defaults.Version)))
-
-		// Do uninstall all
-		ExpectExecSucceed(t, g, Make(t, "uninstall", namespaceArg, "UNINSTALL_ALL=true"))
-
-		g.Eventually(CRDs(t)).Should(BeNil())
-	})
-}
diff --git a/e2e/install/upgrade/cli_upgrade_test.go b/e2e/install/upgrade/cli_upgrade_test.go
index 8f607fa92..b90d96446 100644
--- a/e2e/install/upgrade/cli_upgrade_test.go
+++ b/e2e/install/upgrade/cli_upgrade_test.go
@@ -43,13 +43,10 @@ func TestCLIOperatorUpgrade(t *testing.T) {
 	WithNewTestNamespace(t, func(ctx context.Context, g *WithT, ns string) {
 		version, ok := os.LookupEnv("KAMEL_K_TEST_RELEASE_VERSION")
 		g.Expect(ok).To(BeTrue())
-
 		image, ok := os.LookupEnv("KAMEL_K_TEST_OPERATOR_CURRENT_IMAGE")
 		g.Expect(ok).To(BeTrue())
-
 		kamel, ok := os.LookupEnv("RELEASED_KAMEL_BIN")
 		g.Expect(ok).To(BeTrue())
-
 		// Set KAMEL_BIN only for this test - don't override the ENV variable for all tests
 		g.Expect(os.Setenv("KAMEL_BIN", kamel)).To(Succeed())
 
diff --git a/e2e/install/upgrade/kustomize_upgrade_test.go b/e2e/install/upgrade/kustomize_upgrade_test.go
new file mode 100644
index 000000000..e3bbdbdfb
--- /dev/null
+++ b/e2e/install/upgrade/kustomize_upgrade_test.go
@@ -0,0 +1,164 @@
+//go:build integration
+// +build integration
+
+// To enable compilation of this file in Goland, go to "Settings -> Go -> Vendoring & Build Tags -> Custom Tags" and add "integration"
+
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package upgrade
+
+import (
+	"context"
+	"fmt"
+	"os"
+	"os/exec"
+	"testing"
+	"time"
+
+	. "github.com/onsi/gomega"
+
+	corev1 "k8s.io/api/core/v1"
+	kerrors "k8s.io/apimachinery/pkg/api/errors"
+
+	. "github.com/apache/camel-k/v2/e2e/support"
+	testutil "github.com/apache/camel-k/v2/e2e/support/util"
+	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
+	"github.com/apache/camel-k/v2/pkg/util/defaults"
+)
+
+// WARNING: this test is not OLM specific but needs certain setting we provide in OLM installation scenario
+func TestKustomizeUpgrade(t *testing.T) {
+	WithNewTestNamespace(t, func(ctx context.Context, g *WithT, ns string) {
+		// ********* START
+		// TODO: we need to replace this CLI based installation with Kustomize installation after 2.4 release
+		// this is a workaround as Kustomize was not working properly pre 2.4
+		version, ok := os.LookupEnv("KAMEL_K_TEST_RELEASE_VERSION")
+		g.Expect(ok).To(BeTrue())
+		image, ok := os.LookupEnv("KAMEL_K_TEST_OPERATOR_CURRENT_IMAGE")
+		g.Expect(ok).To(BeTrue())
+		kamel, ok := os.LookupEnv("RELEASED_KAMEL_BIN")
+		g.Expect(ok).To(BeTrue())
+		// Set KAMEL_BIN only for this test - don't override the ENV variable for all tests
+		g.Expect(os.Setenv("KAMEL_BIN", kamel)).To(Succeed())
+
+		if len(CRDs(t)()) > 0 {
+			// Clean up old installation - maybe leftover from another test
+			if err := UninstallAll(t, ctx); err != nil && !kerrors.IsNotFound(err) {
+				t.Error(err)
+				t.FailNow()
+			}
+		}
+		g.Eventually(CRDs(t)).Should(HaveLen(0))
+
+		// Should both install the CRDs and kamel in the given namespace
+		g.Expect(Kamel(t, ctx, "install", "-n", ns, "--global").Execute()).To(Succeed())
+		// Check the operator pod is running
+		g.Eventually(OperatorPodPhase(t, ctx, ns), TestTimeoutMedium).Should(Equal(corev1.PodRunning))
+		// Refresh the test client to account for the newly installed CRDs
+		RefreshClient(t)
+		// Check the IntegrationPlatform has been reconciled
+		g.Eventually(PlatformVersion(t, ctx, ns), TestTimeoutMedium).Should(Equal(version))
+		// TODO: replace the code above
+		// ************* END
+
+		// We need a different namespace from the global operator
+		WithNewTestNamespace(t, func(ctx context.Context, g *WithT, nsIntegration string) {
+			// Run the Integration
+			name := RandomizedSuffixName("yaml")
+			g.Expect(Kamel(t, ctx, "run", "-n", nsIntegration, "--name", name, "files/yaml.yaml").Execute()).To(Succeed())
+			g.Eventually(IntegrationPodPhase(t, ctx, nsIntegration, name)).Should(Equal(corev1.PodRunning))
+			g.Eventually(IntegrationConditionStatus(t, ctx, nsIntegration, name, v1.IntegrationConditionReady)).Should(Equal(corev1.ConditionTrue))
+			// Check the Integration version
+			g.Eventually(IntegrationVersion(t, ctx, nsIntegration, name)).Should(Equal(version))
+
+			// Clear the KAMEL_BIN environment variable so that the current version is used from now on
+			g.Expect(os.Setenv("KAMEL_BIN", "")).To(Succeed())
+
+			// Upgrade the operator by installing the current version
+			registry := os.Getenv("KIND_REGISTRY")
+			kustomizeDir := testutil.MakeTempCopyDir(t, "../../../install")
+			g.Expect(registry).NotTo(Equal(""))
+			// We must change a few values in the Kustomize config
+			ExpectExecSucceed(t, g,
+				exec.Command(
+					"sed",
+					"-i",
+					fmt.Sprintf("s/namespace: .*/namespace: %s/", ns),
+					fmt.Sprintf("%s/overlays/kubernetes/descoped/kustomization.yaml", kustomizeDir),
+				))
+			ExpectExecSucceed(t, g,
+				exec.Command(
+					"sed",
+					"-i",
+					fmt.Sprintf("s/address: .*/address: %s/", registry),
+					fmt.Sprintf("%s/overlays/kubernetes/descoped/integration-platform.yaml", kustomizeDir),
+				))
+
+			ExpectExecSucceed(t, g, Kubectl(
+				"apply",
+				"-k",
+				fmt.Sprintf("%s/overlays/kubernetes/descoped", kustomizeDir),
+				"--server-side",
+				"--force-conflicts",
+			))
+
+			// Check the operator image is the current built one
+			g.Eventually(OperatorImage(t, ctx, ns)).Should(Equal(image))
+			// Check the operator pod is running
+			g.Eventually(OperatorPodPhase(t, ctx, ns), TestTimeoutMedium).Should(Equal(corev1.PodRunning))
+			// Check the IntegrationPlatform has been reconciled
+			g.Eventually(PlatformPhase(t, ctx, ns), TestTimeoutMedium).Should(Equal(v1.IntegrationPlatformPhaseReady))
+			g.Eventually(PlatformVersion(t, ctx, ns), TestTimeoutMedium).Should(Equal(defaults.Version))
+
+			// Check the Integration hasn't been upgraded
+			g.Consistently(IntegrationVersion(t, ctx, nsIntegration, name), 15*time.Second, 3*time.Second).Should(Equal(version))
+			// Make sure that any Pod rollout is completing successfully
+			// otherwise we are probably in front of a non breaking compatibility change
+			g.Consistently(IntegrationConditionStatus(t, ctx, nsIntegration, name, v1.IntegrationConditionReady),
+				2*time.Minute, 15*time.Second).Should(Equal(corev1.ConditionTrue))
+
+			// Force the Integration upgrade
+			g.Expect(Kamel(t, ctx, "rebuild", name, "-n", nsIntegration).Execute()).To(Succeed())
+
+			// A catalog should be created with the new configuration
+			g.Eventually(DefaultCamelCatalogPhase(t, ctx, ns), TestTimeoutMedium).Should(Equal(v1.CamelCatalogPhaseReady))
+			// Check the Integration version has been upgraded
+			g.Eventually(IntegrationVersion(t, ctx, nsIntegration, name), TestTimeoutMedium).Should(Equal(defaults.Version))
+
+			// Check the previous kit is not garbage collected
+			g.Eventually(Kits(t, ctx, ns, KitWithVersion(version))).Should(HaveLen(1))
+			// Check a new kit is created with the current version
+			g.Eventually(Kits(t, ctx, ns, KitWithVersion(defaults.Version))).Should(HaveLen(1))
+			// Check the new kit is ready
+			g.Eventually(Kits(t, ctx, ns, KitWithVersion(defaults.Version), KitWithPhase(v1.IntegrationKitPhaseReady)),
+				TestTimeoutMedium).Should(HaveLen(1))
+
+			kit := Kits(t, ctx, ns, KitWithVersion(defaults.Version))()[0]
+
+			// Check the Integration uses the new image
+			g.Eventually(IntegrationKit(t, ctx, nsIntegration, name), TestTimeoutMedium).Should(Equal(kit.Name))
+			// Check the Integration Pod uses the new kit
+			g.Eventually(IntegrationPodImage(t, ctx, nsIntegration, name)).Should(Equal(kit.Status.Image))
+
+			// Check the Integration runs correctly
+			g.Eventually(IntegrationPodPhase(t, ctx, nsIntegration, name), TestTimeoutLong).Should(Equal(corev1.PodRunning))
+			g.Eventually(IntegrationConditionStatus(t, ctx, nsIntegration, name, v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
+		})
+		// TODO: we should verify new CRDs installed are the same as the one defined in the source core here
+	})
+}
diff --git a/install/Makefile b/install/Makefile
deleted file mode 100644
index 692d32f9a..000000000
--- a/install/Makefile
+++ /dev/null
@@ -1,465 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-#
-# Use bash explicitly in this Makefile to avoid unexpected platform
-# incompatibilities among Linux distros.
-#
-SHELL := /bin/bash
-
-MAKE := make --no-print-directory
-
-#
-# Allows for resources to be loaded from outside the root location of
-# the kustomize config file. Ensures that resource don't need to be
-# copied around the file system.
-#
-# See https://kubectl.docs.kubernetes.io/faq/kustomize
-#
-KOPTIONS := --load-restrictor LoadRestrictionsNone
-
-#
-# Include the main camel-k Makefile containing
-# basic common recipes like kustomize and vars
-# like VERSION
-#
-include script/Makefile
-
-#
-# Vars that can be overridden by external env vars
-#
-DRY_RUN ?= false
-NAMESPACE ?= camel-k
-
-# Global: [true|false]
-# - On setup: will promote roles and bindings to cluster-level
-# - On operator: set namespace to all using WATCH_NAMESPACE env var
-GLOBAL ?= false
-# Always Pull Images: [true|false]
-ALWAYS_PULL_IMAGES ?= false
-# Monitoring: [true|false]
-# - On operator: will add the prometheus resources to install
-MONITORING ?= false
-# Monitoring Port: integer
-MONITORING_PORT ?= 8080
-# Health Port: integer
-HEALTH_PORT ?= 8081
-# Operator Logging Level: string [info, debug, 0, 1]
-LOGGING_LEVEL ?= info
-# Install default kamelets: [true|false]
-INSTALL_DEFAULT_KAMELETS ?= true
-# Install default pvc: [true|false]
-INSTALL_DEFAULT_PVC ?= true
-# Uninstall all Camel K resources: [true|false]
-UNINSTALL_ALL ?=false
-
-CONFIG := config
-MANAGER := $(CONFIG)/manager
-SAMPLES := $(CONFIG)/samples
-RBAC := $(CONFIG)/rbac
-RBAC_OS := $(RBAC)/openshift
-RBAC_GLOBAL := global
-OPERATOR := operator
-PLACEHOLDER := placeholder
-YAML := yaml
-
-# Fetch the latest image name - may override the original constant
-IMAGE_NAME := $(shell grep image: $(MANAGER)/operator-deployment.yaml | sed 's/.*image: \(.*\):.*/\1/')
-
-# Setup patches
-ROLE_TO_CROLE_PATCH := $(RBAC)/patch-role-to-clusterrole
-ROLEBIN_TO_CROLEBIN_PATCH := $(RBAC)/patch-rolebinding-to-clusterrolebinding
-# Operator patches
-PORTS_PATCH := patch-ports
-LOG_LEVEL_PATCH := patch-log-level
-INSTALL_DEFAULT_KAMELETS_PATCH := patch-install-default-kamelets
-IMAGE_PULL_POLICY_PATCH := patch-image-pull-policy-always
-WATCH_NAMESPACE_PATCH := patch-watch-namespace-global
-# Platform patches
-INT_PLATFORM_PATCH := patch-integration-platform
-
-#
-# Macro for editing kustomization to define
-# the image reference
-#
-# Parameter: directory of the kustomization.yaml
-#
-define set-kustomize-image
-	$(if $(filter $(IMAGE_NAME),$(CUSTOM_IMAGE):$(CUSTOM_VERSION)),,\
-		@cd $(1) || exit 1 && \
-			$(KUSTOMIZE) edit set image $(IMAGE_NAME)=$(CUSTOM_IMAGE):$(CUSTOM_VERSION))
-endef
-
-#
-# Macro for editing kustomization to define
-# the namespace
-#
-# Parameter: directory of the kustomization.yaml
-#
-define set-kustomize-namespace
-	@cd $(1) || exit 1 && \
-		$(KUSTOMIZE) edit set namespace $(NAMESPACE)
-endef
-
-#
-# Add or remove a patch on a kustomization.yaml
-# targetting a kind of resource
-#
-# Parameters:
-# * directory of the kustomization.yaml
-# * [add, remove]
-# * path of patch
-# * kind of resources, eg. Deployment, Role
-#
-define add-remove-kind-patch
-	@cd $(1) || exit 1 && \
-		$(KUSTOMIZE) edit $(2) patch --path $(3) --kind $(4) &> /dev/null
-endef
-
-#
-# Macro for adding / removing the prometheus resources for monitoring
-#
-define add-remove-operator-monitoring
-	@cd $(1) || exit 1 && \
-		$(KUSTOMIZE) edit $(2) resource ../$(CONFIG)/prometheus &> /dev/null
-endef
-
-.PHONY: have-platform check_admin setup-cluster .setup-kubernetes .setup-openshift setup
-
-#
-# Determine the platform of the cluster based on
-# either the use of querying through a go-client
-# or using an installed client, ie. oc or kubectl
-#
-find-platform:
-ifndef PLATFORM
-PLATFORM=$(shell script/check_platform.sh)
-endif
-
-#
-# Checks if the cluster platform has been defined correctly either by the user
-# or by the platform_check script.
-#
-have-platform: find-platform
-ifeq ($(PLATFORM),openshift)
-	@echo Platform identified as 'openshift'
-else ifeq ($(PLATFORM),kubernetes)
-	@echo Platform identified as 'kubernetes'
-else
-	@echo "****"
-	@echo "**** ERROR: Cannot continue as cluster platform cannot be identified ****"
-	@echo "****"
-	@exit 1
-endif
-
-#
-# Checks if the cluster user has the necessary privileges to be a cluster-admin
-# In this case if the user can list the CRDs then probably a cluster-admin
-#
-check-admin: kubectl
-	@output=$$(kubectl get crd 2>&1) || (echo "****" && echo "**** ERROR: Cannot continue as user is not a Cluster-Admin ****" && echo "****"; exit 1)
-
-crd-api-support: kubectl
-ifndef CRD_SUPPORT
-CRD_SUPPORT=$(shell script/check_crd_api_support.sh)
-endif
-
-check-crd-api-support: crd-api-support
-ifneq ($(CRD_SUPPORT),OK)
-	$(error *** CRD API FAILURE: $(CRD_SUPPORT) ****)
-endif
-
-#---
-#
-#@ setup-cluster
-#
-#== Setup the cluster installation by installing crds and cluster roles.
-#
-# Will either call setup-cluster-openshift (then setup-cluster-kubernetes) or
-# setup-cluster-kubernetes depending on the identity of the cluster
-#
-#=== Cluster-admin privileges are required.
-#
-#* PARAMETERS:
-#** NAMESPACE: Set the namespace for the resources
-#** PLATFORM:  Override the discovered platform, if required
-#** DRY_RUN:   Print the resources to be applied instead of applying them [true|false]
-#
-#---
-setup-cluster: check-admin check-crd-api-support have-platform kustomize kubectl
-# Set the namespace in the setup-cluster kustomization yaml
-	@$(call set-kustomize-namespace,$@)
-ifeq ($(PLATFORM), openshift)
-	@cd $@ || exit 1 && $(KUSTOMIZE) edit add resource ../$(RBAC_OS) && cd - &> /dev/null;
-endif
-#
-# Build the resources
-# Post-process ClusterRoleBindings to fix the namespace in the refs (not yet handled by kustomize)
-# Either apply to the cluster or output to CLI
-#
-ifeq ($(DRY_RUN), false)
-	@$(KUSTOMIZE) build $(KOPTIONS) $@ | \
-		sed 's/$(PLACEHOLDER)/$(NAMESPACE)/' | \
-		kubectl apply --server-side -f -
-else
-	@$(KUSTOMIZE) build $(KOPTIONS) $@ | \
-		sed 's/$(PLACEHOLDER)/$(NAMESPACE)/'
-endif
-
-#---
-#
-#@ setup
-#
-#== Setup the installation by installing roles and granting privileges for the installing operator.
-#
-#=== Calls setup-cluster
-#=== Cluster-admin privileges are required.
-#
-#* PARAMETERS:
-#** NAMESPACE: Set the namespace for the resources
-#** GLOBAL:    Convert all roles & bindings to cluster-level [true|false]
-#** PLATFORM:  Override the discovered platform, if required
-#** DRY_RUN:   Print the resources to be applied instead of applying them [true|false]
-#
-#---
-setup: setup-cluster
-# Set the namespace in the setup kustomization yaml
-	@$(call set-kustomize-namespace,$@)
-# If GLOBAL then add the versions with clusterroles and clusterrolebindings
-ifeq ($(GLOBAL), true)
-	@cd $@ || exit 1 && $(KUSTOMIZE) edit add resource ../$(RBAC)/descoped && cd - &> /dev/null;
-else
-	@cd $@ || exit 1 && $(KUSTOMIZE) edit add resource ../$(RBAC)/namespaced && cd - &> /dev/null;
-endif
-ifeq ($(PLATFORM), openshift)
-ifeq ($(GLOBAL), true)
-	@cd $@ || exit 1 && $(KUSTOMIZE) edit add resource ../$(RBAC_OS)/descoped && cd - &> /dev/null;
-else
-	@cd $@ || exit 1 && $(KUSTOMIZE) edit add resource ../$(RBAC_OS)/namespaced && cd - &> /dev/null;
-endif
-endif
-#
-# Build the resources
-# Post-process RoleBindings to fix the namespace in the refs (not yet handled by kustomize)
-# Either apply to the cluster or output to CLI
-#
-ifeq ($(DRY_RUN), false)
-	@$(KUSTOMIZE) build $(KOPTIONS) $@ | \
-		sed 's/$(PLACEHOLDER)/$(NAMESPACE)/' | \
-		kubectl apply --server-side -f -
-else
-	@$(KUSTOMIZE) build $(KOPTIONS) $@ | \
-		sed 's/$(PLACEHOLDER)/$(NAMESPACE)/'
-endif
-
-.PHONY: operator .operator-port-patch .operator-can-monitor .operator-log-level-patch
-
-#
-# Customizes the port patch
-#
-.operator-port-patch:
-	@sed -i 's/--monitoring-port=.*/--monitoring-port=$(MONITORING_PORT)/' $(MANAGER)/$(PORTS_PATCH).$(YAML)
-	@sed -i '/path:.*\/containerPort/,/- op/{s/value: .*/value: $(MONITORING_PORT)/}' $(MANAGER)/$(PORTS_PATCH).$(YAML)
-	@sed -i 's/--health-port=.*/--health-port=$(HEALTH_PORT)/' $(MANAGER)/$(PORTS_PATCH).$(YAML)
-	@sed -i '/path:.*\/httpGet\/port/,/- op/{s/value: .*/value: $(HEALTH_PORT)/}' $(MANAGER)/$(PORTS_PATCH).$(YAML)
-
-#
-# Customizes the log level patch
-#
-.operator-log-level-patch:
-	@sed -i 's/    value:.*/    value: "$(LOGGING_LEVEL)"/' $(MANAGER)/$(LOG_LEVEL_PATCH).$(YAML)
-
-.operator-can-monitor: kubectl
-	@output=$$(kubectl get crd prometheusrules.monitoring.coreos.com 2>&1) || (echo "****" && echo "**** ERROR: Montoring not available as Prometheus CRDs not installed in cluster ****" && echo "****"; exit 1)
-
-#---
-#
-#@ operator
-#
-#== Install the operator deployment and related resources.
-#
-#=== Cluster-admin privileges are required.
-#
-#* PARAMETERS:
-#** NAMESPACE:                Set the namespace to install the operator into
-#** PLATFORM:                 Override the discovered platform, if required
-#** GLOBAL:                   Set the operator to watch all namespaces for custom resources [true|false]
-#** CUSTOM_IMAGE:             Set a custom operator image name
-#** CUSTOM_VERSION:           Set a custom operator image version/tag
-#** ALWAYS_PULL_IMAGES:       Set whether to always pull the operator image [true|false]
-#** MONITORING:               Add the prometheus monitoring resources
-#** MONITORING_PORT:          Set a custom monitoring port
-#** HEALTH_PORT:              Set a custom health port
-#** LOGGING_LEVEL:            Set the level of logging [info|debug]
-#** INSTALL_DEFAULT_KAMELETS: Install the default Kamelets from catalog [true|false]
-#** DRY_RUN:                  Print the resources to be applied instead of applying them [true|false]
-#
-#---
-operator: check-admin have-platform check-crd-api-support kustomize kubectl .operator-port-patch .operator-log-level-patch
-ifeq ($(MONITORING), true)
-	@$(MAKE) -s .operator-can-monitor
-	@$(call add-remove-operator-monitoring,$@,add)
-else
-	@$(call add-remove-operator-monitoring,$@,remove)
-endif
-# Set the namespace in the operator kustomization yaml
-	@$(call set-kustomize-namespace,$@)
-# Set the image reference of the kustomization
-	@$(call set-kustomize-image,$@)
-# Set the WATCH NAMESPACE env var depending on GLOBAL var
-ifeq ($(GLOBAL), true)
-	@$(call add-remove-kind-patch,$(MANAGER),add,$(WATCH_NAMESPACE_PATCH).$(YAML),Deployment)
-else
-	@$(call add-remove-kind-patch,$(MANAGER),remove,$(WATCH_NAMESPACE_PATCH).$(YAML),Deployment)
-endif
-# Set the ALWAYS_PULL_IMAGES config depending on var
-ifeq ($(ALWAYS_PULL_IMAGES),true)
-	@$(call add-remove-kind-patch,$(MANAGER),add,$(IMAGE_PULL_POLICY_PATCH).$(YAML),Deployment)
-else
-	@$(call add-remove-kind-patch,$(MANAGER),remove,$(IMAGE_PULL_POLICY_PATCH).$(YAML),Deployment)
-endif
-# Set the PORTS depending on vars
-ifneq ($(MONITORING_PORT), 8080)
-	@$(call add-remove-kind-patch,$(MANAGER),add,$(PORTS_PATCH).$(YAML),Deployment)
-else ifneq ($(HEALTH_PORT), 8081)
-	@$(call add-remove-kind-patch,$(MANAGER),add,$(PORTS_PATCH).$(YAML),Deployment)
-endif
-# Set the Log level of the operator
-ifneq ($(LOGGING_LEVEL), info)
-	@$(call add-remove-kind-patch,$(MANAGER),add,$(LOG_LEVEL_PATCH).$(YAML),Deployment)
-else ifneq ($(LOGGING_LEVEL), 0)
-		@$(call add-remove-kind-patch,$(MANAGER),add,$(LOG_LEVEL_PATCH).$(YAML),Deployment)
-else
-	@$(call add-remove-kind-patch,$(MANAGER),remove,$(LOG_LEVEL_PATCH).$(YAML),Deployment)
-endif
-# Set the INSTALL_DEFAULT_KAMELETS config depending on var
-ifeq ($(INSTALL_DEFAULT_KAMELETS),false)
-	@$(call add-remove-kind-patch,$(MANAGER),add,$(INSTALL_DEFAULT_KAMELETS_PATCH).$(YAML),Deployment)
-else
-	@$(call add-remove-kind-patch,$(MANAGER),remove,$(INSTALL_DEFAULT_KAMELETS_PATCH).$(YAML),Deployment)
-endif
-ifeq ($(DRY_RUN), false)
-	@$(KUSTOMIZE) build $(KOPTIONS) $@ | kubectl apply -f -
-else
-	@$(KUSTOMIZE) build $(KOPTIONS) $@
-endif
-
-.PHONY: platform .platform-openshift-patch .platform-kubernetes-patch
-
-#
-# Customizes the samples patches for kubernetes
-#
-.platform-kubernetes-patch:
-	@sed -i 's/.*profile:.*/  profile: Kubernetes/' $(SAMPLES)/$(INT_PLATFORM_PATCH).$(YAML)
-
-#
-# Customizes the samples patches for openshift
-#
-.platform-openshift-patch:
-	@sed -i 's/.*profile:.*/  profile: OpenShift/' $(SAMPLES)/$(INT_PLATFORM_PATCH).$(YAML)
-
-#---
-#
-#@ platform
-#
-#== Install the integration platform.
-#
-#=== Cluster-admin privileges are required.
-#
-#* PARAMETERS:
-#** NAMESPACE: Set the namespace to install the operator into
-#** PLATFORM:  Override the discovered platform, if required
-#** DRY_RUN:   Print the resources to be applied instead of applying them [true|false]
-#
-#---
-platform: have-platform kustomize kubectl
-# Cannot be a dependency as PLATFORM could contain 'ERROR: '
-	@$(MAKE) .platform-$(PLATFORM)-patch
-# Set the namespace in the platform kustomization yaml
-	@$(call set-kustomize-namespace,$@)
-ifeq ($(DRY_RUN), false)
-	@$(KUSTOMIZE) build $(KOPTIONS) $@ | kubectl apply -f -
-else
-	@$(KUSTOMIZE) build $(KOPTIONS) $@
-endif
-
-.PHONY: example
-
-#---
-#
-#@ example
-#
-#== Install the example integration.
-#
-#* PARAMETERS:
-#** NAMESPACE: Set the namespace to install the example into
-#** PLATFORM:  Override the discovered platform, if required
-#** DRY_RUN:   Print the resources to be applied instead of applying them [true|false]
-#
-#---
-example: kubectl
-# Set the namespace in the example kustomization yaml
-	@$(call set-kustomize-namespace,$@)
-ifeq ($(DRY_RUN), false)
-	@$(KUSTOMIZE) build $(KOPTIONS) $@ | kubectl apply -f -
-else
-	@$(KUSTOMIZE) build $(KOPTIONS) $@
-endif
-
-.PHONY: uninstall
-
-#---
-#
-#@ uninstall
-#
-#== Uninstall the resources previously installed by the platform, operator, setup, and setup-cluster targets.
-#
-#=== Cluster-admin privileges are required.
-#
-#* PARAMETERS:
-#** NAMESPACE:     Set the namespace to uninstall the resources from
-#** UNINSTALL_ALL: Uninstall all Camel K resources including crds and cluster roles installed by setup-cluster [true|false]
-#** DRY_RUN:       Print the resources to be applied instead of applying them [true|false]
-#
-#---
-uninstall: kubectl
-# Set the namespace in the all target kustomization yaml
-	@$(call set-kustomize-namespace, platform)
-	@$(call set-kustomize-namespace, operator)
-	@$(call set-kustomize-namespace, setup)
-ifeq ($(UNINSTALL_ALL), true)
-	@$(call set-kustomize-namespace, setup-cluster)
-endif
-ifeq ($(DRY_RUN), false)
-	@$(KUSTOMIZE) build $(KOPTIONS) platform | kubectl delete --ignore-not-found=true -f -
-	@$(KUSTOMIZE) build $(KOPTIONS) operator | kubectl delete --ignore-not-found=true -f -
-	@$(KUSTOMIZE) build $(KOPTIONS) setup    | kubectl delete --ignore-not-found=true -f -
-ifeq ($(UNINSTALL_ALL), true)
-	@$(KUSTOMIZE) build $(KOPTIONS) setup-cluster | kubectl delete --ignore-not-found=true -f -
-endif
-else
-	@$(KUSTOMIZE) build $(KOPTIONS) platform | kubectl delete --dry-run=client -f -
-	@$(KUSTOMIZE) build $(KOPTIONS) operator | kubectl delete --dry-run=client -f -
-	@$(KUSTOMIZE) build $(KOPTIONS) setup    | kubectl delete --dry-run=client -f -
-ifeq ($(UNINSTALL_ALL), true)
-	@$(KUSTOMIZE) build $(KOPTIONS) setup-cluster | kubectl delete --dry-run=client -f -
-endif
-endif
-
-.DEFAULT_GOAL := help
-.PHONY: help
-help: ## Show this help screen.
-	@#./script/help.sh $(MAKEFILE_LIST)
-	@awk 'BEGIN { printf "\nUsage: make \033[31m<PARAM1=val1 PARAM2=val2>\033[0m \033[36m<target>\033[0m\n"; printf "\nAvailable targets are:\n" } /^#@/ { printf "\033[36m%-15s\033[0m", $$2; subdesc=0; next } /^#===/ { printf "%-14s \033[32m%s\033[0m\n", " ", substr($$0, 5); subdesc=1; next } /^#==/ { printf "\033[0m%s\033[0m\n\n", substr($$0, 4); next } /^#\*\*/ { printf "%-14s \033[31m%s\033[0m\n", " ", substr($$0, 4); next } /^#\*/ && (subdesc == 1) { printf "\n"; next } /^#\-\-\-/ { pri [...]
diff --git a/install/base/config b/install/base/config
new file mode 120000
index 000000000..82818de8a
--- /dev/null
+++ b/install/base/config
@@ -0,0 +1 @@
+../../pkg/resources/config/
\ No newline at end of file
diff --git a/install/setup/kustomization.yaml b/install/base/kustomization.yaml
similarity index 96%
rename from install/setup/kustomization.yaml
rename to install/base/kustomization.yaml
index 9598726ca..fd44ce4a6 100644
--- a/install/setup/kustomization.yaml
+++ b/install/base/kustomization.yaml
@@ -18,7 +18,9 @@ apiVersion: kustomize.config.k8s.io/v1beta1
 kind: Kustomization
 
 resources:
-- ../config/rbac
+- ./config/crd
+- ./config/rbac
+- ./config/manager
 
 transformers:
 - |-
diff --git a/install/config b/install/config
deleted file mode 120000
index 90c8cdbdc..000000000
--- a/install/config
+++ /dev/null
@@ -1 +0,0 @@
-../pkg/resources/config/
\ No newline at end of file
diff --git a/install/operator/kustomization.yaml b/install/operator/kustomization.yaml
deleted file mode 100644
index dc1a8db59..000000000
--- a/install/operator/kustomization.yaml
+++ /dev/null
@@ -1,50 +0,0 @@
-# ---------------------------------------------------------------------------
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# ---------------------------------------------------------------------------
-
-#
-# Add patches for modifying the deployment
-#
-# * patch-image-pull-policy-always.yaml
-#   modifies the image pull policy property to "Always"
-#
-# * patch-monitoring-port.yaml
-#   modifies the monitoring port
-#
-# * patch-health-port.yaml
-#   modifies the health port
-#
-# * patch-watch-namespace-global.yaml
-#   modifies the WATCH_NAMESPACE env var to wildcard for all namespaces
-#
-# * patch-toleration.yaml
-#   modifies the tolerations configuration of the deployment
-#   Edit the patch manually to add the required keys
-#
-# * patch-nodes-selector.yaml
-#   modifies the nodeSelector configuration of the deployment
-#   to bind the deployment to a particular labelled group of nodes
-#   Edit the patch manually to add the required configuration
-#
-apiVersion: kustomize.config.k8s.io/v1beta1
-kind: Kustomization
-
-resources:
-- ../config/manager
-images:
-- name: docker.io/apache/camel-k
-  newName: docker.io/apache/camel-k
-  newTag: 2.0.0-SNAPSHOT
diff --git a/pkg/resources/config/manager/patch-image-pull-policy-always.yaml b/install/overlays/kubernetes/descoped/integration-platform.yaml
similarity index 57%
copy from pkg/resources/config/manager/patch-image-pull-policy-always.yaml
copy to install/overlays/kubernetes/descoped/integration-platform.yaml
index e03b90dc7..05136f15b 100644
--- a/pkg/resources/config/manager/patch-image-pull-policy-always.yaml
+++ b/install/overlays/kubernetes/descoped/integration-platform.yaml
@@ -15,13 +15,22 @@
 # limitations under the License.
 # ---------------------------------------------------------------------------
 
-apiVersion: apps/v1
-kind: Deployment
+apiVersion: camel.apache.org/v1
+kind: IntegrationPlatform
 metadata:
-  name: camel-k-operator
+  name: camel-k
 spec:
-  template:
-    spec:
-      containers:
-        - name: camel-k-operator
-          imagePullPolicy: Always
+  build:
+    # Registry is required unless your cluster has KEP-1755 enabled and you want to use the local registry.
+    # This is a feature recommended for development purpose only.
+    # more info at https://github.com/kubernetes/enhancements/tree/master/keps/sig-cluster-lifecycle/generic/1755-communicating-a-local-registry
+    registry:
+      # For minikube local cluster you can enable one with
+      #
+      # $ minikube addons enable registry
+      #
+      # and get the value from
+      # $ kubectl -n kube-system get service registry -o jsonpath='{.spec.clusterIP}'
+      #
+      address: registry-host.io
+      insecure: true
diff --git a/install/example/kustomization.yaml b/install/overlays/kubernetes/descoped/kustomization.yaml
similarity index 84%
rename from install/example/kustomization.yaml
rename to install/overlays/kubernetes/descoped/kustomization.yaml
index 6b9541ac7..1f0e96900 100644
--- a/install/example/kustomization.yaml
+++ b/install/overlays/kubernetes/descoped/kustomization.yaml
@@ -18,4 +18,13 @@ apiVersion: kustomize.config.k8s.io/v1beta1
 kind: Kustomization
 
 resources:
-- ../config/samples/bases/camel_v1_integration.yaml
+- ../../../base
+- ../../../base/config/rbac/descoped
+- integration-platform.yaml
+
+namespace: camel-k
+
+patches:
+- path: patch-watch-namespace-global.yaml
+  target:
+    kind: Deployment
diff --git a/pkg/resources/config/manager/patch-watch-namespace-global.yaml b/install/overlays/kubernetes/descoped/patch-watch-namespace-global.yaml
similarity index 98%
rename from pkg/resources/config/manager/patch-watch-namespace-global.yaml
rename to install/overlays/kubernetes/descoped/patch-watch-namespace-global.yaml
index 626fa2b7a..69c6ae502 100644
--- a/pkg/resources/config/manager/patch-watch-namespace-global.yaml
+++ b/install/overlays/kubernetes/descoped/patch-watch-namespace-global.yaml
@@ -19,4 +19,4 @@
   path: /spec/template/spec/containers/0/env/0/valueFrom
 - op: add
   path: /spec/template/spec/containers/0/env/0/value
-  value: '""'
+  value: ""
diff --git a/pkg/resources/config/manager/patch-image-pull-policy-always.yaml b/install/overlays/kubernetes/namespaced/integration-platform.yaml
similarity index 57%
copy from pkg/resources/config/manager/patch-image-pull-policy-always.yaml
copy to install/overlays/kubernetes/namespaced/integration-platform.yaml
index e03b90dc7..05136f15b 100644
--- a/pkg/resources/config/manager/patch-image-pull-policy-always.yaml
+++ b/install/overlays/kubernetes/namespaced/integration-platform.yaml
@@ -15,13 +15,22 @@
 # limitations under the License.
 # ---------------------------------------------------------------------------
 
-apiVersion: apps/v1
-kind: Deployment
+apiVersion: camel.apache.org/v1
+kind: IntegrationPlatform
 metadata:
-  name: camel-k-operator
+  name: camel-k
 spec:
-  template:
-    spec:
-      containers:
-        - name: camel-k-operator
-          imagePullPolicy: Always
+  build:
+    # Registry is required unless your cluster has KEP-1755 enabled and you want to use the local registry.
+    # This is a feature recommended for development purpose only.
+    # more info at https://github.com/kubernetes/enhancements/tree/master/keps/sig-cluster-lifecycle/generic/1755-communicating-a-local-registry
+    registry:
+      # For minikube local cluster you can enable one with
+      #
+      # $ minikube addons enable registry
+      #
+      # and get the value from
+      # $ kubectl -n kube-system get service registry -o jsonpath='{.spec.clusterIP}'
+      #
+      address: registry-host.io
+      insecure: true
diff --git a/install/platform/kustomization.yaml b/install/overlays/kubernetes/namespaced/kustomization.yaml
similarity index 72%
rename from install/platform/kustomization.yaml
rename to install/overlays/kubernetes/namespaced/kustomization.yaml
index b425aeb51..54d318512 100644
--- a/install/platform/kustomization.yaml
+++ b/install/overlays/kubernetes/namespaced/kustomization.yaml
@@ -14,17 +14,22 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # ---------------------------------------------------------------------------
-
 apiVersion: kustomize.config.k8s.io/v1beta1
 kind: Kustomization
 
-#
-# * patch-integration-platform.yaml
-# customizes the integration platform custom resource
-# Edit the patch manually to add required configuration
-#
 resources:
-- ../config/samples/bases/camel_v1_integrationplatform.yaml
+- ../../../base
+- ../../../base/config/rbac/namespaced
+- integration-platform.yaml
+
+namespace: default
 
-patchesStrategicMerge:
-- ../config/samples/patch-integration-platform.yaml
+# You can provide any required adjustement here. Take the following as references:
+# patchesStrategicMerge:
+# - patch-toleration.yaml
+# - patch-node-selector.yaml
+# - patch-resource-requirements.yaml
+# patches:
+# - path: patch-log-level.yaml
+#   target:
+#     kind: Deployment
\ No newline at end of file
diff --git a/pkg/resources/config/manager/patch-image-pull-policy-always.yaml b/install/overlays/kubernetes/namespaced/patch-image-pull-policy-always.yaml
similarity index 100%
rename from pkg/resources/config/manager/patch-image-pull-policy-always.yaml
rename to install/overlays/kubernetes/namespaced/patch-image-pull-policy-always.yaml
diff --git a/pkg/resources/config/manager/patch-install-default-kamelets.yaml b/install/overlays/kubernetes/namespaced/patch-install-default-kamelets.yaml
similarity index 100%
rename from pkg/resources/config/manager/patch-install-default-kamelets.yaml
rename to install/overlays/kubernetes/namespaced/patch-install-default-kamelets.yaml
diff --git a/pkg/resources/config/manager/patch-log-level.yaml b/install/overlays/kubernetes/namespaced/patch-log-level.yaml
similarity index 100%
rename from pkg/resources/config/manager/patch-log-level.yaml
rename to install/overlays/kubernetes/namespaced/patch-log-level.yaml
diff --git a/pkg/resources/config/manager/patch-node-selector.yaml b/install/overlays/kubernetes/namespaced/patch-node-selector.yaml
similarity index 100%
rename from pkg/resources/config/manager/patch-node-selector.yaml
rename to install/overlays/kubernetes/namespaced/patch-node-selector.yaml
diff --git a/pkg/resources/config/manager/patch-ports.yaml b/install/overlays/kubernetes/namespaced/patch-ports.yaml
similarity index 100%
rename from pkg/resources/config/manager/patch-ports.yaml
rename to install/overlays/kubernetes/namespaced/patch-ports.yaml
diff --git a/pkg/resources/config/manager/patch-resource-requirements.yaml b/install/overlays/kubernetes/namespaced/patch-resource-requirements.yaml
similarity index 100%
rename from pkg/resources/config/manager/patch-resource-requirements.yaml
rename to install/overlays/kubernetes/namespaced/patch-resource-requirements.yaml
diff --git a/pkg/resources/config/manager/patch-toleration.yaml b/install/overlays/kubernetes/namespaced/patch-toleration.yaml
similarity index 100%
rename from pkg/resources/config/manager/patch-toleration.yaml
rename to install/overlays/kubernetes/namespaced/patch-toleration.yaml
diff --git a/install/script/Makefile b/install/script/Makefile
deleted file mode 120000
index d89e34fe5..000000000
--- a/install/script/Makefile
+++ /dev/null
@@ -1 +0,0 @@
-../../script/Makefile
\ No newline at end of file
diff --git a/install/script/check_crd_api_support.sh b/install/script/check_crd_api_support.sh
deleted file mode 120000
index 3d144aabd..000000000
--- a/install/script/check_crd_api_support.sh
+++ /dev/null
@@ -1 +0,0 @@
-../../script/check_crd_api_support.sh
\ No newline at end of file
diff --git a/install/script/check_platform.sh b/install/script/check_platform.sh
deleted file mode 120000
index 329d24665..000000000
--- a/install/script/check_platform.sh
+++ /dev/null
@@ -1 +0,0 @@
-../../script/check_platform.sh
\ No newline at end of file
diff --git a/install/script/help.sh b/install/script/help.sh
deleted file mode 100755
index c79347664..000000000
--- a/install/script/help.sh
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/bin/bash
-
-# ---------------------------------------------------------------------------
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# ---------------------------------------------------------------------------
-
-
-awk 'BEGIN {
-      printf "\nUsage: make \033[31m<PARAM1=val1 PARAM2=val2>\033[0m \033[36m<target>\033[0m\n"
-      printf "\nAvailable targets are:\n"
-    }
-    /^#@/ { printf "\033[36m%-15s\033[0m", $2; subdesc=0; next }
-    /^#===/ { printf "%-14s \033[32m%s\033[0m\n", " ", substr($0, 5); subdesc=1; next }
-    /^#==/ { printf "\033[0m%s\033[0m\n\n", substr($0, 4); next }
-    /^#\*\*/ { printf "%-14s \033[31m%s\033[0m\n", " ", substr($0, 4); next }
-    /^#\*/ && (subdesc == 1) { printf "\n"; next }
-    /^#\-\-\-/ { printf "\n"; next }' ${1}
diff --git a/install/setup-cluster/kustomization.yaml b/install/setup-cluster/kustomization.yaml
deleted file mode 100644
index cfce7838b..000000000
--- a/install/setup-cluster/kustomization.yaml
+++ /dev/null
@@ -1,22 +0,0 @@
-# ---------------------------------------------------------------------------
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# ---------------------------------------------------------------------------
-apiVersion: kustomize.config.k8s.io/v1beta1
-kind: Kustomization
-
-resources:
-- ../config/crd
-- ../config/rbac/user-cluster-role.yaml
diff --git a/pkg/resources/config/manager/kustomization.yaml b/pkg/resources/config/manager/kustomization.yaml
index 38c67427f..895978ab4 100644
--- a/pkg/resources/config/manager/kustomization.yaml
+++ b/pkg/resources/config/manager/kustomization.yaml
@@ -21,12 +21,3 @@ kind: Kustomization
 resources:
 - operator-deployment.yaml
 - operator-service-account.yaml
-
-patchesStrategicMerge:
-- patch-toleration.yaml
-- patch-node-selector.yaml
-- patch-resource-requirements.yaml
-patches:
-- path: patch-log-level.yaml
-  target:
-    kind: Deployment
diff --git a/pkg/resources/config/manifests/kustomization.yaml b/pkg/resources/config/manifests/kustomization.yaml
index 7c6754326..bd94db03f 100644
--- a/pkg/resources/config/manifests/kustomization.yaml
+++ b/pkg/resources/config/manifests/kustomization.yaml
@@ -33,7 +33,6 @@ resources:
 
 patchesStrategicMerge:
 - patch-delete-user-cluster-role.yaml
-- patch-delete-pvc.yaml
 images:
 - name: docker.io/apache/camel-k
   newName: docker.io/apache/camel-k
diff --git a/pkg/resources/config/manifests/patch-delete-pvc.yaml b/pkg/resources/config/manifests/patch-delete-pvc.yaml
deleted file mode 100644
index ef4d9825a..000000000
--- a/pkg/resources/config/manifests/patch-delete-pvc.yaml
+++ /dev/null
@@ -1,28 +0,0 @@
-# ---------------------------------------------------------------------------
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# ---------------------------------------------------------------------------
-
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: camel-k-operator
-spec:
-  template:
-    spec:
-      containers:
-        - name: camel-k-operator
-          volumeMounts: null
-      volumes: null
diff --git a/pkg/resources/config/rbac/descoped/operator-cluster-role-binding-events.yaml b/pkg/resources/config/rbac/descoped/operator-cluster-role-binding-events.yaml
index 9dd5228d2..abc12cf9b 100644
--- a/pkg/resources/config/rbac/descoped/operator-cluster-role-binding-events.yaml
+++ b/pkg/resources/config/rbac/descoped/operator-cluster-role-binding-events.yaml
@@ -24,7 +24,6 @@ metadata:
 subjects:
 - kind: ServiceAccount
   name: camel-k-operator
-  namespace: placeholder
 roleRef:
   kind: ClusterRole
   name: camel-k-operator-events
diff --git a/pkg/resources/config/rbac/descoped/operator-cluster-role-binding-keda.yaml b/pkg/resources/config/rbac/descoped/operator-cluster-role-binding-keda.yaml
index 92e154e87..5ee70de10 100644
--- a/pkg/resources/config/rbac/descoped/operator-cluster-role-binding-keda.yaml
+++ b/pkg/resources/config/rbac/descoped/operator-cluster-role-binding-keda.yaml
@@ -24,7 +24,6 @@ metadata:
 subjects:
 - kind: ServiceAccount
   name: camel-k-operator
-  namespace: placeholder
 roleRef:
   kind: ClusterRole
   name: camel-k-operator-keda
diff --git a/pkg/resources/config/rbac/descoped/operator-cluster-role-binding-knative.yaml b/pkg/resources/config/rbac/descoped/operator-cluster-role-binding-knative.yaml
index 739b0dd06..717ea682d 100644
--- a/pkg/resources/config/rbac/descoped/operator-cluster-role-binding-knative.yaml
+++ b/pkg/resources/config/rbac/descoped/operator-cluster-role-binding-knative.yaml
@@ -24,7 +24,6 @@ metadata:
 subjects:
 - kind: ServiceAccount
   name: camel-k-operator
-  namespace: placeholder
 roleRef:
   kind: ClusterRole
   name: camel-k-operator-knative
diff --git a/pkg/resources/config/rbac/descoped/operator-cluster-role-binding-leases.yaml b/pkg/resources/config/rbac/descoped/operator-cluster-role-binding-leases.yaml
index 35d667fd1..84099b3d1 100644
--- a/pkg/resources/config/rbac/descoped/operator-cluster-role-binding-leases.yaml
+++ b/pkg/resources/config/rbac/descoped/operator-cluster-role-binding-leases.yaml
@@ -24,7 +24,6 @@ metadata:
 subjects:
 - kind: ServiceAccount
   name: camel-k-operator
-  namespace: placeholder
 roleRef:
   kind: ClusterRole
   name: camel-k-operator-leases
diff --git a/pkg/resources/config/rbac/descoped/operator-cluster-role-binding-podmonitors.yaml b/pkg/resources/config/rbac/descoped/operator-cluster-role-binding-podmonitors.yaml
index bef231b07..a8cee53ea 100644
--- a/pkg/resources/config/rbac/descoped/operator-cluster-role-binding-podmonitors.yaml
+++ b/pkg/resources/config/rbac/descoped/operator-cluster-role-binding-podmonitors.yaml
@@ -24,7 +24,6 @@ metadata:
 subjects:
 - kind: ServiceAccount
   name: camel-k-operator
-  namespace: placeholder
 roleRef:
   kind: ClusterRole
   name: camel-k-operator-podmonitors
diff --git a/pkg/resources/config/rbac/descoped/operator-cluster-role-binding-strimzi.yaml b/pkg/resources/config/rbac/descoped/operator-cluster-role-binding-strimzi.yaml
index fefd14352..876c161ec 100644
--- a/pkg/resources/config/rbac/descoped/operator-cluster-role-binding-strimzi.yaml
+++ b/pkg/resources/config/rbac/descoped/operator-cluster-role-binding-strimzi.yaml
@@ -24,7 +24,6 @@ metadata:
 subjects:
 - kind: ServiceAccount
   name: camel-k-operator
-  namespace: placeholder
 roleRef:
   kind: ClusterRole
   name: camel-k-operator-strimzi
diff --git a/pkg/resources/config/rbac/descoped/operator-cluster-role-binding.yaml b/pkg/resources/config/rbac/descoped/operator-cluster-role-binding.yaml
index 83f227d62..0d6f587a1 100644
--- a/pkg/resources/config/rbac/descoped/operator-cluster-role-binding.yaml
+++ b/pkg/resources/config/rbac/descoped/operator-cluster-role-binding.yaml
@@ -24,7 +24,6 @@ metadata:
 subjects:
 - kind: ServiceAccount
   name: camel-k-operator
-  namespace: placeholder
 roleRef:
   kind: ClusterRole
   name: camel-k-operator