[FLINK-37911][Helm] Reorganize Helm chart templates

diff --git a/helm/flink-kubernetes-operator/templates/_helpers.tpl b/helm/flink-kubernetes-operator/templates/_helpers.tpl
index 3456ab4..f4673d1 100644
--- a/helm/flink-kubernetes-operator/templates/_helpers.tpl
+++ b/helm/flink-kubernetes-operator/templates/_helpers.tpl
@@ -1,20 +1,20 @@
-################################################################################
-#  Licensed to the Apache Software Foundation (ASF) under one
-#  or more contributor license agreements.  See the NOTICE file
-#  distributed with this work for additional information
-#  regarding copyright ownership.  The ASF licenses this file
-#  to you under the Apache License, Version 2.0 (the
-#  "License"); you may not use this file except in compliance
-#  with the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-# limitations under the License.
-################################################################################
+{{- /*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/ -}}
 
 {{/*
 Expand the name of the chart.
@@ -77,121 +77,3 @@
 {{- .Values.image.repository }}:{{ default .Chart.AppVersion .Values.image.tag }}
 {{- end }}
 {{- end }}
-
-{{/*
-Create the name of the operator role to use
-*/}}
-{{- define "flink-operator.roleName" -}}
-{{- if .Values.rbac.operatorRole.create }}
-{{- default (include "flink-operator.fullname" .) .Values.rbac.operatorRole.name }}
-{{- else }}
-{{- default "default" .Values.rbac.operatorRole.name }}
-{{- end }}
-{{- end }}
-
-{{/*
-Create the name of the operator role binding to use
-*/}}
-{{- define "flink-operator.roleBindingName" -}}
-{{- if .Values.rbac.operatorRoleBinding.create }}
-{{- default (include "flink-operator.fullname" .) .Values.rbac.operatorRoleBinding.name }}
-{{- else }}
-{{- default "default" .Values.rbac.operatorRoleBinding.name }}
-{{- end }}
-{{- end }}
-
-{{/*
-Create the name of the job role to use
-*/}}
-{{- define "flink-operator.jobRoleName" -}}
-{{- if .Values.rbac.jobRoleBinding.create }}
-{{- default (include "flink-operator.fullname" .) .Values.rbac.jobRole.name }}
-{{- else }}
-{{- default "default" .Values.rbac.jobRole.name }}
-{{- end }}
-{{- end }}
-
-{{/*
-Create the name of the job role to use
-*/}}
-{{- define "flink-operator.jobRoleBindingName" -}}
-{{- if .Values.rbac.jobRole.create }}
-{{- default (include "flink-operator.fullname" .) .Values.rbac.jobRoleBinding.name }}
-{{- else }}
-{{- default "default" .Values.rbac.jobRoleBinding.name }}
-{{- end }}
-{{- end }}
-
-
-{{/*
-Create the name of the operator service account to use
-*/}}
-{{- define "flink-operator.serviceAccountName" -}}
-{{- if .Values.operatorServiceAccount.create }}
-{{- default (include "flink-operator.fullname" .) .Values.operatorServiceAccount.name }}
-{{- else }}
-{{- default "default" .Values.operatorServiceAccount.name }}
-{{- end }}
-{{- end }}
-
-{{/*
-Create the name of the job service account to use
-*/}}
-{{- define "flink-operator.jobServiceAccountName" -}}
-{{- if .Values.jobServiceAccount.create }}
-{{- default (include "flink-operator.fullname" .) .Values.jobServiceAccount.name }}
-{{- else }}
-{{- default "default" .Values.jobServiceAccount.name }}
-{{- end }}
-{{- end }}
-
-{{/*
-Determine role scope based on name
-*/}}
-{{- define "flink-operator.roleScope" -}}
-{{- if contains ":" .role  }}
-{{- printf "ClusterRole" }}
-{{- else }}
-{{- printf "Role" }}
-{{- end }}
-{{- end }}
-
-{{- define "flink-operator.validating-webhook-enabled" -}}
-{{- if hasKey .Values.webhook "validator" }}
-{{- if .Values.webhook.validator.create }}
-{{- printf "true" }}
-{{- else }}
-{{- printf "false" }}
-{{- end }}
-{{- else }}
-{{- if or (.Values.webhook.create) }}
-{{- printf "true" }}
-{{- else }}
-{{- printf "false" }}
-{{- end }}
-{{- end }}
-{{- end }}
-
-{{- define "flink-operator.mutating-webhook-enabled" -}}
-{{- if hasKey .Values.webhook "mutator" }}
-{{- if .Values.webhook.mutator.create }}
-{{- printf "true" }}
-{{- else }}
-{{- printf "false" }}
-{{- end }}
-{{- else }}
-{{- if or (.Values.webhook.create) }}
-{{- printf "true" }}
-{{- else }}
-{{- printf "false" }}
-{{- end }}
-{{- end }}
-{{- end }}
-
-{{- define "flink-operator.webhook-enabled" -}}
-{{- if or (eq (include "flink-operator.validating-webhook-enabled" .) "true") (eq (include "flink-operator.mutating-webhook-enabled" .) "true") }}
-{{- printf "true" }}
-{{- else }}
-{{- printf "false" }}
-{{- end }}
-{{- end }}
diff --git a/helm/flink-kubernetes-operator/templates/cert-manager/certificate.yaml b/helm/flink-kubernetes-operator/templates/cert-manager/certificate.yaml
new file mode 100644
index 0000000..a6acc43
--- /dev/null
+++ b/helm/flink-kubernetes-operator/templates/cert-manager/certificate.yaml
@@ -0,0 +1,46 @@
+{{- /*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/ -}}
+
+{{- if eq (include "flink-operator.webhook-enabled" .) "true" }}
+apiVersion: cert-manager.io/v1
+kind: Certificate
+metadata:
+  name: flink-operator-serving-cert
+  namespace: {{ .Release.Namespace }}
+spec:
+  dnsNames:
+  - flink-operator-webhook-service.{{ .Release.Namespace }}.svc
+  - flink-operator-webhook-service.{{ .Release.Namespace }}.svc.cluster.local
+  keystores:
+    pkcs12:
+      create: true
+      passwordSecretRef:
+      {{- if .Values.webhook.keystore.useDefaultPassword }}
+        name: flink-operator-webhook-secret
+        key: password
+      {{- else }}
+        {{- with .Values.webhook.keystore.passwordSecretRef }}
+          {{- toYaml . | nindent 8 }}
+        {{- end }}
+      {{- end }}
+  issuerRef:
+    kind: Issuer
+    name: flink-operator-selfsigned-issuer
+  commonName: FlinkDeployment Validator
+  secretName: webhook-server-cert
+{{- end }}
diff --git a/helm/flink-kubernetes-operator/templates/cert-manager/issuer.yaml b/helm/flink-kubernetes-operator/templates/cert-manager/issuer.yaml
new file mode 100644
index 0000000..d2d9ecd
--- /dev/null
+++ b/helm/flink-kubernetes-operator/templates/cert-manager/issuer.yaml
@@ -0,0 +1,27 @@
+{{- /*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/ -}}
+
+{{- if eq (include "flink-operator.webhook-enabled" .) "true" }}
+apiVersion: cert-manager.io/v1
+kind: Issuer
+metadata:
+  name: flink-operator-selfsigned-issuer
+  namespace: {{ .Release.Namespace }}
+spec:
+  selfSigned: {}
+{{- end }}
diff --git a/helm/flink-kubernetes-operator/templates/controller/configmap.yaml b/helm/flink-kubernetes-operator/templates/controller/configmap.yaml
new file mode 100644
index 0000000..d869548
--- /dev/null
+++ b/helm/flink-kubernetes-operator/templates/controller/configmap.yaml
@@ -0,0 +1,68 @@
+{{- /*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/ -}}
+
+{{- if .Values.defaultConfiguration.create }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: flink-operator-config
+  namespace: {{ .Release.Namespace }}
+  labels:
+    {{- include "flink-operator.labels" . | nindent 4 }}
+data:
+  config.yaml: |+
+{{- if .Values.defaultConfiguration.append }}
+  {{- $.Files.Get "conf/flink-conf.yaml"  | nindent 4 -}}
+{{- end }}
+{{- if hasKey (.Values.defaultConfiguration) "config.yaml" }}
+  {{- index (.Values.defaultConfiguration) "config.yaml" | nindent 4 -}}
+{{- end }}
+{{- if .Values.watchNamespaces }}
+    kubernetes.operator.watched.namespaces: {{ join "," .Values.watchNamespaces  }}
+{{- end }}
+{{- if index .Values "operatorHealth" }}
+    kubernetes.operator.health.probe.enabled: true
+    kubernetes.operator.health.probe.port: {{ .Values.operatorHealth.port }}
+{{- end }}
+  flink-conf.yaml: |+
+{{- if .Values.defaultConfiguration.append }}
+  {{- $.Files.Get "conf/flink-conf.yaml"  | nindent 4 -}}
+{{- end }}
+{{- if hasKey (.Values.defaultConfiguration) "flink-conf.yaml" }}
+  {{- index (.Values.defaultConfiguration) "flink-conf.yaml" | nindent 4 -}}
+{{- end }}
+{{- if .Values.watchNamespaces }}
+    kubernetes.operator.watched.namespaces: {{ join "," .Values.watchNamespaces  }}
+{{- end }}
+{{- if index .Values "operatorHealth" }}
+    kubernetes.operator.health.probe.enabled: true
+    kubernetes.operator.health.probe.port: {{ .Values.operatorHealth.port }}
+{{- end }}
+  log4j-operator.properties: |+
+{{- if .Values.defaultConfiguration.append }}
+  {{- $.Files.Get "conf/log4j-operator.properties"  | nindent 4 -}}
+{{- end }}
+{{- if index (.Values.defaultConfiguration) "log4j-operator.properties" }}
+  {{- index (.Values.defaultConfiguration) "log4j-operator.properties" | nindent 4 -}}
+{{- end }}
+  log4j-console.properties: |+
+{{- if .Values.defaultConfiguration.append }}
+  {{- $.Files.Get "conf/log4j-console.properties"  | nindent 4 -}}
+{{- end }}
+{{- if index (.Values.defaultConfiguration) "log4j-console.properties" }}
+  {{- index (.Values.defaultConfiguration) "log4j-console.properties" | nindent 4 -}}
+{{- end }}
+{{- end }}
diff --git a/helm/flink-kubernetes-operator/templates/flink-operator.yaml b/helm/flink-kubernetes-operator/templates/controller/deployment.yaml
similarity index 75%
rename from helm/flink-kubernetes-operator/templates/flink-operator.yaml
rename to helm/flink-kubernetes-operator/templates/controller/deployment.yaml
index 4fa0c66..85e6a46 100644
--- a/helm/flink-kubernetes-operator/templates/flink-operator.yaml
+++ b/helm/flink-kubernetes-operator/templates/controller/deployment.yaml
@@ -1,21 +1,19 @@
-################################################################################
-#  Licensed to the Apache Software Foundation (ASF) under one
-#  or more contributor license agreements.  See the NOTICE file
-#  distributed with this work for additional information
-#  regarding copyright ownership.  The ASF licenses this file
-#  to you under the Apache License, Version 2.0 (the
-#  "License"); you may not use this file except in compliance
-#  with the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-# limitations under the License.
-################################################################################
----
+{{- /*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/ -}}
+
 apiVersion: apps/v1
 kind: Deployment
 metadata:
@@ -273,56 +271,3 @@
             secretName: {{ .Values.tls.secretName }}
             optional: true
         {{- end }}
----
-{{- if .Values.defaultConfiguration.create }}
-apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: flink-operator-config
-  namespace: {{ .Release.Namespace }}
-  labels:
-    {{- include "flink-operator.labels" . | nindent 4 }}
-data:
-  config.yaml: |+
-{{- if .Values.defaultConfiguration.append }}
-  {{- $.Files.Get "conf/flink-conf.yaml"  | nindent 4 -}}
-{{- end }}
-{{- if hasKey (.Values.defaultConfiguration) "config.yaml" }}
-  {{- index (.Values.defaultConfiguration) "config.yaml" | nindent 4 -}}
-{{- end }}
-{{- if .Values.watchNamespaces }}
-    kubernetes.operator.watched.namespaces: {{ join "," .Values.watchNamespaces  }}
-{{- end }}
-{{- if index .Values "operatorHealth" }}
-    kubernetes.operator.health.probe.enabled: true
-    kubernetes.operator.health.probe.port: {{ .Values.operatorHealth.port }}
-{{- end }}
-  flink-conf.yaml: |+
-{{- if .Values.defaultConfiguration.append }}
-  {{- $.Files.Get "conf/flink-conf.yaml"  | nindent 4 -}}
-{{- end }}
-{{- if hasKey (.Values.defaultConfiguration) "flink-conf.yaml" }}
-  {{- index (.Values.defaultConfiguration) "flink-conf.yaml" | nindent 4 -}}
-{{- end }}
-{{- if .Values.watchNamespaces }}
-    kubernetes.operator.watched.namespaces: {{ join "," .Values.watchNamespaces  }}
-{{- end }}
-{{- if index .Values "operatorHealth" }}
-    kubernetes.operator.health.probe.enabled: true
-    kubernetes.operator.health.probe.port: {{ .Values.operatorHealth.port }}
-{{- end }}
-  log4j-operator.properties: |+
-{{- if .Values.defaultConfiguration.append }}
-  {{- $.Files.Get "conf/log4j-operator.properties"  | nindent 4 -}}
-{{- end }}
-{{- if index (.Values.defaultConfiguration) "log4j-operator.properties" }}
-  {{- index (.Values.defaultConfiguration) "log4j-operator.properties" | nindent 4 -}}
-{{- end }}
-  log4j-console.properties: |+
-{{- if .Values.defaultConfiguration.append }}
-  {{- $.Files.Get "conf/log4j-console.properties"  | nindent 4 -}}
-{{- end }}
-{{- if index (.Values.defaultConfiguration) "log4j-console.properties" }}
-  {{- index (.Values.defaultConfiguration) "log4j-console.properties" | nindent 4 -}}
-{{- end }}
-{{- end }}
diff --git a/helm/flink-kubernetes-operator/templates/flink/_helpers.tpl b/helm/flink-kubernetes-operator/templates/flink/_helpers.tpl
new file mode 100644
index 0000000..386d26d
--- /dev/null
+++ b/helm/flink-kubernetes-operator/templates/flink/_helpers.tpl
@@ -0,0 +1,50 @@
+{{- /*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/ -}}
+
+{{/*
+Create the name of the job service account to use
+*/}}
+{{- define "flink-operator.jobServiceAccountName" -}}
+{{- if .Values.jobServiceAccount.create }}
+{{- default (include "flink-operator.fullname" .) .Values.jobServiceAccount.name }}
+{{- else }}
+{{- default "default" .Values.jobServiceAccount.name }}
+{{- end }}
+{{- end }}
+
+{{/*
+Create the name of the job role to use
+*/}}
+{{- define "flink-operator.jobRoleName" -}}
+{{- if .Values.rbac.jobRoleBinding.create }}
+{{- default (include "flink-operator.fullname" .) .Values.rbac.jobRole.name }}
+{{- else }}
+{{- default "default" .Values.rbac.jobRole.name }}
+{{- end }}
+{{- end }}
+
+{{/*
+Create the name of the job role to use
+*/}}
+{{- define "flink-operator.jobRoleBindingName" -}}
+{{- if .Values.rbac.jobRole.create }}
+{{- default (include "flink-operator.fullname" .) .Values.rbac.jobRoleBinding.name }}
+{{- else }}
+{{- default "default" .Values.rbac.jobRoleBinding.name }}
+{{- end }}
+{{- end }}
diff --git a/helm/flink-kubernetes-operator/templates/flink/role.yaml b/helm/flink-kubernetes-operator/templates/flink/role.yaml
new file mode 100644
index 0000000..acdfd88
--- /dev/null
+++ b/helm/flink-kubernetes-operator/templates/flink/role.yaml
@@ -0,0 +1,46 @@
+{{- /*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/ -}}
+
+{{- if and .Values.rbac.create .Values.rbac.jobRole.create }}
+{{- if .Values.watchNamespaces }}
+{{- range .Values.watchNamespaces }}
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: Role
+metadata:
+  name: {{ include "flink-operator.jobRoleName" $ }}
+  namespace: {{ . }}
+  labels:
+    {{- include "flink-operator.labels" $ | nindent 4 }}
+  annotations:
+    "helm.sh/resource-policy": keep
+{{- template "flink-operator.jobRbacRules" $ }}
+{{- end }}
+{{- else }}
+apiVersion: rbac.authorization.k8s.io/v1
+kind: Role
+metadata:
+  name: {{ include "flink-operator.jobRoleName" $ }}
+  namespace: {{ .Release.Namespace }}
+  labels:
+    {{- include "flink-operator.labels" . | nindent 4 }}
+  annotations:
+    "helm.sh/resource-policy": keep
+{{- template "flink-operator.jobRbacRules" $ }}
+{{- end }}
+{{- end }}
diff --git a/helm/flink-kubernetes-operator/templates/flink/role_binding.yaml b/helm/flink-kubernetes-operator/templates/flink/role_binding.yaml
new file mode 100644
index 0000000..56f8427
--- /dev/null
+++ b/helm/flink-kubernetes-operator/templates/flink/role_binding.yaml
@@ -0,0 +1,60 @@
+{{- /*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/ -}}
+
+{{- if and .Values.rbac.create .Values.rbac.jobRoleBinding.create }}
+{{- if .Values.watchNamespaces }}
+{{- range .Values.watchNamespaces }}
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: RoleBinding
+metadata:
+  name: {{ include "flink-operator.jobRoleBindingName" $ }}
+  namespace: {{ . }}
+  labels:
+    {{- include "flink-operator.labels" $ | nindent 4 }}
+  annotations:
+    "helm.sh/resource-policy": keep
+roleRef:
+  kind: {{ $role := include "flink-operator.jobRoleName" $ }}{{ include "flink-operator.roleScope" (dict "role" $role)}}
+  name: {{ include "flink-operator.jobRoleName" $ }}
+  apiGroup: rbac.authorization.k8s.io
+subjects:
+  - kind: ServiceAccount
+    name: {{ include "flink-operator.jobServiceAccountName" $ }}
+    namespace: {{ . }}
+{{- end }}
+{{- else }}
+apiVersion: rbac.authorization.k8s.io/v1
+kind: RoleBinding
+metadata:
+  name: {{ include "flink-operator.jobRoleBindingName" $ }}
+  namespace: {{ .Release.Namespace }}
+  labels:
+    {{- include "flink-operator.labels" . | nindent 4 }}
+  annotations:
+    "helm.sh/resource-policy": keep
+roleRef:
+  kind: Role
+  name: {{ include "flink-operator.jobRoleName" $ }}
+  apiGroup: rbac.authorization.k8s.io
+subjects:
+  - kind: ServiceAccount
+    name: {{ include "flink-operator.jobServiceAccountName" . }}
+    namespace: {{ .Release.Namespace }}
+{{- end }}
+{{- end }}
diff --git a/helm/flink-kubernetes-operator/templates/flink/service_account.yaml b/helm/flink-kubernetes-operator/templates/flink/service_account.yaml
new file mode 100644
index 0000000..f5dd54a
--- /dev/null
+++ b/helm/flink-kubernetes-operator/templates/flink/service_account.yaml
@@ -0,0 +1,53 @@
+{{- /*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/ -}}
+
+{{- if .Values.jobServiceAccount.create -}}
+{{- /* Create job service accounts for all watched namespaces. */ -}}
+{{- if .Values.watchNamespaces }}
+{{- range .Values.watchNamespaces }}
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: {{ include "flink-operator.jobServiceAccountName" $ }}
+  namespace: {{ . }}
+  labels:
+    {{- include "flink-operator.labels" $ | nindent 4 }}
+  {{- with $.Values.jobServiceAccount.annotations }}
+  annotations:
+    {{- toYaml . | nindent 4 }}
+  {{- end }}
+---
+{{- end }}
+{{- /*
+Create the job service account for the operator namespace, it is to be added for other namespaces manually
+(or via specifying them in watchNamespaces).
+*/ -}}
+{{- else }}
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: {{ include "flink-operator.jobServiceAccountName" $ }}
+  namespace: {{ .Release.Namespace }}
+  labels:
+    {{- include "flink-operator.labels" $ | nindent 4 }}
+  {{- with .Values.jobServiceAccount.annotations }}
+  annotations:
+    {{- toYaml . | nindent 4 }}
+  {{- end }}
+{{- end }}
+{{- end }}
diff --git a/helm/flink-kubernetes-operator/templates/rbac.yaml b/helm/flink-kubernetes-operator/templates/rbac.yaml
deleted file mode 100644
index ecc4c21..0000000
--- a/helm/flink-kubernetes-operator/templates/rbac.yaml
+++ /dev/null
@@ -1,351 +0,0 @@
-################################################################################
-#  Licensed to the Apache Software Foundation (ASF) under one
-#  or more contributor license agreements.  See the NOTICE file
-#  distributed with this work for additional information
-#  regarding copyright ownership.  The ASF licenses this file
-#  to you under the Apache License, Version 2.0 (the
-#  "License"); you may not use this file except in compliance
-#  with the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-# limitations under the License.
-################################################################################
-
-{{/*
-RBAC rules used to create the operator (cluster)role based on the scope
-*/}}
-{{- define "flink-operator.rbacRules" }}
-rules:
-  - apiGroups:
-      - ""
-    resources:
-      - pods
-      - services
-      - events
-      - configmaps
-      - secrets
-    verbs:
-      - get
-      - list
-      - watch
-      - create
-      - update
-      - patch
-      - delete
-      - deletecollection
-{{- if .Values.rbac.nodesRule.create }}
-  - apiGroups:
-    - ""
-    resources:
-      - nodes
-    verbs:
-      - list
-{{- end }}
-  - apiGroups:
-      - apps
-    resources:
-      - deployments
-      - deployments/finalizers
-      - replicasets
-    verbs:
-      - get
-      - list
-      - watch
-      - create
-      - update
-      - patch
-      - delete
-  - apiGroups:
-      - apps
-    resources:
-      - deployments/scale
-    verbs:
-      - get
-      - update
-      - patch
-  - apiGroups:
-      - extensions
-    resources:
-      - deployments
-      - ingresses
-    verbs:
-      - get
-      - list
-      - watch
-      - create
-      - update
-      - patch
-      - delete
-  - apiGroups:
-      - flink.apache.org
-    resources:
-      - flinkdeployments
-      - flinkdeployments/finalizers
-      - flinksessionjobs
-      - flinksessionjobs/finalizers
-      - flinkstatesnapshots
-      - flinkstatesnapshots/finalizers
-    verbs:
-      - get
-      - list
-      - watch
-      - create
-      - update
-      - patch
-      - delete
-  - apiGroups:
-      - flink.apache.org
-    resources:
-      - flinkdeployments/status
-      - flinksessionjobs/status
-      - flinkstatesnapshots/status
-    verbs:
-      - get
-      - update
-      - patch
-  - apiGroups:
-      - networking.k8s.io
-    resources:
-      - ingresses
-    verbs:
-      - get
-      - list
-      - watch
-      - create
-      - update
-      - patch
-      - delete
-  - apiGroups:
-      - coordination.k8s.io
-    resources:
-      - leases
-    verbs:
-      - get
-      - list
-      - watch
-      - create
-      - update
-      - patch
-      - delete
-{{- end }}
-
-{{/*
-RBAC rules used to create the job (cluster)role based on the scope
-*/}}
-{{- define "flink-operator.jobRbacRules" }}
-rules:
-  - apiGroups:
-      - ""
-    resources:
-      - pods
-      - configmaps
-    verbs:
-      - get
-      - list
-      - watch
-      - create
-      - update
-      - patch
-      - delete
-  - apiGroups:
-      - apps
-    resources:
-      - deployments
-      - deployments/finalizers
-    verbs:
-      - get
-      - list
-      - watch
-      - create
-      - update
-      - patch
-      - delete
-{{- end }}
-
----
-{{- if .Values.rbac.create }}
----
-{{/*
-Namespaced scoped RBAC.
-*/}}
-{{- if .Values.watchNamespaces }}
-{{- range .Values.watchNamespaces }}
-{{- if $.Values.rbac.operatorRole.create }}
-apiVersion: rbac.authorization.k8s.io/v1
-kind: Role
-metadata:
-  name: {{ include "flink-operator.roleName" $ }}
-  namespace: {{ . }}
-  labels:
-    {{- include "flink-operator.labels" $ | nindent 4 }}
-{{- template "flink-operator.rbacRules" $ }}
-{{- end }}
----
-{{- if $.Values.rbac.jobRole.create }}
-apiVersion: rbac.authorization.k8s.io/v1
-kind: Role
-metadata:
-  name: {{ include "flink-operator.jobRoleName" $ }}
-  namespace: {{ . }}
-  labels:
-    {{- include "flink-operator.labels" $ | nindent 4 }}
-  annotations:
-    "helm.sh/resource-policy": keep
-{{- template "flink-operator.jobRbacRules" $ }}
-{{- end }}
----
-{{- if $.Values.rbac.operatorRoleBinding.create }}
-apiVersion: rbac.authorization.k8s.io/v1
-kind: RoleBinding
-metadata:
-  name: {{ include "flink-operator.roleBindingName" $ }}
-  namespace: {{ . }}
-  labels:
-    {{- include "flink-operator.labels" $ | nindent 4 }}
-roleRef:
-  kind: {{ $role := include "flink-operator.roleName" $ }}{{ include "flink-operator.roleScope" (dict "role" $role)}}
-  name: {{ include "flink-operator.roleName" $ }}
-  apiGroup: rbac.authorization.k8s.io
-subjects:
-  - kind: ServiceAccount
-    name: {{ include "flink-operator.serviceAccountName" $ }}
-    namespace: {{ $.Release.Namespace }}
-{{- end }}
----
-{{- if $.Values.rbac.jobRoleBinding.create }}
-apiVersion: rbac.authorization.k8s.io/v1
-kind: RoleBinding
-metadata:
-  name: {{ include "flink-operator.jobRoleBindingName" $ }}
-  namespace: {{ . }}
-  labels:
-    {{- include "flink-operator.labels" $ | nindent 4 }}
-  annotations:
-    "helm.sh/resource-policy": keep
-roleRef:
-  kind: {{ $role := include "flink-operator.jobRoleName" $ }}{{ include "flink-operator.roleScope" (dict "role" $role)}}
-  name: {{ include "flink-operator.jobRoleName" $ }}
-  apiGroup: rbac.authorization.k8s.io
-subjects:
-  - kind: ServiceAccount
-    name: {{ include "flink-operator.jobServiceAccountName" $ }}
-    namespace: {{ . }}
-{{- end }}
----
-{{- end }}
-{{/*
-Give operator the ability to operate on leases in the release namespace
-*/}}
-{{- if and .Values.rbac.operatorRole.create (not (has .Release.Namespace .Values.watchNamespaces)) }}
-apiVersion: rbac.authorization.k8s.io/v1
-kind: Role
-metadata:
-  name: {{ include "flink-operator.roleName" $ }}
-  namespace: {{ .Release.Namespace }}
-  labels:
-    {{- include "flink-operator.labels" . | nindent 4 }}
-rules:
-  - apiGroups:
-      - coordination.k8s.io
-    resources:
-      - leases
-    verbs:
-      - get
-      - list
-      - watch
-      - create
-      - update
-      - patch
-      - delete
-{{- end }}
----
-{{- if and .Values.rbac.operatorRole.create (not (has .Release.Namespace .Values.watchNamespaces)) }}
-apiVersion: rbac.authorization.k8s.io/v1
-kind: RoleBinding
-metadata:
-  name: {{ include "flink-operator.roleBindingName" $ }}
-  namespace: {{ .Release.Namespace }}
-  labels:
-    {{- include "flink-operator.labels" $ | nindent 4 }}
-roleRef:
-  kind: Role
-  name: {{ include "flink-operator.roleName" $ }}
-  apiGroup: rbac.authorization.k8s.io
-subjects:
-  - kind: ServiceAccount
-    name: {{ include "flink-operator.serviceAccountName" . }}
-    namespace: {{ .Release.Namespace }}
-{{- end }}
-{{ else }}
-{{/*
-Cluster scoped RBAC.
-*/}}
----
-{{- if .Values.rbac.operatorRole.create }}
-apiVersion: rbac.authorization.k8s.io/v1
-kind: ClusterRole
-metadata:
-  name: {{ include "flink-operator.roleName" $ }}
-  namespace: {{ .Release.Namespace }}
-  labels:
-    {{- include "flink-operator.labels" . | nindent 4 }}
-{{- template "flink-operator.rbacRules" $ }}
-{{- end }}
----
-{{- if .Values.rbac.jobRole.create }}
-apiVersion: rbac.authorization.k8s.io/v1
-kind: Role
-metadata:
-  name: {{ include "flink-operator.jobRoleName" $ }}
-  namespace: {{ .Release.Namespace }}
-  labels:
-    {{- include "flink-operator.labels" . | nindent 4 }}
-  annotations:
-    "helm.sh/resource-policy": keep
-{{- template "flink-operator.jobRbacRules" $ }}
-{{- end }}
----
-{{- if .Values.rbac.operatorRoleBinding.create }}
-apiVersion: rbac.authorization.k8s.io/v1
-kind: ClusterRoleBinding
-metadata:
-  name: {{ include "flink-operator.roleBindingName" $ }}
-  namespace: {{ .Release.Namespace }}
-  labels:
-    {{- include "flink-operator.labels" . | nindent 4 }}
-roleRef:
-  kind: ClusterRole
-  name: {{ include "flink-operator.roleName" $ }}
-  apiGroup: rbac.authorization.k8s.io
-subjects:
-  - kind: ServiceAccount
-    name: {{ include "flink-operator.serviceAccountName" . }}
-    namespace: {{ .Release.Namespace }}
-{{- end }}
----
-{{- if .Values.rbac.jobRoleBinding.create }}
-apiVersion: rbac.authorization.k8s.io/v1
-kind: RoleBinding
-metadata:
-  name: {{ include "flink-operator.jobRoleBindingName" $ }}
-  namespace: {{ .Release.Namespace }}
-  labels:
-    {{- include "flink-operator.labels" . | nindent 4 }}
-  annotations:
-    "helm.sh/resource-policy": keep
-roleRef:
-  kind: Role
-  name: {{ include "flink-operator.jobRoleName" $ }}
-  apiGroup: rbac.authorization.k8s.io
-subjects:
-  - kind: ServiceAccount
-    name: {{ include "flink-operator.jobServiceAccountName" . }}
-    namespace: {{ .Release.Namespace }}
-{{- end }}
-{{- end }}
-{{- end }}
diff --git a/helm/flink-kubernetes-operator/templates/rbac/_helpers.tpl b/helm/flink-kubernetes-operator/templates/rbac/_helpers.tpl
new file mode 100644
index 0000000..44d1d7e
--- /dev/null
+++ b/helm/flink-kubernetes-operator/templates/rbac/_helpers.tpl
@@ -0,0 +1,212 @@
+{{- /*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/ -}}
+
+{{/*
+Create the name of the operator service account to use
+*/}}
+{{- define "flink-operator.serviceAccountName" -}}
+{{- if .Values.operatorServiceAccount.create }}
+{{- default (include "flink-operator.fullname" .) .Values.operatorServiceAccount.name }}
+{{- else }}
+{{- default "default" .Values.operatorServiceAccount.name }}
+{{- end }}
+{{- end }}
+
+{{/*
+Determine role scope based on name
+*/}}
+{{- define "flink-operator.roleScope" -}}
+{{- if contains ":" .role  }}
+{{- printf "ClusterRole" }}
+{{- else }}
+{{- printf "Role" }}
+{{- end }}
+{{- end }}
+
+{{/*
+Create the name of the operator role to use
+*/}}
+{{- define "flink-operator.roleName" -}}
+{{- if .Values.rbac.operatorRole.create }}
+{{- default (include "flink-operator.fullname" .) .Values.rbac.operatorRole.name }}
+{{- else }}
+{{- default "default" .Values.rbac.operatorRole.name }}
+{{- end }}
+{{- end }}
+
+{{/*
+Create the name of the operator role binding to use
+*/}}
+{{- define "flink-operator.roleBindingName" -}}
+{{- if .Values.rbac.operatorRoleBinding.create }}
+{{- default (include "flink-operator.fullname" .) .Values.rbac.operatorRoleBinding.name }}
+{{- else }}
+{{- default "default" .Values.rbac.operatorRoleBinding.name }}
+{{- end }}
+{{- end }}
+
+{{/*
+RBAC rules used to create the operator (cluster)role based on the scope
+*/}}
+{{- define "flink-operator.rbacRules" }}
+rules:
+  - apiGroups:
+      - ""
+    resources:
+      - pods
+      - services
+      - events
+      - configmaps
+      - secrets
+    verbs:
+      - get
+      - list
+      - watch
+      - create
+      - update
+      - patch
+      - delete
+      - deletecollection
+{{- if .Values.rbac.nodesRule.create }}
+  - apiGroups:
+    - ""
+    resources:
+      - nodes
+    verbs:
+      - list
+{{- end }}
+  - apiGroups:
+      - apps
+    resources:
+      - deployments
+      - deployments/finalizers
+      - replicasets
+    verbs:
+      - get
+      - list
+      - watch
+      - create
+      - update
+      - patch
+      - delete
+  - apiGroups:
+      - apps
+    resources:
+      - deployments/scale
+    verbs:
+      - get
+      - update
+      - patch
+  - apiGroups:
+      - extensions
+    resources:
+      - deployments
+      - ingresses
+    verbs:
+      - get
+      - list
+      - watch
+      - create
+      - update
+      - patch
+      - delete
+  - apiGroups:
+      - flink.apache.org
+    resources:
+      - flinkdeployments
+      - flinkdeployments/finalizers
+      - flinksessionjobs
+      - flinksessionjobs/finalizers
+      - flinkstatesnapshots
+      - flinkstatesnapshots/finalizers
+    verbs:
+      - get
+      - list
+      - watch
+      - create
+      - update
+      - patch
+      - delete
+  - apiGroups:
+      - flink.apache.org
+    resources:
+      - flinkdeployments/status
+      - flinksessionjobs/status
+      - flinkstatesnapshots/status
+    verbs:
+      - get
+      - update
+      - patch
+  - apiGroups:
+      - networking.k8s.io
+    resources:
+      - ingresses
+    verbs:
+      - get
+      - list
+      - watch
+      - create
+      - update
+      - patch
+      - delete
+  - apiGroups:
+      - coordination.k8s.io
+    resources:
+      - leases
+    verbs:
+      - get
+      - list
+      - watch
+      - create
+      - update
+      - patch
+      - delete
+{{- end }}
+
+{{/*
+RBAC rules used to create the job (cluster)role based on the scope
+*/}}
+{{- define "flink-operator.jobRbacRules" }}
+rules:
+  - apiGroups:
+      - ""
+    resources:
+      - pods
+      - configmaps
+    verbs:
+      - get
+      - list
+      - watch
+      - create
+      - update
+      - patch
+      - delete
+  - apiGroups:
+      - apps
+    resources:
+      - deployments
+      - deployments/finalizers
+    verbs:
+      - get
+      - list
+      - watch
+      - create
+      - update
+      - patch
+      - delete
+{{- end }}
diff --git a/helm/flink-kubernetes-operator/templates/rbac/cluster_role.yaml b/helm/flink-kubernetes-operator/templates/rbac/cluster_role.yaml
new file mode 100644
index 0000000..d101037
--- /dev/null
+++ b/helm/flink-kubernetes-operator/templates/rbac/cluster_role.yaml
@@ -0,0 +1,30 @@
+{{- /*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/ -}}
+
+{{- if and .Values.rbac.create .Values.rbac.operatorRole.create }}
+{{- if not .Values.watchNamespaces }}
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRole
+metadata:
+  name: {{ include "flink-operator.roleName" $ }}
+  namespace: {{ .Release.Namespace }}
+  labels:
+    {{- include "flink-operator.labels" . | nindent 4 }}
+{{- template "flink-operator.rbacRules" $ }}
+{{- end }}
+{{- end }}
diff --git a/helm/flink-kubernetes-operator/templates/rbac/cluster_role_binding.yaml b/helm/flink-kubernetes-operator/templates/rbac/cluster_role_binding.yaml
new file mode 100644
index 0000000..d4ee141
--- /dev/null
+++ b/helm/flink-kubernetes-operator/templates/rbac/cluster_role_binding.yaml
@@ -0,0 +1,37 @@
+{{- /*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/ -}}
+
+{{- if and .Values.rbac.create .Values.rbac.operatorRoleBinding.create }}
+{{- if not .Values.watchNamespaces }}
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRoleBinding
+metadata:
+  name: {{ include "flink-operator.roleBindingName" $ }}
+  namespace: {{ .Release.Namespace }}
+  labels:
+    {{- include "flink-operator.labels" . | nindent 4 }}
+roleRef:
+  kind: ClusterRole
+  name: {{ include "flink-operator.roleName" $ }}
+  apiGroup: rbac.authorization.k8s.io
+subjects:
+  - kind: ServiceAccount
+    name: {{ include "flink-operator.serviceAccountName" . }}
+    namespace: {{ .Release.Namespace }}
+{{- end }}
+{{- end }}
diff --git a/helm/flink-kubernetes-operator/templates/rbac/role.yaml b/helm/flink-kubernetes-operator/templates/rbac/role.yaml
new file mode 100644
index 0000000..e9653f5
--- /dev/null
+++ b/helm/flink-kubernetes-operator/templates/rbac/role.yaml
@@ -0,0 +1,58 @@
+{{- /*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/ -}}
+
+{{- if and .Values.rbac.create .Values.rbac.operatorRole.create }}
+{{- /* Namespaced scoped RBAC. */ -}}
+{{- if .Values.watchNamespaces }}
+{{- range .Values.watchNamespaces }}
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: Role
+metadata:
+  name: {{ include "flink-operator.roleName" $ }}
+  namespace: {{ . }}
+  labels:
+    {{- include "flink-operator.labels" $ | nindent 4 }}
+{{- template "flink-operator.rbacRules" $ }}
+{{- end }}
+{{- /* Give operator the ability to operate on leases in the release namespace */ -}}
+{{- if not (has .Release.Namespace .Values.watchNamespaces) }}
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: Role
+metadata:
+  name: {{ include "flink-operator.roleName" $ }}
+  namespace: {{ .Release.Namespace }}
+  labels:
+    {{- include "flink-operator.labels" . | nindent 4 }}
+rules:
+  - apiGroups:
+      - coordination.k8s.io
+    resources:
+      - leases
+    verbs:
+      - get
+      - list
+      - watch
+      - create
+      - update
+      - patch
+      - delete
+{{- end }}
+{{- end }}
+{{- end }}
diff --git a/helm/flink-kubernetes-operator/templates/rbac/role_binding.yaml b/helm/flink-kubernetes-operator/templates/rbac/role_binding.yaml
new file mode 100644
index 0000000..e606c19
--- /dev/null
+++ b/helm/flink-kubernetes-operator/templates/rbac/role_binding.yaml
@@ -0,0 +1,60 @@
+{{- /*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/ -}}
+
+{{- if and .Values.rbac.create .Values.rbac.operatorRoleBinding.create }}
+{{- /* Namespaced scoped RBAC. */ -}}
+{{- if .Values.watchNamespaces }}
+{{- range .Values.watchNamespaces }}
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: RoleBinding
+metadata:
+  name: {{ include "flink-operator.roleBindingName" $ }}
+  namespace: {{ . }}
+  labels:
+    {{- include "flink-operator.labels" $ | nindent 4 }}
+roleRef:
+  kind: {{ $role := include "flink-operator.roleName" $ }}{{ include "flink-operator.roleScope" (dict "role" $role)}}
+  name: {{ include "flink-operator.roleName" $ }}
+  apiGroup: rbac.authorization.k8s.io
+subjects:
+  - kind: ServiceAccount
+    name: {{ include "flink-operator.serviceAccountName" $ }}
+    namespace: {{ $.Release.Namespace }}
+{{- end }}
+{{- /* Give operator the ability to operate on leases in the release namespace */ -}}
+{{- if not (has .Release.Namespace .Values.watchNamespaces) }}
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: RoleBinding
+metadata:
+  name: {{ include "flink-operator.roleBindingName" $ }}
+  namespace: {{ .Release.Namespace }}
+  labels:
+    {{- include "flink-operator.labels" $ | nindent 4 }}
+roleRef:
+  kind: Role
+  name: {{ include "flink-operator.roleName" $ }}
+  apiGroup: rbac.authorization.k8s.io
+subjects:
+  - kind: ServiceAccount
+    name: {{ include "flink-operator.serviceAccountName" . }}
+    namespace: {{ .Release.Namespace }}
+{{- end }}
+{{- end }}
+{{- end }}
diff --git a/helm/flink-kubernetes-operator/templates/rbac/service_account.yaml b/helm/flink-kubernetes-operator/templates/rbac/service_account.yaml
new file mode 100644
index 0000000..b3a0fb8
--- /dev/null
+++ b/helm/flink-kubernetes-operator/templates/rbac/service_account.yaml
@@ -0,0 +1,29 @@
+{{- /*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/ -}}
+
+{{- if .Values.operatorServiceAccount.create }}
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: {{ include "flink-operator.serviceAccountName" . }}
+  namespace: {{ .Release.Namespace }}
+  labels:
+    {{- include "flink-operator.labels" . | nindent 4 }}
+  {{- with .Values.operatorServiceAccount.annotations }}
+  annotations:
+    {{- toYaml . | nindent 4 }}
+  {{- end }}
+{{- end }}
diff --git a/helm/flink-kubernetes-operator/templates/serviceaccount.yaml b/helm/flink-kubernetes-operator/templates/serviceaccount.yaml
deleted file mode 100644
index a0179ec..0000000
--- a/helm/flink-kubernetes-operator/templates/serviceaccount.yaml
+++ /dev/null
@@ -1,70 +0,0 @@
-################################################################################
-#  Licensed to the Apache Software Foundation (ASF) under one
-#  or more contributor license agreements.  See the NOTICE file
-#  distributed with this work for additional information
-#  regarding copyright ownership.  The ASF licenses this file
-#  to you under the Apache License, Version 2.0 (the
-#  "License"); you may not use this file except in compliance
-#  with the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-# limitations under the License.
-################################################################################
-
----
-{{- if .Values.operatorServiceAccount.create }}
-apiVersion: v1
-kind: ServiceAccount
-metadata:
-  name: {{ include "flink-operator.serviceAccountName" . }}
-  namespace: {{ .Release.Namespace }}
-  labels:
-    {{- include "flink-operator.labels" . | nindent 4 }}
-  {{- with .Values.operatorServiceAccount.annotations }}
-  annotations:
-    {{- toYaml . | nindent 4 }}
-  {{- end }}
-{{- end }}
----
-{{- if .Values.jobServiceAccount.create -}}
-{{/*
-Create job service accounts for all watched namespaces.
-*/}}
-{{- if .Values.watchNamespaces }}
-{{- range .Values.watchNamespaces }}
-apiVersion: v1
-kind: ServiceAccount
-metadata:
-  name: {{ include "flink-operator.jobServiceAccountName" $ }}
-  namespace: {{ . }}
-  labels:
-    {{- include "flink-operator.labels" $ | nindent 4 }}
-  {{- with $.Values.jobServiceAccount.annotations }}
-  annotations:
-    {{- toYaml . | nindent 4 }}
-  {{- end }}
----
-{{- end }}
-{{/*
-Create the job service account for the operator namespace, it is to be added for other namespaces manually
-(or via specifying them in watchNamespaces).
-*/}}
-{{- else}}
-apiVersion: v1
-kind: ServiceAccount
-metadata:
-  name: {{ include "flink-operator.jobServiceAccountName" $ }}
-  namespace: {{ .Release.Namespace }}
-  labels:
-    {{- include "flink-operator.labels" $ | nindent 4 }}
-  {{- with .Values.jobServiceAccount.annotations }}
-  annotations:
-    {{- toYaml . | nindent 4 }}
-  {{- end }}
-{{- end }}
-{{- end }}
diff --git a/helm/flink-kubernetes-operator/templates/webhook.yaml b/helm/flink-kubernetes-operator/templates/webhook.yaml
deleted file mode 100644
index cfe64aa..0000000
--- a/helm/flink-kubernetes-operator/templates/webhook.yaml
+++ /dev/null
@@ -1,157 +0,0 @@
-################################################################################
-#  Licensed to the Apache Software Foundation (ASF) under one
-#  or more contributor license agreements.  See the NOTICE file
-#  distributed with this work for additional information
-#  regarding copyright ownership.  The ASF licenses this file
-#  to you under the Apache License, Version 2.0 (the
-#  "License"); you may not use this file except in compliance
-#  with the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-# limitations under the License.
-################################################################################
----
-{{- if eq (include "flink-operator.webhook-enabled" .) "true" }}
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: flink-operator-webhook-service
-  namespace: {{ .Release.Namespace }}
-  {{- if .Values.webhook.serviceLabels }}
-  labels:
-    {{- range $key, $value := .Values.webhook.serviceLabels }}
-    {{ $key }}: {{ $value }}
-    {{- end }}
-  {{- end }}
-spec:
-  ports:
-  - port: 443
-    targetPort: 9443
-  selector:
-    app.kubernetes.io/name: {{ include "flink-operator.name" . }}
----
-{{- if .Values.webhook.keystore.useDefaultPassword }}
-apiVersion: v1
-kind: Secret
-metadata:
-  name: flink-operator-webhook-secret
-  namespace: {{ .Release.Namespace }}
-type: Opaque
-data:
-  password: cGFzc3dvcmQxMjM0
-{{- end }}
----
-apiVersion: cert-manager.io/v1
-kind: Certificate
-metadata:
-  name: flink-operator-serving-cert
-  namespace: {{ .Release.Namespace }}
-spec:
-  dnsNames:
-  - flink-operator-webhook-service.{{ .Release.Namespace }}.svc
-  - flink-operator-webhook-service.{{ .Release.Namespace }}.svc.cluster.local
-  keystores:
-    pkcs12:
-      create: true
-      passwordSecretRef:
-      {{- if .Values.webhook.keystore.useDefaultPassword }}
-        name: flink-operator-webhook-secret
-        key: password
-      {{- else }}
-        {{- with .Values.webhook.keystore.passwordSecretRef }}
-          {{- toYaml . | nindent 8 }}
-        {{- end }}
-      {{- end }}
-  issuerRef:
-    kind: Issuer
-    name: flink-operator-selfsigned-issuer
-  commonName: FlinkDeployment Validator
-  secretName: webhook-server-cert
----
-apiVersion: cert-manager.io/v1
-kind: Issuer
-metadata:
-  name: flink-operator-selfsigned-issuer
-  namespace: {{ .Release.Namespace }}
-spec:
-  selfSigned: {}
-{{- end }}
-{{- if eq (include "flink-operator.validating-webhook-enabled" .) "true" }}
----
-apiVersion: admissionregistration.k8s.io/v1
-kind: ValidatingWebhookConfiguration
-metadata:
-  annotations:
-    cert-manager.io/inject-ca-from: {{ .Release.Namespace }}/flink-operator-serving-cert
-  name: flink-operator-{{ .Release.Namespace }}-webhook-configuration
-webhooks:
-- name: validationwebhook.flink.apache.org
-  admissionReviewVersions: ["v1"]
-  clientConfig:
-    service:
-      name: flink-operator-webhook-service
-      namespace: {{ .Release.Namespace }}
-      path: /validate
-  failurePolicy: Fail
-  rules:
-  - apiGroups: ["flink.apache.org"]
-    apiVersions: ["*"]
-    scope: "Namespaced"
-    operations:
-    - CREATE
-    - UPDATE
-    resources:
-    - flinkdeployments
-    - flinksessionjobs
-    - flinkstatesnapshots
-  sideEffects: None
-  {{- if .Values.watchNamespaces }}
-  namespaceSelector:
-    matchExpressions:
-      - key: kubernetes.io/metadata.name
-        operator: In
-        values: [{{- range .Values.watchNamespaces }}{{ . | quote }},{{- end}}]
-  {{- end }}
-{{- end }}
-{{- if eq (include "flink-operator.mutating-webhook-enabled" .) "true" }}
----
-apiVersion: admissionregistration.k8s.io/v1
-kind: MutatingWebhookConfiguration
-metadata:
-  annotations:
-    cert-manager.io/inject-ca-from: {{ .Release.Namespace }}/flink-operator-serving-cert
-  name: flink-operator-{{ .Release.Namespace }}-webhook-configuration
-webhooks:
-  - name: mutationwebhook.flink.apache.org
-    admissionReviewVersions: ["v1"]
-    clientConfig:
-      service:
-        name: flink-operator-webhook-service
-        namespace: {{ .Release.Namespace }}
-        path: /mutate
-    failurePolicy: Fail
-    rules:
-      - apiGroups: ["flink.apache.org"]
-        apiVersions: ["*"]
-        scope: "Namespaced"
-        operations:
-          - CREATE
-          - UPDATE
-        resources:
-          - flinksessionjobs
-          - flinkdeployments
-    sideEffects: None
-    {{- if .Values.watchNamespaces }}
-    namespaceSelector:
-      matchExpressions:
-        - key: kubernetes.io/metadata.name
-          operator: In
-          values: [{{- range .Values.watchNamespaces }}{{ . | quote }},{{- end}}]
-    {{- end }}
-{{- end }}
diff --git a/helm/flink-kubernetes-operator/templates/webhook/_helpers.tpl b/helm/flink-kubernetes-operator/templates/webhook/_helpers.tpl
new file mode 100644
index 0000000..d92d5d3
--- /dev/null
+++ b/helm/flink-kubernetes-operator/templates/webhook/_helpers.tpl
@@ -0,0 +1,57 @@
+{{- /*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/ -}}
+
+{{- define "flink-operator.webhook-enabled" -}}
+{{- if or (eq (include "flink-operator.validating-webhook-enabled" .) "true") (eq (include "flink-operator.mutating-webhook-enabled" .) "true") }}
+{{- printf "true" }}
+{{- else }}
+{{- printf "false" }}
+{{- end }}
+{{- end }}
+
+{{- define "flink-operator.validating-webhook-enabled" -}}
+{{- if hasKey .Values.webhook "validator" }}
+{{- if .Values.webhook.validator.create }}
+{{- printf "true" }}
+{{- else }}
+{{- printf "false" }}
+{{- end }}
+{{- else }}
+{{- if or (.Values.webhook.create) }}
+{{- printf "true" }}
+{{- else }}
+{{- printf "false" }}
+{{- end }}
+{{- end }}
+{{- end }}
+
+{{- define "flink-operator.mutating-webhook-enabled" -}}
+{{- if hasKey .Values.webhook "mutator" }}
+{{- if .Values.webhook.mutator.create }}
+{{- printf "true" }}
+{{- else }}
+{{- printf "false" }}
+{{- end }}
+{{- else }}
+{{- if or (.Values.webhook.create) }}
+{{- printf "true" }}
+{{- else }}
+{{- printf "false" }}
+{{- end }}
+{{- end }}
+{{- end }}
diff --git a/helm/flink-kubernetes-operator/templates/webhook/mutating_webhook_configuration.yaml b/helm/flink-kubernetes-operator/templates/webhook/mutating_webhook_configuration.yaml
new file mode 100644
index 0000000..542ccc3
--- /dev/null
+++ b/helm/flink-kubernetes-operator/templates/webhook/mutating_webhook_configuration.yaml
@@ -0,0 +1,55 @@
+{{- /*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/ -}}
+
+{{- if eq (include "flink-operator.webhook-enabled" .) "true" }}
+{{- if eq (include "flink-operator.mutating-webhook-enabled" .) "true" }}
+apiVersion: admissionregistration.k8s.io/v1
+kind: MutatingWebhookConfiguration
+metadata:
+  annotations:
+    cert-manager.io/inject-ca-from: {{ .Release.Namespace }}/flink-operator-serving-cert
+  name: flink-operator-{{ .Release.Namespace }}-webhook-configuration
+webhooks:
+  - name: mutationwebhook.flink.apache.org
+    admissionReviewVersions: ["v1"]
+    clientConfig:
+      service:
+        name: flink-operator-webhook-service
+        namespace: {{ .Release.Namespace }}
+        path: /mutate
+    failurePolicy: Fail
+    rules:
+      - apiGroups: ["flink.apache.org"]
+        apiVersions: ["*"]
+        scope: "Namespaced"
+        operations:
+          - CREATE
+          - UPDATE
+        resources:
+          - flinksessionjobs
+          - flinkdeployments
+    sideEffects: None
+    {{- if .Values.watchNamespaces }}
+    namespaceSelector:
+      matchExpressions:
+        - key: kubernetes.io/metadata.name
+          operator: In
+          values: [{{- range .Values.watchNamespaces }}{{ . | quote }},{{- end}}]
+    {{- end }}
+{{- end }}
+{{- end }}
diff --git a/helm/flink-kubernetes-operator/templates/webhook/secret.yaml b/helm/flink-kubernetes-operator/templates/webhook/secret.yaml
new file mode 100644
index 0000000..2971100
--- /dev/null
+++ b/helm/flink-kubernetes-operator/templates/webhook/secret.yaml
@@ -0,0 +1,30 @@
+{{- /*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/ -}}
+
+{{- if eq (include "flink-operator.webhook-enabled" .) "true" }}
+{{- if .Values.webhook.keystore.useDefaultPassword }}
+apiVersion: v1
+kind: Secret
+metadata:
+  name: flink-operator-webhook-secret
+  namespace: {{ .Release.Namespace }}
+type: Opaque
+data:
+  password: cGFzc3dvcmQxMjM0
+{{- end }}
+{{- end }}
diff --git a/helm/flink-kubernetes-operator/templates/webhook/service.yaml b/helm/flink-kubernetes-operator/templates/webhook/service.yaml
new file mode 100644
index 0000000..16b6762
--- /dev/null
+++ b/helm/flink-kubernetes-operator/templates/webhook/service.yaml
@@ -0,0 +1,37 @@
+{{- /*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/ -}}
+
+{{- if eq (include "flink-operator.webhook-enabled" .) "true" }}
+apiVersion: v1
+kind: Service
+metadata:
+  name: flink-operator-webhook-service
+  namespace: {{ .Release.Namespace }}
+  {{- if .Values.webhook.serviceLabels }}
+  labels:
+    {{- range $key, $value := .Values.webhook.serviceLabels }}
+    {{ $key }}: {{ $value }}
+    {{- end }}
+  {{- end }}
+spec:
+  ports:
+  - port: 443
+    targetPort: 9443
+  selector:
+    app.kubernetes.io/name: {{ include "flink-operator.name" . }}
+{{- end }}
diff --git a/helm/flink-kubernetes-operator/templates/webhook/validating_webhook_configuration.yaml b/helm/flink-kubernetes-operator/templates/webhook/validating_webhook_configuration.yaml
new file mode 100644
index 0000000..58a6740
--- /dev/null
+++ b/helm/flink-kubernetes-operator/templates/webhook/validating_webhook_configuration.yaml
@@ -0,0 +1,56 @@
+{{- /*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/ -}}
+
+{{- if eq (include "flink-operator.webhook-enabled" .) "true" }}
+{{- if eq (include "flink-operator.validating-webhook-enabled" .) "true" }}
+apiVersion: admissionregistration.k8s.io/v1
+kind: ValidatingWebhookConfiguration
+metadata:
+  annotations:
+    cert-manager.io/inject-ca-from: {{ .Release.Namespace }}/flink-operator-serving-cert
+  name: flink-operator-{{ .Release.Namespace }}-webhook-configuration
+webhooks:
+- name: validationwebhook.flink.apache.org
+  admissionReviewVersions: ["v1"]
+  clientConfig:
+    service:
+      name: flink-operator-webhook-service
+      namespace: {{ .Release.Namespace }}
+      path: /validate
+  failurePolicy: Fail
+  rules:
+  - apiGroups: ["flink.apache.org"]
+    apiVersions: ["*"]
+    scope: "Namespaced"
+    operations:
+    - CREATE
+    - UPDATE
+    resources:
+    - flinkdeployments
+    - flinksessionjobs
+    - flinkstatesnapshots
+  sideEffects: None
+  {{- if .Values.watchNamespaces }}
+  namespaceSelector:
+    matchExpressions:
+      - key: kubernetes.io/metadata.name
+        operator: In
+        values: [{{- range .Values.watchNamespaces }}{{ . | quote }},{{- end}}]
+  {{- end }}
+{{- end }}
+{{- end }}
diff --git a/helm/flink-kubernetes-operator/values.yaml b/helm/flink-kubernetes-operator/values.yaml
index 42843b8..00fb5db 100644
--- a/helm/flink-kubernetes-operator/values.yaml
+++ b/helm/flink-kubernetes-operator/values.yaml
@@ -20,14 +20,15 @@
 
 # List of kubernetes namespaces to watch for FlinkDeployment changes, empty means all namespaces.
 # When enabled RBAC is only created for said namespaces, otherwise it is done for the cluster scope.
-# watchNamespaces: ["flink"]
+watchNamespaces: []
+# - flink
 
 image:
   repository: ghcr.io/apache/flink-kubernetes-operator
   pullPolicy: IfNotPresent
   tag: latest
   # If image digest is set then it takes precedence and the image tag will be ignored
-  # digest: ""
+  digest: ""
 
 imagePullSecrets: []
 
@@ -72,8 +73,8 @@
   #     configMapKeyRef:
   #       name: ""
   #       key: ""
-  # dnsPolicy: ""
-  # dnsConfig: {}
+  dnsPolicy: ""
+  dnsConfig: {}
   # Node labels and affinity for operator pod assignment
   # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/
   envFrom:
@@ -153,9 +154,9 @@
   #   create: true
   keystore:
     useDefaultPassword: true
-  # passwordSecretRef:
-  #   name: jks-password-secret
-  #   key: password-key
+    passwordSecretRef:
+    # name: jks-password-secret
+    # key: password-key
   serviceLabels: {}
 
 defaultConfiguration: