From 4bbb218952554932a6a843e2f92c8e58aaff9359 Mon Sep 17 00:00:00 2001 From: Danil-Grigorev Date: Wed, 30 Oct 2024 16:04:09 +0100 Subject: [PATCH] Add documentation on securing cross-namespace access for CC Signed-off-by: Danil-Grigorev --- .../cluster-class/write-clusterclass.md | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/docs/book/src/tasks/experimental-features/cluster-class/write-clusterclass.md b/docs/book/src/tasks/experimental-features/cluster-class/write-clusterclass.md index 1c722cfcf5f9..e9dea671cf24 100644 --- a/docs/book/src/tasks/experimental-features/cluster-class/write-clusterclass.md +++ b/docs/book/src/tasks/experimental-features/cluster-class/write-clusterclass.md @@ -438,6 +438,81 @@ spec: template: "{{ .cluster.name }}-{{ .machinePool.topologyName }}-{{ .random }}" ``` +### Defining a custom namespace for ClusterClass object + +As a user, I may need to create a `Cluster` from a `ClusterClass` object that exists only in a different namespace. To uniquely identify the `ClusterClass`, a `NamespaceName` ref is constructed from combination of: +* `cluster.spec.topology.classNamespace` - namespace of the `ClusterClass` object. +* `cluster.spec.topology.class` - name of the `ClusterClass` object. + +Example of the `Cluster` object with the `name/namespace` reference: + +```yaml +apiVersion: cluster.x-k8s.io/v1beta1 +kind: Cluster +metadata: + name: my-docker-cluster + namespace: default +spec: + topology: + class: docker-clusterclass-v0.1.0 + classNamespace: default + version: v1.22.4 + controlPlane: + replicas: 3 + workers: + machineDeployments: + - class: default-worker + name: md-0 + replicas: 4 + failureDomain: region +``` + +#### Securing cross-namespace reference to the ClusterClass + +It is often desirable to restrict free cross-namespace `ClusterClass` access for the `Cluster` object. This can be implemented by defining a [`ValidatingAdmissionPolicy`](https://kubernetes.io/docs/reference/access-authn-authz/validating-admission-policy/) on the `Cluster` object. + +An example of such policy may be: + +```yaml +apiVersion: admissionregistration.k8s.io/v1 +kind: ValidatingAdmissionPolicy +metadata: + name: "cluster-class-ref.cluster.x-k8s.io" +spec: + failurePolicy: Fail + paramKind: + apiVersion: v1 + kind: Secret + matchConstraints: + resourceRules: + - apiGroups: ["cluster.x-k8s.io"] + apiVersions: ["v1beta1"] + operations: ["CREATE", "UPDATE"] + resources: ["clusters"] + validations: + - expression: "!has(object.spec.topology.classNamespace) || object.spec.topology.classNamespace in params.data" +--- +apiVersion: admissionregistration.k8s.io/v1 +kind: ValidatingAdmissionPolicyBinding +metadata: + name: "cluster-class-ref-binding.cluster.x-k8s.io" +spec: + policyName: "cluster-class-ref.cluster.x-k8s.io" + validationActions: [Deny] + paramRef: + name: "ref-list" + namespace: "default" + parameterNotFoundAction: Deny +--- +apiVersion: v1 +kind: Secret +metadata: + name: "ref-list" + namespace: "default" +data: + default: "" +``` + ## Advanced features of ClusterClass with patches This section will explain more advanced features of ClusterClass patches.