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

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


The following commit(s) were added to refs/heads/v3 by this push:
     new 6321f62e9 Fix #6895: move multi namespace installation to a new page
6321f62e9 is described below

commit 6321f62e94baff0321469e1899da0734035ae969
Author: iamcipherdev <[email protected]>
AuthorDate: Tue Oct 20 08:36:13 2026 +0000

    Fix #6895: move multi namespace installation to a new page
    
    The Kustomize/OLM/Helm multi-namespace installation procedures are moved
    from installation.adoc to a dedicated installation/multi-namespace.adoc
    page, linked from the installation topology section and added to the
    Antora nav.
---
 docs/modules/ROOT/nav.adoc                         |   1 +
 .../ROOT/pages/installation/installation.adoc      |   2 +
 .../ROOT/pages/installation/multi-namespace.adoc   | 165 +++++++++++++++++++++
 3 files changed, 168 insertions(+)

diff --git a/docs/modules/ROOT/nav.adoc b/docs/modules/ROOT/nav.adoc
index dcbf710d4..e1b2e55a6 100644
--- a/docs/modules/ROOT/nav.adoc
+++ b/docs/modules/ROOT/nav.adoc
@@ -8,6 +8,7 @@
 ** xref:installation/cert-manager.adoc[Configure Cert-Manager]
 ** xref:installation/keda.adoc[Configure Keda]
 ** xref:installation/knative.adoc[Configure Knative]
+** xref:installation/multi-namespace.adoc[Multi namespace installation]
 ** xref:installation/upgrade.adoc[Upgrade]
 ** xref:installation/uninstalling.adoc[Uninstalling]
 ** xref:installation/advanced/advanced.adoc[Advanced]
diff --git a/docs/modules/ROOT/pages/installation/installation.adoc 
b/docs/modules/ROOT/pages/installation/installation.adoc
index 8fdfd9643..05d1ac351 100644
--- a/docs/modules/ROOT/pages/installation/installation.adoc
+++ b/docs/modules/ROOT/pages/installation/installation.adoc
@@ -56,6 +56,8 @@ It's important to notice that when running the single or 
multiple namespace oper
 
 NOTE: RBAC custom configuration may vary depending on the installation 
methodology.
 
+For installation procedures where the operator watches multiple namespaces, 
see xref:installation/multi-namespace.adoc[Multi namespace installation].
+
 [[bootstrap-configuration]]
 == Setup the operator configuration
 
diff --git a/docs/modules/ROOT/pages/installation/multi-namespace.adoc 
b/docs/modules/ROOT/pages/installation/multi-namespace.adoc
new file mode 100644
index 000000000..fed3dcfe4
--- /dev/null
+++ b/docs/modules/ROOT/pages/installation/multi-namespace.adoc
@@ -0,0 +1,165 @@
+= Multi namespace installation
+
+A multi namespace operator is installed in one namespace and watches multiple 
tenant namespaces. The procedures below cover the supported installation 
methods.
+
+[[multi-namespace-kustomize]]
+== Install a multi namespace operator with Kustomize
+
+The repository includes a complete Kustomize example for an operator installed 
in one namespace and watching two tenant namespaces. The `multi-namespace` 
overlay installs the operator in `operators`, configures `WATCH_NAMESPACE` to 
`tenant-a,tenant-b`, and grants the operator's ServiceAccount the required 
namespaced permissions in both tenant namespaces. The operator also watches its 
own `operators` namespace for the resources it manages there.
+
+The overlay does not create namespaces. Create the operator and tenant 
namespaces before applying it:
+
+[source,shell script]
+----
+$ kubectl create namespace operators
+$ kubectl create namespace tenant-a
+$ kubectl create namespace tenant-b
+----
+
+Apply the overlay for the Camel K version you want to install:
+
+[subs=attributes+]
+----
+$ kubectl apply -k 
github.com/apache/camel-k/install/overlays/multi-namespace?ref=v{last-released-version}
 --server-side
