Add the impersonation feature to API spec
Signed-off-by: Stefan Prodan <stefan.prodan@gmail.com>
This commit is contained in:
parent
2b7df95c78
commit
68d6ba10db
|
@ -21,10 +21,6 @@ type HelmReleaseSpec struct {
|
||||||
// +required
|
// +required
|
||||||
Interval metav1.Duration `json:"interval"`
|
Interval metav1.Duration `json:"interval"`
|
||||||
|
|
||||||
// KubeConfig for reconciling the HelmRelease on a remote cluster.
|
|
||||||
// +optional
|
|
||||||
KubeConfig *KubeConfig `json:"kubeConfig,omitempty"`
|
|
||||||
|
|
||||||
// Suspend tells the controller to suspend reconciliation for this HelmRelease,
|
// Suspend tells the controller to suspend reconciliation for this HelmRelease,
|
||||||
// it does not apply to already started reconciliations. Defaults to false.
|
// it does not apply to already started reconciliations. Defaults to false.
|
||||||
// +optional
|
// +optional
|
||||||
|
@ -89,6 +85,16 @@ type HelmReleaseSpec struct {
|
||||||
// Values holds the values for this Helm release.
|
// Values holds the values for this Helm release.
|
||||||
// +optional
|
// +optional
|
||||||
Values *apiextensionsv1.JSON `json:"values,omitempty"`
|
Values *apiextensionsv1.JSON `json:"values,omitempty"`
|
||||||
|
|
||||||
|
// KubeConfig for reconciling the HelmRelease on a remote cluster.
|
||||||
|
// When specified, KubeConfig takes precedence over ServiceAccountName.
|
||||||
|
// +optional
|
||||||
|
KubeConfig *KubeConfig `json:"kubeConfig,omitempty"`
|
||||||
|
|
||||||
|
// The name of the Kubernetes service account to impersonate
|
||||||
|
// when reconciling this HelmRelease.
|
||||||
|
// +optional
|
||||||
|
ServiceAccountName string `json:"serviceAccountName,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// KubeConfig references a Kubernetes secret that contains a kubeconfig file.
|
// KubeConfig references a Kubernetes secret that contains a kubeconfig file.
|
||||||
|
@ -824,6 +830,80 @@ spec:
|
||||||
memory: 64Mi
|
memory: 64Mi
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Role-based access control
|
||||||
|
|
||||||
|
By default, a `HelmRelease` runs under the cluster admin account and can create, modify, delete cluster level objects
|
||||||
|
(cluster roles, cluster role binding, CRDs, etc) and namespeced objects (deployments, ingresses, etc).
|
||||||
|
For certain `HelmReleases` a cluster admin may wish to control what types of Kubernetes objects can
|
||||||
|
be reconciled and under which namespace.
|
||||||
|
To restrict a `HelmRelease`, one can assign a service account under which the reconciliation is performed.
|
||||||
|
|
||||||
|
Assuming you want to restrict a group of `HelmReleases` to a single namespace, you can create an account
|
||||||
|
with a role binding that grants access only to that namespace:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Namespace
|
||||||
|
metadata:
|
||||||
|
name: webapp
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ServiceAccount
|
||||||
|
metadata:
|
||||||
|
name: webapp-reconciler
|
||||||
|
namespace: webapp
|
||||||
|
---
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
|
kind: Role
|
||||||
|
metadata:
|
||||||
|
name: webapp-reconciler
|
||||||
|
namespace: webapp
|
||||||
|
rules:
|
||||||
|
- apiGroups: ['*']
|
||||||
|
resources: ['*']
|
||||||
|
verbs: ['*']
|
||||||
|
---
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
|
kind: RoleBinding
|
||||||
|
metadata:
|
||||||
|
name: webapp-reconciler
|
||||||
|
namespace: webapp
|
||||||
|
roleRef:
|
||||||
|
apiGroup: rbac.authorization.k8s.io
|
||||||
|
kind: Role
|
||||||
|
name: webapp-reconciler
|
||||||
|
subjects:
|
||||||
|
- kind: ServiceAccount
|
||||||
|
name: webapp-reconciler
|
||||||
|
namespace: webapp
|
||||||
|
```
|
||||||
|
|
||||||
|
> **Note** that the namespace, RBAC and service account manifests should be
|
||||||
|
> placed in a Git source and applied with a Kustomization.
|
||||||
|
|
||||||
|
Create a `HelmRelease` that prevents altering the cluster state outside of the `webapp` namespace:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: helm.fluxcd.io/v2beta1
|
||||||
|
kind: HelmRelease
|
||||||
|
metadata:
|
||||||
|
name: podinfo
|
||||||
|
namespace: webapp
|
||||||
|
spec:
|
||||||
|
serviceAccountName: webapp-reconciler
|
||||||
|
interval: 5m
|
||||||
|
chart:
|
||||||
|
spec:
|
||||||
|
chart: podinfo
|
||||||
|
sourceRef:
|
||||||
|
kind: HelmRepository
|
||||||
|
name: podinfo
|
||||||
|
```
|
||||||
|
|
||||||
|
When the controller reconciles the `podinfo` release, it will impersonate the `webapp-reconciler`
|
||||||
|
account. If the chart contains cluster level objects like CRDs, the reconciliation will fail since
|
||||||
|
the account it runs under has no permissions to alter objects outside of the `webapp` namespace.
|
||||||
|
|
||||||
## Remote Clusters / Cluster-API
|
## Remote Clusters / Cluster-API
|
||||||
|
|
||||||
If the `spec.kubeConfig` field is set, Helm actions will run against the default cluster specified
|
If the `spec.kubeConfig` field is set, Helm actions will run against the default cluster specified
|
||||||
|
|
Loading…
Reference in New Issue