Kubernetes RBAC
The portal connects to Service Provider Control Planes Kubernetes APIs and requires specific RBAC permissions. This page documents the minimum required permissions for the system service account used by the portal.
Core API Resources
Namespaces
| Verbs | Purpose |
|---|---|
|
Check if an organization namespace already exists before creating it. |
|
Connection health check when testing control plane connectivity. |
|
Auto-create organization namespaces on first use. Labels and annotations with billing and organization metadata are set on creation. |
|
Sync billing metadata (labels and annotations) to existing namespaces via the |
Secrets
| Verbs | Purpose |
|---|---|
|
Read connection credentials ( |
Custom Resources (dynamic)
The portal manages service instances as Kubernetes custom resources.
The exact API groups and resource types depend on the configured ServiceDefinition objects (for example vshn.appcat.vshn.io).
| Verbs | Purpose |
|---|---|
|
Fetch the current state of a service instance. |
|
Provision a new service instance. |
|
Update the spec or billing annotations of a service instance. |
|
Deprovision a service instance. |
API Discovery
The portal calls the Kubernetes discovery endpoint /apis/{group}/{version} to resolve resource plural names.
This is typically permitted for any authenticated identity, but should be verified when using restrictive RBAC setups.
Example ClusterRole
The following ClusterRole provides the minimum permissions the portal needs.
Adjust the custom resource API groups to match your configured service definitions.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: servala-portal
rules:
# Namespaces
- apiGroups: [""]
resources: ["namespaces"]
verbs: ["get", "list", "create", "patch"]
# Secrets (connection credentials)
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get"]
# Pods (status display)
- apiGroups: [""]
resources: ["pods"]
verbs: ["list"]
# Events (instance events)
- apiGroups: [""]
resources: ["events"]
verbs: ["list"]
# PersistentVolumeClaims (disk usage)
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["list"]
# Node proxy (optional — disk usage stats)
- apiGroups: [""]
resources: ["nodes/proxy"]
verbs: ["get"]
# CRD schemas
- apiGroups: ["apiextensions.k8s.io"]
resources: ["customresourcedefinitions"]
verbs: ["get", "list"]
# Custom resources — one rule per service API group
- apiGroups: ["vshn.appcat.vshn.io"]
resources: ["*"]
verbs: ["get", "create", "patch", "delete"]
# Add additional apiGroups for other service definitions