+----
+
+The example creates the `camel-k-operator-tenant-ab` ServiceAccount in 
`operators`. Each tenant RoleBinding points to that ServiceAccount across 
namespaces, so the binding must be installed in every namespace listed in 
`WATCH_NAMESPACE`. Granting the operator access to only one tenant namespace 
will leave it unable to reconcile resources in the other namespaces.
+
+Verify the deployment, watched namespaces, and cross-namespace RoleBinding:
+
+[source,shell script]
+----
+$ kubectl -n operators get deployment camel-k-operator-tenant-ab
+$ kubectl -n operators get deployment camel-k-operator-tenant-ab \
+    -o 
jsonpath='{.spec.template.spec.containers[0].env[?(@.name=="WATCH_NAMESPACE")].value}{"\n"}'
+tenant-a,tenant-b
+$ kubectl -n tenant-a get rolebinding camel-k-operator-tenant-a \
+    -o jsonpath='{.subjects[0].namespace}/{.subjects[0].name}{"\n"}'
+operators/camel-k-operator-tenant-ab
+----
+
+The overlay is a two-tenant example. To use different namespaces, copy the 
`tenant-a-ns-rbac` and `tenant-b-ns-rbac` overlay directories, change each 
`namespace` and `nameSuffix`, update the `WATCH_NAMESPACE` value in 
`operator/patch-envvars.yaml`, and add the new directories to the top-level 
`kustomization.yaml`. Keep the RoleBinding subject namespace set to `operators` 
(or change it together with the operator namespace) and keep its ServiceAccount 
name aligned with the operator Deployment.
+
+[[multi-namespace-olm]]
+== Install a multi namespace operator with OLM
+
+The Camel K ClusterServiceVersion supports the OLM `MultiNamespace` install 
mode. In this mode, the `OperatorGroup` selects the tenant namespaces and OLM 
creates the required namespaced RBAC for the operator ServiceAccount. The 
operator namespace is the namespace where the `Subscription`, `OperatorGroup`, 
and operator Deployment are installed.
+
+Create the operator and tenant namespaces first:
+
+[source,shell script]
+----
+$ kubectl create namespace operators
+$ kubectl create namespace tenant-a
+$ kubectl create namespace tenant-b
+----
+
+Create an `OperatorGroup` in the operator namespace. An OLM namespace can have 
only one `OperatorGroup`; edit the existing group instead of creating a second 
one when necessary:
+
+[source,yaml]
+----
+apiVersion: operators.coreos.com/v1
+kind: OperatorGroup
+metadata:
+  name: camel-k-multi
+  namespace: operators
+spec:
+  targetNamespaces:
+  - tenant-a
+  - tenant-b
+----
+
+Apply the group, then create the Camel K subscription from OperatorHub:
+
+[source,shell script]
+----
+$ kubectl apply -f operatorgroup.yaml
+$ curl -fsSL https://operatorhub.io/install/camel-k.yaml | kubectl apply -f -
+----
+
+The OperatorHub manifest creates a `Subscription` in `operators` using the 
`stable-v2` channel and the `operatorhubio-catalog` CatalogSource. If your 
cluster uses another catalog, keep the same `MultiNamespace` OperatorGroup and 
change the Subscription's `source` and `sourceNamespace` to match that catalog.
+
+Wait for the CSV to succeed and verify the selected namespaces:
+
+[source,shell script]
+----
+$ kubectl -n operators get csv
+$ kubectl -n operators get operatorgroup camel-k-multi \
+    -o jsonpath='{.spec.targetNamespaces[*]}{"\n"}'
+tenant-a tenant-b
+----
+
+The operator should now reconcile Integrations in both `tenant-a` and 
`tenant-b`, while an Integration in an unlisted namespace remains outside this 
OperatorGroup's scope.
+
+[[multi-namespace-helm]]
+== Install a multi namespace operator with Helm
+
+The Helm chart currently exposes two watch modes: the release namespace 
(`operator.global=false`) and all namespaces (`operator.global=true`). It does 
not accept a static comma-separated namespace list. To run a Helm-installed 
operator for selected namespaces, install the chart in the operator namespace 
and apply a small RBAC overlay for every tenant namespace.
+
+Install the chart using `camel-k` as the release name so the resource names 
below match the commands:
+
+[source,shell script]
+----
+$ helm repo add camel-k https://apache.github.io/camel-k/charts/
+$ helm repo update
+$ kubectl create namespace operators
+$ kubectl create namespace tenant-a
+$ kubectl create namespace tenant-b
+$ helm install camel-k camel-k/camel-k -n operators \
+    --set operator.global=false \
+    --set operator.env[0].name=REGISTRY_ADDRESS \
+    --set operator.env[0].value=<my-registry-address>
+----
+
+Set the watched namespaces on the chart-created Deployment:
+
+[source,shell script]
+----
+$ kubectl -n operators set env deployment/camel-k-operator \
+    WATCH_NAMESPACE=tenant-a,tenant-b
+----
+
+The chart's namespaced RBAC is scoped to `operators`. Create one small 
Kustomize overlay per tenant. You can use 
`install/overlays/multi-namespace/tenant-a-ns-rbac/` and `tenant-b-ns-rbac/` as 
templates, or use this equivalent overlay (replace `<tenant-namespace>` for 
each tenant):
+
+[source,yaml]
+----
+apiVersion: kustomize.config.k8s.io/v1beta1
+kind: Kustomization
+namespace: <tenant-namespace>
+resources:
+- 
github.com/apache/camel-k//pkg/resources/config/rbac/namespaced?ref=v{last-released-version}
+patches:
+- target:
+    kind: RoleBinding
+  patch: |-
+    - op: add
+      path: /subjects/0/namespace
+      value: operators
+    - op: replace
+      path: /subjects/0/name
+      value: camel-k-operator
+----
+
+The patch points every namespaced RoleBinding at `operators/camel-k-operator`, 
the ServiceAccount created by this Helm release. Save the overlay once for 
`tenant-a` and once for `tenant-b`, changing only `namespace` and the output 
directory.
+
+Apply each tenant overlay after the Helm release:
+
+[source,shell script]
+----
+$ kubectl apply -k ./camel-k-multi-namespace/tenant-a-ns-rbac --server-side
+$ kubectl apply -k ./camel-k-multi-namespace/tenant-b-ns-rbac --server-side
+----
+
+Verify the Deployment setting and the cross-namespace permission before 
creating an Integration:
+
+[source,shell script]
+----
+$ kubectl -n operators get deployment camel-k-operator \
+    -o 
jsonpath='{.spec.template.spec.containers[0].env[?(@.name=="WATCH_NAMESPACE")].value}{"\n"}'
+tenant-a,tenant-b
+$ kubectl auth can-i --as=system:serviceaccount:operators:camel-k-operator \
+    -n tenant-a get integrations.camel.apache.org
+yes
+----
+
+Repeat the Deployment patch and re-apply the tenant overlays after a Helm 
upgrade, or maintain them as a Helm post-renderer. This keeps the chart release 
and the manually managed tenant RBAC in sync.
\ No newline at end of file

Reply via email to