Skip to content
Open
Show file tree
Hide file tree
Changes from 11 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,10 @@ All notable changes to this project will be documented in this file.

- Set `maxSurge=1` and `maxUnavailable=0` on the OPA DaemonSet rolling update strategy to eliminate
availability gaps during rolling updates ([#819]).
- Helm deployed RBAC permissions documented, with unnecessary permissions removed ([#820]).

[#819]: https://github.com/stackabletech/opa-operator/pull/819
[#820]: https://github.com/stackabletech/opa-operator/pull/820

## [26.3.0] - 2026-03-16

Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
---
# This ClusterRole is for the OPA bundle builder sidecar, which reads
# Rego rules from ConfigMaps and compiles them into bundles for OPA.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: {{ .Release.Name }}-opa-bundle-builder-clusterrole
# This role is used for the OPA bundle builder.
# It needs to read ConfigMaps and watch ConfigMaps for changes,
# because the Rego rules that are used to build the bundles are
# stored in the ConfigMaps.
rules:
# Read and watch ConfigMaps containing Rego rules used to build bundles
- apiGroups:
- ""
resources:
Expand All @@ -16,6 +16,7 @@ rules:
- watch
- list
{{ if .Capabilities.APIVersions.Has "security.openshift.io/v1" }}
# Allow the bundle builder pods to use the opa-scc SCC on OpenShift
- apiGroups:
- security.openshift.io
resources:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,150 +6,109 @@ metadata:
labels:
{{- include "operator.labels" . | nindent 4 }}
rules:
- apiGroups:
- ""
resources:
- nodes
verbs:
- list
- watch
# For automatic cluster domain detection
- apiGroups:
- ""
resources:
- nodes/proxy
verbs:
- get
# Manage core workload resources created per OpaCluster.
# All resources are applied via Server-Side Apply (create + patch) and tracked for
# orphan cleanup (list + delete).
- apiGroups:
- ""
resources:
- pods
- configmaps
- secrets
- services
- endpoints
- serviceaccounts
verbs:
- create
- delete
- get
- list
- patch
- update
- watch
# ServiceAccount created per OpaCluster for workload pod identity.
# Applied via SSA and tracked for orphan cleanup.
- apiGroups:
- rbac.authorization.k8s.io
- ""
resources:
- rolebindings
- serviceaccounts
verbs:
- create
- delete
- get
- list
- patch
- update
- watch
# RoleBinding created per OpaCluster to bind the product ClusterRole to the workload
# ServiceAccount. Applied via SSA and tracked for orphan cleanup.
- apiGroups:
- apps
- rbac.authorization.k8s.io
resources:
- daemonsets
- rolebindings
verbs:
- get
- create
- delete
- get
- list
- patch
- update
- watch
# Required to bind the product ClusterRole to the per-cluster ServiceAccount.
- apiGroups:
- batch
- rbac.authorization.k8s.io
resources:
- jobs
- clusterroles
verbs:
- bind
resourceNames:
- {{ include "operator.name" . }}-clusterrole
# DaemonSet created per role group. Applied via SSA, tracked for orphan cleanup, and
# owned by the controller.
- apiGroups:
- apps
resources:
- daemonsets
verbs:
- create
- delete
- get
- list
- patch
- update
- watch
# Required for maintaining the CRDs within the operator (including the conversion webhook info).
# Also for the startup condition check before the controller can run.
- apiGroups:
- apiextensions.k8s.io
resources:
- customresourcedefinitions
verbs:
- get
# Required to maintain the CRD. The operator needs to do this, as it needs to enter e.g. it's
# generated certificate in the conversion webhook.
{{- if .Values.maintenance.customResourceDefinitions.maintain }}
- create
- patch
{{- end }}
# Required for startup condition
- list
- watch
{{- end }}
# Required to report reconciliation results and warnings back to the OpaCluster object.
- apiGroups:
- events.k8s.io
resources:
- events
verbs:
- create
- patch
# Primary CRD: watched by the controller and read during reconciliation.
- apiGroups:
- {{ include "operator.name" . }}.stackable.tech
resources:
- {{ include "operator.name" . }}clusters
verbs:
- get
- list
- patch
- watch
# Status subresource: updated at the end of every reconciliation.
- apiGroups:
- {{ include "operator.name" . }}.stackable.tech
resources:
- {{ include "operator.name" . }}clusters/status
verbs:
- patch
- apiGroups:
- rbac.authorization.k8s.io
resources:
- clusterroles
verbs:
- bind
resourceNames:
- {{ include "operator.name" . }}-clusterrole

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: {{ include "operator.name" . }}-clusterrole
labels:
{{- include "operator.labels" . | nindent 4 }}
rules:
- apiGroups:
- ""
resources:
- configmaps
- secrets
- serviceaccounts
verbs:
- get
- list
- watch
- apiGroups:
- events.k8s.io
resources:
- events
verbs:
- create
- patch
{{ if .Capabilities.APIVersions.Has "security.openshift.io/v1" }}
- apiGroups:
- security.openshift.io
resources:
- securitycontextconstraints
resourceNames:
- nonroot-v2
verbs:
- use
{{ end }}
21 changes: 21 additions & 0 deletions deploy/helm/opa-operator/templates/clusterrole-product.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
---
# Product ClusterRole: bound (via per OpaCluster RoleBinding) to the ServiceAccount that OPA
# workload pods run as.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: {{ include "operator.name" . }}-clusterrole
labels:
{{- include "operator.labels" . | nindent 4 }}
rules:
{{ if .Capabilities.APIVersions.Has "security.openshift.io/v1" }}
# Required on OpenShift to allow the OPA pods to run as a non-root user.
- apiGroups:
- security.openshift.io
resources:
- securitycontextconstraints
resourceNames:
- nonroot-v2
verbs:
- use
{{ end }}
Loading