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.
Fetch per-pod CPU and memory usage from the metrics server. Displayed alongside pod status in the Technical Details section. If not granted, pods are still shown but without resource usage data.
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
get
Fetch the current state of a service instance.
create
Provision a new service instance.
patch
Update the spec or billing annotations of a service instance.
Required only for backup visibility and direct backup access.
Without these, the backup sections on the instance detail page are hidden or show
"currently unavailable".
API group
Resource
Verbs
Purpose
k8up.io
snapshots
list
List backups of K8up-based services (Redis, MariaDB, Nextcloud files, Codey).
k8up.io
schedules
list
Discover endpoint, bucket and credential secrets for direct backup access.
postgresql.cnpg.io
backups
list
List backups of PostgreSQL instances.
postgresql.cnpg.io
clusters
list
Derive the Barman server name for direct backup access.
barmancloud.cnpg.io
objectstores
list
Discover endpoint, bucket and credential secrets for direct backup access.
The credential secrets themselves are read with the existing secretsget permission.
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.
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/v1kind:ClusterRolemetadata:name:servala-portalrules:# Namespaces-apiGroups:[""]resources:["namespaces"]verbs:["get","list","create","patch"]# Secrets (connection credentials)-apiGroups:[""]resources:["secrets"]verbs:["get"]# Pods (status display and log access)-apiGroups:[""]resources:["pods"]verbs:["list"]-apiGroups:[""]resources:["pods/log"]verbs:["get"]# 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"]# Pod metrics (optional: CPU/memory usage display)-apiGroups:["metrics.k8s.io"]resources:["pods"]verbs:["list"]# CRD schemas-apiGroups:["apiextensions.k8s.io"]resources:["customresourcedefinitions"]verbs:["get","list"]# Backup resources (optional: backup visibility and direct backup access)-apiGroups:["k8up.io"]resources:["snapshots","schedules"]verbs:["list"]-apiGroups:["postgresql.cnpg.io"]resources:["backups","clusters"]verbs:["list"]-apiGroups:["barmancloud.cnpg.io"]resources:["objectstores"]verbs:["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