Unverified Commit ae53d7c4 authored by Julien Mancuso's avatar Julien Mancuso Committed by GitHub
Browse files

feat: deprecated namespace-restricted mode (#7907)

parent 46070b36
...@@ -118,11 +118,14 @@ The chart includes built-in validation to prevent all operator conflicts: ...@@ -118,11 +118,14 @@ The chart includes built-in validation to prevent all operator conflicts:
| dynamo-operator.etcdAddr | string | `""` | etcd server address for an external etcd instance. Only needed when using external etcd without the bundled subchart. Format: "http://hostname:port" or "https://hostname:port" | | dynamo-operator.etcdAddr | string | `""` | etcd server address for an external etcd instance. Only needed when using external etcd without the bundled subchart. Format: "http://hostname:port" or "https://hostname:port" |
| dynamo-operator.nats.enabled | bool | `true` | Whether the NATS is enabled | | dynamo-operator.nats.enabled | bool | `true` | Whether the NATS is enabled |
| dynamo-operator.modelExpressURL | string | `""` | URL for the Model Express server if not deployed by this helm chart. This is ignored if Model Express server is installed by this helm chart (global.model-express.enabled is true). | | dynamo-operator.modelExpressURL | string | `""` | URL for the Model Express server if not deployed by this helm chart. This is ignored if Model Express server is installed by this helm chart (global.model-express.enabled is true). |
| dynamo-operator.namespaceRestriction | object | `{"enabled":false,"lease":{"duration":"30s","renewInterval":"10s"},"targetNamespace":null}` | Namespace access controls for the operator | | dynamo-operator.namespaceRestriction | object | `{"enabled":false,"lease":{"duration":"30s","renewInterval":"10s"},"targetNamespace":null}` | DEPRECATED: Namespace-restricted mode is deprecated and will be removed in a future release. Use cluster-wide mode (the default) instead. Do not enable this for new deployments. |
| dynamo-operator.namespaceRestriction.enabled | bool | `false` | Whether to restrict operator to specific namespaces. By default, the operator will run with cluster-wide permissions. Only 1 instance of the operator should be deployed in the cluster. If you want to deploy multiple operator instances, you can set this to true and specify the target namespace (by default, the target namespace is the helm release namespace). | | dynamo-operator.namespaceRestriction.enabled | bool | `false` | DEPRECATED: Do not enable for new deployments. Namespace-restricted mode is deprecated. |
| dynamo-operator.namespaceRestriction.targetNamespace | string | `nil` | Target namespace for operator deployment (leave empty for current namespace) | | dynamo-operator.namespaceRestriction.targetNamespace | string | `nil` | DEPRECATED: Only used in namespace-restricted mode, which is deprecated. |
| dynamo-operator.gpuDiscovery | object | `{"enabled":true}` | GPU discovery configuration (only applies when namespaceRestriction.enabled=true) | | dynamo-operator.namespaceRestriction.lease | object | `{"duration":"30s","renewInterval":"10s"}` | DEPRECATED: Only used in namespace-restricted mode, which is deprecated. |
| dynamo-operator.gpuDiscovery.enabled | bool | `true` | Whether to provision a ClusterRole for the namespace-scoped operator to read GPU node labels. When true (default), Helm creates a ClusterRole/ClusterRoleBinding granting node read access. Set to false if your installer lacks ClusterRole creation permissions. | | dynamo-operator.namespaceRestriction.lease.duration | string | `"30s"` | DEPRECATED: Lease duration for namespace-restricted mode, which is deprecated. |
| dynamo-operator.namespaceRestriction.lease.renewInterval | string | `"10s"` | DEPRECATED: Lease renew interval for namespace-restricted mode, which is deprecated. |
| dynamo-operator.gpuDiscovery | object | `{"enabled":true}` | DEPRECATED: GPU discovery for namespace-scoped operators is deprecated along with namespace-restricted mode. |
| dynamo-operator.gpuDiscovery.enabled | bool | `true` | DEPRECATED: Only relevant when namespaceRestriction is enabled, which is deprecated. |
| dynamo-operator.controllerManager.tolerations | list | `[]` | Node tolerations for controller manager pods | | dynamo-operator.controllerManager.tolerations | list | `[]` | Node tolerations for controller manager pods |
| dynamo-operator.controllerManager.affinity | object | `{}` | Affinity for controller manager pods | | dynamo-operator.controllerManager.affinity | object | `{}` | Affinity for controller manager pods |
| dynamo-operator.controllerManager.leaderElection.id | string | `""` | Leader election ID for cluster-wide coordination. WARNING: All cluster-wide operators must use the SAME ID to prevent split-brain. Different IDs would allow multiple leaders simultaneously. | | dynamo-operator.controllerManager.leaderElection.id | string | `""` | Leader election ID for cluster-wide coordination. WARNING: All cluster-wide operators must use the SAME ID to prevent split-brain. Different IDs would allow multiple leaders simultaneously. |
......
...@@ -24,27 +24,21 @@ upgradeCRD: true ...@@ -24,27 +24,21 @@ upgradeCRD: true
# Environment variables to pass to operator Deployment. # Environment variables to pass to operator Deployment.
env: [] env: []
# Namespace restriction configuration for the operator # -- DEPRECATED: Namespace-restricted mode is deprecated and will be removed in a future release. Use cluster-wide mode (the default) instead. Do not enable this for new deployments.
# If enabled: true and targetNamespace is empty, the operator will be restricted to the release namespace
# If enabled: true and targetNamespace is set, the operator will be restricted to the specified namespace
# If enabled: false, the operator will run with cluster-wide permissions
namespaceRestriction: namespaceRestriction:
# Whether to restrict the operator to a single namespace # -- DEPRECATED: Do not enable for new deployments. Namespace-restricted mode is deprecated.
enabled: false enabled: false
# The target namespace to restrict to. If empty, defaults to the release namespace # -- DEPRECATED: Only used in namespace-restricted mode, which is deprecated.
targetNamespace: "" targetNamespace: ""
# Namespace scope marker lease configuration (used to prevent conflicts when running both cluster-wide and namespace-restricted operators) # -- DEPRECATED: Only used in namespace-restricted mode, which is deprecated.
lease: lease:
# Duration before the namespace scope marker lease expires if not renewed (namespace-restricted mode only). When a namespace-restricted operator is running, it creates a lease in its namespace. The cluster-wide operator detects this lease and excludes that namespace from processing. If the namespace operator stops renewing the lease (e.g., crashes), the lease expires and the cluster-wide operator automatically resumes processing that namespace. # -- DEPRECATED: Lease duration for namespace-restricted mode, which is deprecated.
duration: 30s duration: 30s
# Interval for renewing the namespace scope marker lease (namespace-restricted mode only). The namespace-restricted operator renews its lease at this interval to signal it's still running. # -- DEPRECATED: Lease renew interval for namespace-restricted mode, which is deprecated.
renewInterval: 10s renewInterval: 10s
# -- GPU discovery configuration (only applies when namespaceRestriction.enabled=true) # -- DEPRECATED: GPU discovery for namespace-scoped operators is deprecated along with namespace-restricted mode.
gpuDiscovery: gpuDiscovery:
# -- Whether to provision a ClusterRole for the namespace-scoped operator to read GPU node labels. # -- DEPRECATED: Only relevant when namespaceRestriction is enabled, which is deprecated.
# When true (default), Helm creates a ClusterRole/ClusterRoleBinding granting node read access.
# Set to false if your installer lacks ClusterRole creation permissions; you must then provide
# hardware config manually in each DynamoGraphDeploymentRequest.
enabled: true enabled: true
controllerManager: controllerManager:
tolerations: [] tolerations: []
......
...@@ -14,6 +14,23 @@ ...@@ -14,6 +14,23 @@
# limitations under the License. # limitations under the License.
{{- $operatorValues := index .Values "dynamo-operator" }} {{- $operatorValues := index .Values "dynamo-operator" }}
{{- if $operatorValues.namespaceRestriction.enabled }}
================================================================================
DEPRECATION WARNING
================================================================================
Namespace-restricted mode (namespaceRestriction.enabled=true) is DEPRECATED
and will be removed in a future release.
The operator is configured for namespace: {{ default .Release.Namespace $operatorValues.namespaceRestriction.targetNamespace }}
Please migrate to cluster-wide mode by removing the namespaceRestriction
configuration from your values.
See: https://github.com/ai-dynamo/dynamo/blob/main/docs/kubernetes/installation-guide.md
================================================================================
{{- end }}
{{- if and $operatorValues.namespaceRestriction.enabled $operatorValues.gpuDiscovery.enabled }} {{- if and $operatorValues.namespaceRestriction.enabled $operatorValues.gpuDiscovery.enabled }}
GPU Discovery: ENABLED — the operator will automatically detect GPU hardware from cluster nodes. GPU Discovery: ENABLED — the operator will automatically detect GPU hardware from cluster nodes.
{{- else if $operatorValues.namespaceRestriction.enabled }} {{- else if $operatorValues.namespaceRestriction.enabled }}
......
...@@ -69,24 +69,22 @@ dynamo-operator: ...@@ -69,24 +69,22 @@ dynamo-operator:
# -- URL for the Model Express server if not deployed by this helm chart. This is ignored if Model Express server is installed by this helm chart (global.model-express.enabled is true). # -- URL for the Model Express server if not deployed by this helm chart. This is ignored if Model Express server is installed by this helm chart (global.model-express.enabled is true).
modelExpressURL: "" modelExpressURL: ""
# -- Namespace access controls for the operator # -- DEPRECATED: Namespace-restricted mode is deprecated and will be removed in a future release. Use cluster-wide mode (the default) instead. Do not enable this for new deployments.
namespaceRestriction: namespaceRestriction:
# -- Whether to restrict operator to specific namespaces. By default, the operator will run with cluster-wide permissions. Only 1 instance of the operator should be deployed in the cluster. If you want to deploy multiple operator instances, you can set this to true and specify the target namespace (by default, the target namespace is the helm release namespace). # -- DEPRECATED: Do not enable for new deployments. Namespace-restricted mode is deprecated.
enabled: false enabled: false
# -- Target namespace for operator deployment (leave empty for current namespace) # -- DEPRECATED: Only used in namespace-restricted mode, which is deprecated.
targetNamespace: targetNamespace:
# Namespace scope marker lease configuration (used to prevent conflicts when running both cluster-wide and namespace-restricted operators) # -- DEPRECATED: Only used in namespace-restricted mode, which is deprecated.
lease: lease:
# Duration before the namespace scope marker lease expires if not renewed (namespace-restricted mode only). When a namespace-restricted operator is running, it creates a lease in its namespace. The cluster-wide operator detects this lease and excludes that namespace from processing. If the namespace operator stops renewing the lease (e.g., crashes), the lease expires and the cluster-wide operator automatically resumes processing that namespace. # -- DEPRECATED: Lease duration for namespace-restricted mode, which is deprecated.
duration: 30s duration: 30s
# Interval for renewing the namespace scope marker lease (namespace-restricted mode only). The namespace-restricted operator renews its lease at this interval to signal it's still running. # -- DEPRECATED: Lease renew interval for namespace-restricted mode, which is deprecated.
renewInterval: 10s renewInterval: 10s
# -- GPU discovery configuration (only applies when namespaceRestriction.enabled=true) # -- DEPRECATED: GPU discovery for namespace-scoped operators is deprecated along with namespace-restricted mode.
gpuDiscovery: gpuDiscovery:
# -- Whether to provision a ClusterRole for the namespace-scoped operator to read GPU node labels. # -- DEPRECATED: Only relevant when namespaceRestriction is enabled, which is deprecated.
# When true (default), Helm creates a ClusterRole/ClusterRoleBinding granting node read access.
# Set to false if your installer lacks ClusterRole creation permissions.
enabled: true enabled: true
# -- The Dynamo discovery backend to use. Default is "kubernetes" for Kubernetes API service discovery. Set to "etcd" to use ETCD for discovery. -- # -- The Dynamo discovery backend to use. Default is "kubernetes" for Kubernetes API service discovery. Set to "etcd" to use ETCD for discovery. --
......
...@@ -35,6 +35,11 @@ issues: ...@@ -35,6 +35,11 @@ issues:
linters: linters:
- lll - lll
- nakedret - nakedret
# Intentional internal usage of deprecated namespace-restricted mode fields/packages.
# The feature is soft-deprecated (still functional) so internal references are expected.
- linters:
- staticcheck
text: "SA1019:.*deprecated.*namespace"
linters: linters:
disable-all: true disable-all: true
enable: enable:
......
...@@ -145,13 +145,15 @@ type LeaderElectionConfiguration struct { ...@@ -145,13 +145,15 @@ type LeaderElectionConfiguration struct {
// NamespaceConfiguration determines operator namespace mode. // NamespaceConfiguration determines operator namespace mode.
type NamespaceConfiguration struct { type NamespaceConfiguration struct {
// Restricted is the namespace to restrict to. Empty = cluster-wide mode. // Deprecated: Namespace-restricted mode is deprecated and will be removed in a future release.
// Use cluster-wide mode (leave Restricted empty) instead.
Restricted string `json:"restricted"` Restricted string `json:"restricted"`
// Scope holds namespace scope lease settings (namespace-restricted mode only) // Deprecated: Scope is only used in namespace-restricted mode, which is deprecated.
Scope NamespaceScopeConfiguration `json:"scope"` Scope NamespaceScopeConfiguration `json:"scope"`
} }
// NamespaceScopeConfiguration holds lease settings for namespace-restricted mode. // Deprecated: NamespaceScopeConfiguration is used only by the deprecated namespace-restricted
// mode and will be removed in a future release.
type NamespaceScopeConfiguration struct { type NamespaceScopeConfiguration struct {
// LeaseDuration is the duration of namespace scope marker lease before expiration // LeaseDuration is the duration of namespace scope marker lease before expiration
// +kubebuilder:default="30s" // +kubebuilder:default="30s"
......
...@@ -26,6 +26,7 @@ import ( ...@@ -26,6 +26,7 @@ import (
"fmt" "fmt"
"net/http" "net/http"
"os" "os"
"strings"
"time" "time"
// Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.) // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.)
...@@ -262,6 +263,16 @@ func main() { ...@@ -262,6 +263,16 @@ func main() {
restrictedNamespace: {}, restrictedNamespace: {},
} }
setupLog.Info("Restricted namespace configured, launching in restricted mode", "namespace", restrictedNamespace) setupLog.Info("Restricted namespace configured, launching in restricted mode", "namespace", restrictedNamespace)
banner := strings.Repeat("=", 80)
setupLog.Error(nil, banner)
setupLog.Error(nil, "DEPRECATION WARNING: Namespace-restricted mode is deprecated "+
"and will be removed in a future release.")
setupLog.Error(nil, "The operator is running in namespace-restricted mode",
"namespace", restrictedNamespace)
setupLog.Error(nil, "Please migrate to cluster-wide mode "+
"by removing the namespaceRestriction configuration.")
setupLog.Error(nil, banner)
} else { } else {
setupLog.Info("No restricted namespace configured, launching in cluster-wide mode") setupLog.Info("No restricted namespace configured, launching in cluster-wide mode")
} }
......
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
* limitations under the License. * limitations under the License.
*/ */
// Deprecated: Package namespace_scope implements the lease-based coordination mechanism for the
// deprecated namespace-restricted operator mode. It will be removed in a future release.
package namespace_scope package namespace_scope
import ( import (
...@@ -37,7 +39,8 @@ const ( ...@@ -37,7 +39,8 @@ const (
LeaseName = "dynamo-operator-namespace-scope" LeaseName = "dynamo-operator-namespace-scope"
) )
// LeaseManager manages the namespace scope marker lease // Deprecated: LeaseManager manages the namespace scope marker lease for the deprecated
// namespace-restricted operator mode.
type LeaseManager struct { type LeaseManager struct {
client kubernetes.Interface client kubernetes.Interface
namespace string namespace string
......
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
* limitations under the License. * limitations under the License.
*/ */
// Deprecated: Package namespace_scope implements the lease-based coordination mechanism for the
// deprecated namespace-restricted operator mode. It will be removed in a future release.
package namespace_scope package namespace_scope
import ( import (
...@@ -33,9 +35,9 @@ import ( ...@@ -33,9 +35,9 @@ import (
"sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/log"
) )
// LeaseWatcher watches for namespace scope marker leases and maintains // Deprecated: LeaseWatcher watches for namespace scope marker leases and maintains
// an exclusion list for the cluster-wide operator. // an exclusion list for the cluster-wide operator. It is part of the deprecated
// It implements the ExcludedNamespacesInterface from controller_common. // namespace-restricted operator mode.
type LeaseWatcher struct { type LeaseWatcher struct {
excludedNamespaces sync.Map // map[string]*coordinationv1.Lease (namespace -> lease object) excludedNamespaces sync.Map // map[string]*coordinationv1.Lease (namespace -> lease object)
informerFactory informers.SharedInformerFactory informerFactory informers.SharedInformerFactory
......
...@@ -63,10 +63,7 @@ helm install dynamo-platform dynamo-platform-${RELEASE_VERSION}.tgz --namespace ...@@ -63,10 +63,7 @@ helm install dynamo-platform dynamo-platform-${RELEASE_VERSION}.tgz --namespace
**For Shared/Multi-Tenant Clusters:** **For Shared/Multi-Tenant Clusters:**
If your cluster has namespace-restricted Dynamo operators, add this flag to step 2: > **DEPRECATED:** Namespace-restricted mode (`namespaceRestriction.enabled=true`) is deprecated and will be removed in a future release. Use cluster-wide mode (the default) instead.
```bash
--set dynamo-operator.namespaceRestriction.enabled=true
```
For more details or customization options (including multinode deployments), see **[Installation Guide for Dynamo Kubernetes Platform](installation-guide.md)**. For more details or customization options (including multinode deployments), see **[Installation Guide for Dynamo Kubernetes Platform](installation-guide.md)**.
......
...@@ -2014,15 +2014,16 @@ _Appears in:_ ...@@ -2014,15 +2014,16 @@ _Appears in:_
| Field | Description | Default | Validation | | Field | Description | Default | Validation |
| --- | --- | --- | --- | | --- | --- | --- | --- |
| `restricted` _string_ | Restricted is the namespace to restrict to. Empty = cluster-wide mode. | | | | `restricted` _string_ | Deprecated: Namespace-restricted mode is deprecated and will be removed in a future release.<br />Use cluster-wide mode (leave Restricted empty) instead. | | |
| `scope` _[NamespaceScopeConfiguration](#namespacescopeconfiguration)_ | Scope holds namespace scope lease settings (namespace-restricted mode only) | | | | `scope` _[NamespaceScopeConfiguration](#namespacescopeconfiguration)_ | Deprecated: Scope is only used in namespace-restricted mode, which is deprecated. | | |
#### NamespaceScopeConfiguration #### NamespaceScopeConfiguration
NamespaceScopeConfiguration holds lease settings for namespace-restricted mode. Deprecated: NamespaceScopeConfiguration is used only by the deprecated namespace-restricted
mode and will be removed in a future release.
......
...@@ -14,7 +14,6 @@ Determine your cluster environment: ...@@ -14,7 +14,6 @@ Determine your cluster environment:
- CRDs already installed cluster-wide - skip CRD installation step - CRDs already installed cluster-wide - skip CRD installation step
- A cluster-wide Dynamo operator is likely already running - A cluster-wide Dynamo operator is likely already running
- **Do NOT install another operator** - use the existing cluster-wide operator - **Do NOT install another operator** - use the existing cluster-wide operator
- Only install a namespace-restricted operator if you specifically need to prevent the cluster-wide operator from managing your namespace (e.g., testing operator features you're developing)
**Dedicated Cluster** (full cluster admin access): **Dedicated Cluster** (full cluster admin access):
- You install CRDs yourself - You install CRDs yourself
...@@ -136,20 +135,7 @@ helm install dynamo-platform dynamo-platform-${RELEASE_VERSION}.tgz --namespace ...@@ -136,20 +135,7 @@ helm install dynamo-platform dynamo-platform-${RELEASE_VERSION}.tgz --namespace
**For Shared/Multi-Tenant Clusters:** **For Shared/Multi-Tenant Clusters:**
If your cluster has namespace-restricted Dynamo operators, you MUST add namespace restriction to your installation: > **DEPRECATED:** Namespace-restricted mode (`namespaceRestriction.enabled=true`) is deprecated and will be removed in a future release. New deployments should use the default cluster-wide mode. If you are currently using namespace-restricted mode, plan to migrate to cluster-wide mode.
```bash
# Add this flag to the helm install command above
--set dynamo-operator.namespaceRestriction.enabled=true
```
Note: Use the full path `dynamo-operator.namespaceRestriction.enabled=true` (not just `namespaceRestriction.enabled=true`).
If you see this validation error, you need namespace restriction:
```
VALIDATION ERROR: Cannot install cluster-wide Dynamo operator.
Found existing namespace-restricted Dynamo operators in namespaces: ...
```
> [!TIP] > [!TIP]
> For multinode deployments, you need to install multinode orchestration components: > For multinode deployments, you need to install multinode orchestration components:
...@@ -196,17 +182,13 @@ Found existing namespace-restricted Dynamo operators in namespaces: ... ...@@ -196,17 +182,13 @@ Found existing namespace-restricted Dynamo operators in namespaces: ...
--set "dynamo-operator.modelExpressURL=http://model-express-server.model-express.svc.cluster.local:8080" --set "dynamo-operator.modelExpressURL=http://model-express-server.model-express.svc.cluster.local:8080"
``` ```
> [!TIP] > [!WARNING]
> By default, Dynamo Operator is installed cluster-wide and will monitor all namespaces. > **DEPRECATED:** Namespace-restricted mode is deprecated and will be removed in a future release.
> If you wish to restrict the operator to monitor only a specific namespace (the helm release namespace by default), you can set the namespaceRestriction.enabled to true. > By default, Dynamo Operator is installed cluster-wide and will monitor all namespaces. This is the recommended and only supported mode going forward.
> You can also change the restricted namespace by setting the targetNamespace property.
```bash ### GPU Discovery for DynamoGraphDeploymentRequests (Deprecated Namespace-Scoped Mode)
--set "dynamo-operator.namespaceRestriction.enabled=true"
--set "dynamo-operator.namespaceRestriction.targetNamespace=dynamo-namespace" # optional
```
### GPU Discovery for DynamoGraphDeploymentRequests with Namespace-Scoped Operators > **DEPRECATED:** This section applies only to the deprecated namespace-restricted mode. New deployments should use cluster-wide mode, which has GPU discovery by default.
GPU discovery is **enabled by default** for namespace-scoped operators. The Helm chart automatically provisions a ClusterRole/ClusterRoleBinding granting the operator read-only access to node GPU labels. GPU discovery is **enabled by default** for namespace-scoped operators. The Helm chart automatically provisions a ClusterRole/ClusterRoleBinding granting the operator read-only access to node GPU labels.
...@@ -270,15 +252,13 @@ cd deploy/helm/charts ...@@ -270,15 +252,13 @@ cd deploy/helm/charts
# 4. Install Platform (CRDs are automatically installed by the chart) # 4. Install Platform (CRDs are automatically installed by the chart)
helm dep build ./platform/ helm dep build ./platform/
# To install cluster-wide instead, set NS_RESTRICT_FLAGS="" (empty) or omit that line entirely. # NOTE: Namespace-restricted mode is DEPRECATED. Use cluster-wide mode (the default).
NS_RESTRICT_FLAGS="--set dynamo-operator.namespaceRestriction.enabled=true"
helm install dynamo-platform ./platform/ \ helm install dynamo-platform ./platform/ \
--namespace "${NAMESPACE}" \ --namespace "${NAMESPACE}" \
--set "dynamo-operator.controllerManager.manager.image.repository=${DOCKER_SERVER}/kubernetes-operator" \ --set "dynamo-operator.controllerManager.manager.image.repository=${DOCKER_SERVER}/kubernetes-operator" \
--set "dynamo-operator.controllerManager.manager.image.tag=${IMAGE_TAG}" \ --set "dynamo-operator.controllerManager.manager.image.tag=${IMAGE_TAG}" \
--set "dynamo-operator.imagePullSecrets[0].name=docker-imagepullsecret" \ --set "dynamo-operator.imagePullSecrets[0].name=docker-imagepullsecret"
${NS_RESTRICT_FLAGS}
``` ```
...@@ -327,12 +307,7 @@ Found existing namespace-restricted Dynamo operators in namespaces: ... ...@@ -327,12 +307,7 @@ Found existing namespace-restricted Dynamo operators in namespaces: ...
Cause: Attempting cluster-wide install on a shared cluster with existing namespace-restricted operators. Cause: Attempting cluster-wide install on a shared cluster with existing namespace-restricted operators.
Solution: Add namespace restriction to your installation: Solution: Migrate the existing namespace-restricted operators to cluster-wide mode. Namespace-restricted mode is deprecated and should no longer be used.
```bash
--set dynamo-operator.namespaceRestriction.enabled=true
```
Note: Use the full path `dynamo-operator.namespaceRestriction.enabled=true` (not just `namespaceRestriction.enabled=true`).
**CRDs already exist** **CRDs already exist**
......
...@@ -15,7 +15,7 @@ TAS is **opt-in**. Existing deployments without topology constraints continue to ...@@ -15,7 +15,7 @@ TAS is **opt-in**. Existing deployments without topology constraints continue to
| **Grove** | Installed on the cluster. See the [Grove Installation Guide](https://github.com/NVIDIA/grove/blob/main/docs/installation.md). | | **Grove** | Installed on the cluster. See the [Grove Installation Guide](https://github.com/NVIDIA/grove/blob/main/docs/installation.md). |
| **ClusterTopology CR** | A cluster-scoped `ClusterTopology` resource configured by the cluster admin, mapping topology domain names to node labels. See [Grove documentation](https://github.com/NVIDIA/grove) for setup instructions. | | **ClusterTopology CR** | A cluster-scoped `ClusterTopology` resource configured by the cluster admin, mapping topology domain names to node labels. See [Grove documentation](https://github.com/NVIDIA/grove) for setup instructions. |
| **KAI Scheduler** | [KAI Scheduler](https://github.com/NVIDIA/KAI-Scheduler) is required by Grove for topology-aware pod placement. | | **KAI Scheduler** | [KAI Scheduler](https://github.com/NVIDIA/KAI-Scheduler) is required by Grove for topology-aware pod placement. |
| **Dynamo operator** | The latest Dynamo operator Helm chart includes read-only RBAC for `clustertopologies.grove.io` via a dedicated ClusterRole. This works for both cluster-wide and namespace-restricted operator deployments — no extra configuration is needed. | | **Dynamo operator** | The latest Dynamo operator Helm chart includes read-only RBAC for `clustertopologies.grove.io` via a dedicated ClusterRole. No extra configuration is needed. |
## Topology Domains ## Topology Domains
......
...@@ -18,7 +18,6 @@ All webhook types (validating, mutating, conversion, etc.) share the same **webh ...@@ -18,7 +18,6 @@ All webhook types (validating, mutating, conversion, etc.) share the same **webh
-**Shared certificate infrastructure** - All webhook types use the same TLS certificates -**Shared certificate infrastructure** - All webhook types use the same TLS certificates
-**Automatic certificate generation and rotation** - Built-in cert-controller, no manual management required -**Automatic certificate generation and rotation** - Built-in cert-controller, no manual management required
-**cert-manager integration** - Optional integration for custom PKI or organizational certificate policies -**cert-manager integration** - Optional integration for custom PKI or organizational certificate policies
-**Multi-operator support** - Lease-based coordination for cluster-wide and namespace-restricted deployments
-**Immutability enforcement** - Critical fields protected via CEL validation rules -**Immutability enforcement** - Critical fields protected via CEL validation rules
### Current Webhook Types ### Current Webhook Types
...@@ -165,7 +164,7 @@ webhook: ...@@ -165,7 +164,7 @@ webhook:
values: ["disabled"] values: ["disabled"]
``` ```
**Note:** For **namespace-restricted operators**, the namespace selector is automatically set to validate only the operator's namespace. This configuration is ignored in namespace-restricted mode. **Note:** For **namespace-restricted operators** (deprecated), the namespace selector is automatically set to validate only the operator's namespace. This configuration is ignored in namespace-restricted mode.
--- ---
...@@ -335,7 +334,9 @@ helm install dynamo-platform . -n <namespace> -f values.yaml ...@@ -335,7 +334,9 @@ helm install dynamo-platform . -n <namespace> -f values.yaml
--- ---
## Multi-Operator Deployments ## Multi-Operator Deployments (DEPRECATED)
> **DEPRECATED:** Namespace-restricted mode and multi-operator deployments are deprecated and will be removed in a future release. Use a single cluster-wide operator instead.
The operator supports running both **cluster-wide** and **namespace-restricted** instances simultaneously using a **lease-based coordination mechanism**. The operator supports running both **cluster-wide** and **namespace-restricted** instances simultaneously using a **lease-based coordination mechanism**.
...@@ -640,9 +641,7 @@ helm upgrade <release> dynamo-platform -n <namespace> ...@@ -640,9 +641,7 @@ helm upgrade <release> dynamo-platform -n <namespace>
### Multi-Tenant Deployments ### Multi-Tenant Deployments
1.**Deploy one cluster-wide operator** for platform-wide validation 1.**Deploy one cluster-wide operator** for platform-wide validation
2.**Deploy namespace-restricted operators** for tenant-specific namespaces 2. ~~Deploy namespace-restricted operators for tenant-specific namespaces~~ (**DEPRECATED** - use cluster-wide mode instead)
3.**Monitor lease health** to ensure coordination works correctly
4.**Use unique release names** per namespace to avoid naming conflicts
--- ---
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment