mirror of
https://github.com/zalando/postgres-operator.git
synced 2026-10-09 06:45:49 +02:00
Feat: enable owner references (#2688)
* feat(498): Add ownerReferences to managed entities * empty owner reference for cross namespace secret and more tests * update ownerReferences of existing resources * removing ownerReference requires Update API call * CR ownerReference on PVC blocks pvc retention policy of statefulset * make ownerreferences optional and disabled by default * update unit test to check len ownerReferences * update codegen * add owner references e2e test * update unit test * add block_owner_deletion field to test owner reference * fix typos and update docs once more * reflect code feedback --------- Co-authored-by: Max Begenau <max@begenau.com>
This commit is contained in:
co-authored by
Max Begenau
parent
d5a88f571a
commit
a87307e56b
+62
-8
@@ -223,9 +223,9 @@ configuration:
|
||||
|
||||
Now, every cluster manifest must contain the configured annotation keys to
|
||||
trigger the delete process when running `kubectl delete pg`. Note, that the
|
||||
`Postgresql` resource would still get deleted as K8s' API server does not
|
||||
block it. Only the operator logs will tell, that the delete criteria wasn't
|
||||
met.
|
||||
`Postgresql` resource would still get deleted because the operator does not
|
||||
instruct K8s' API server to block it. Only the operator logs will tell, that
|
||||
the delete criteria was not met.
|
||||
|
||||
**cluster manifest**
|
||||
|
||||
@@ -243,11 +243,65 @@ spec:
|
||||
|
||||
In case, the resource has been deleted accidentally or the annotations were
|
||||
simply forgotten, it's safe to recreate the cluster with `kubectl create`.
|
||||
Existing Postgres cluster are not replaced by the operator. But, as the
|
||||
original cluster still exists the status will show `CreateFailed` at first.
|
||||
On the next sync event it should change to `Running`. However, as it is in
|
||||
fact a new resource for K8s, the UID will differ which can trigger a rolling
|
||||
update of the pods because the UID is used as part of backup path to S3.
|
||||
Existing Postgres cluster are not replaced by the operator. But, when the
|
||||
original cluster still exists the status will be `CreateFailed` at first. On
|
||||
the next sync event it should change to `Running`. However, because it is in
|
||||
fact a new resource for K8s, the UID and therefore, the backup path to S3,
|
||||
will differ and trigger a rolling update of the pods.
|
||||
|
||||
## Owner References and Finalizers
|
||||
|
||||
The Postgres Operator can set [owner references](https://kubernetes.io/docs/concepts/overview/working-with-objects/owners-dependents/) to most of a cluster's child resources to improve
|
||||
monitoring with GitOps tools and enable cascading deletes. There are three
|
||||
exceptions:
|
||||
|
||||
* Persistent Volume Claims, because they are handled by the [PV Reclaim Policy]https://kubernetes.io/docs/tasks/administer-cluster/change-pv-reclaim-policy/ of the Stateful Set
|
||||
* The config endpoint + headless service resource because it is managed by Patroni
|
||||
* Cross-namespace secrets, because owner references are not allowed across namespaces by design
|
||||
|
||||
The operator would clean these resources up with its regular delete loop
|
||||
unless they got synced correctly. If for some reason the initial cluster sync
|
||||
fails, e.g. after a cluster creation or operator restart, a deletion of the
|
||||
cluster manifest would leave orphaned resources behind which the user has to
|
||||
clean up manually.
|
||||
|
||||
Another option is to enable finalizers which first ensures the deletion of all
|
||||
child resources before the cluster manifest gets removed. There is a trade-off
|
||||
though: The deletion is only performed after the next two operator SYNC cycles
|
||||
with the first one setting a `deletionTimestamp` and the latter reacting to it.
|
||||
The final removal of the custom resource will add a DELETE event to the worker
|
||||
queue but the child resources are already gone at this point. If you do not
|
||||
desire this behavior consider enabling owner references instead.
|
||||
|
||||
**postgres-operator ConfigMap**
|
||||
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: postgres-operator
|
||||
data:
|
||||
enable_finalizers: "false"
|
||||
enable_owner_references: "true"
|
||||
```
|
||||
|
||||
**OperatorConfiguration**
|
||||
|
||||
```yaml
|
||||
apiVersion: "acid.zalan.do/v1"
|
||||
kind: OperatorConfiguration
|
||||
metadata:
|
||||
name: postgresql-operator-configuration
|
||||
configuration:
|
||||
kubernetes:
|
||||
enable_finalizers: false
|
||||
enable_owner_references: true
|
||||
```
|
||||
|
||||
:warning: Please note, both options are disabled by default. When enabling owner
|
||||
references the operator cannot block cascading deletes, even when the [delete protection annotations](administrator.md#delete-protection-via-annotations)
|
||||
are in place. You would need an K8s admission controller that blocks the actual
|
||||
`kubectl delete` API call e.g. based on existing annotations.
|
||||
|
||||
## Role-based access control for the operator
|
||||
|
||||
|
||||
Reference in New Issue
Block a user