Upgrading a cluster with new annotations for all resources break the reconciliation
Summary
Upgrading an existing and running cluster by adding a new annotation for all resources using .spec.metadata.annotations.allResources
break the reconciliation cycle that is no longer capable of update the cluster resources.
Current Behaviour
After upgrading the cluster by adding a new annotation in .spec.metadata.annotations.allResources
the reconciliation cycle stop updating resources throwing the following exception:
2021-03-29 10:06:10,903 ERROR [io.st.op.re.AbstractReconciliationCycle] (Cluster-ReconciliationCycle) 27| Cluster reconciliation cycle failed reconciling operator-upgrade-6061a43f.operator-upgrade-1: io.fabric8.kubernetes.client.KubernetesClientException: Failure executing: PATCH at: https://10.96.0.1/apis/apps/v1/namespaces/operator-upgrade-6061a43f/statefulsets/operator-upgrade-1. Message: StatefulSet.apps "operator-upgrade-1" is invalid: spec: Forbidden: updates to statefulset spec for fields other than 'replicas', 'template', and 'updateStrategy' are forbidden. Received status: Status(apiVersion=v1, code=422, details=StatusDetails(causes=[StatusCause(field=spec, message=Forbidden: updates to statefulset spec for fields other than 'replicas', 'template', and 'updateStrategy' are forbidden, reason=FieldValueForbidden, additionalProperties={})], group=apps, kind=StatefulSet, name=operator-upgrade-1, retryAfterSeconds=null, uid=null, additionalProperties={}), kind=Status, message=StatefulSet.apps "operator-upgrade-1" is invalid: spec: Forbidden: updates to statefulset spec for fields other than 'replicas', 'template', and 'updateStrategy' are forbidden, metadata=ListMeta(_continue=null, remainingItemCount=null, resourceVersion=null, selfLink=null, additionalProperties={}), reason=Invalid, status=Failure, additionalProperties={}).
at io.fabric8.kubernetes.client.dsl.base.OperationSupport.requestFailure(OperationSupport.java:568)
at io.fabric8.kubernetes.client.dsl.base.OperationSupport.assertResponseCode(OperationSupport.java:507)
at io.fabric8.kubernetes.client.dsl.base.OperationSupport.handleResponse(OperationSupport.java:471)
at io.fabric8.kubernetes.client.dsl.base.OperationSupport.handleResponse(OperationSupport.java:430)
at io.fabric8.kubernetes.client.dsl.base.OperationSupport.handlePatch(OperationSupport.java:316)
at io.fabric8.kubernetes.client.dsl.base.BaseOperation.handlePatch(BaseOperation.java:812)
at io.fabric8.kubernetes.client.dsl.base.HasMetadataOperation.lambda$patch$2(HasMetadataOperation.java:133)
at io.fabric8.kubernetes.api.model.apps.DoneableStatefulSet.done(DoneableStatefulSet.java:27)
at io.fabric8.kubernetes.api.model.apps.DoneableStatefulSet.done(DoneableStatefulSet.java:6)
at io.fabric8.kubernetes.client.dsl.base.HasMetadataOperation.patch(HasMetadataOperation.java:139)
at io.fabric8.kubernetes.client.dsl.internal.RollableScalableResourceOperation.patch(RollableScalableResourceOperation.java:177)
at io.fabric8.kubernetes.client.dsl.internal.RollableScalableResourceOperation.patch(RollableScalableResourceOperation.java:43)
at io.stackgres.operatorframework.resource.AbstractResourceHandler.patch(AbstractResourceHandler.java:62)
at io.stackgres.operator.cluster.handler.ClusterStatefulSetHandler_ClientProxy.patch(ClusterStatefulSetHandler_ClientProxy.zig:244)
at io.stackgres.operatorframework.resource.AbstractResourceHandlerSelector.patch(AbstractResourceHandlerSelector.java:79)
at io.stackgres.operator.resource.ClusterResourceHandlerSelector_ClientProxy.patch(ClusterResourceHandlerSelector_ClientProxy.zig:366)
at io.stackgres.operatorframework.reconciliation.AbstractReconciliator.createOrUpdateRequiredResources(AbstractReconciliator.java:152)
at io.stackgres.operatorframework.reconciliation.AbstractReconciliator.reconcile(AbstractReconciliator.java:56)
at io.stackgres.operatorframework.reconciliation.AbstractReconciliationCycle.reconciliationCycle(AbstractReconciliationCycle.java:136)
at io.stackgres.operatorframework.reconciliation.AbstractReconciliationCycle.reconciliationCycleLoop(AbstractReconciliationCycle.java:86)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Steps to reproduce
- Create a sgcluster
- Wait for the cluster pods to be created
- Update the sgcluster by adding any annotation under
.spec.metadata.annotations.allResources
Expected Behaviour
The cluster resources are updated with the new annoation
Possible Solution
Avoid update annotations of StatefulSet field .spec.volumeClaimTemplates[0].metadata.annotations
Environment
- StackGres version: 0.9.5-SNAPSHOT
- Kubernetes version: 1.15.11 (kind)
- Cloud provider or hardware configuration: 8 cores / 512GB SSD
Relevant logs and/or screenshots
After enabling HTTP logs for operator kubernetes client:
kubectl set env -n stackgres deployment/stackgres-operator JAVA_OPTS=-Dquarkus.log.category.\"okhttp3.logging.HttpLoggingInterceptor\".level=TRACE
Relevant log of failed StatefulSet PATCH:
2021-03-29 10:13:28,657 INFO [ok.OkHttpClient] (Cluster-ReconciliationCycle) --> PATCH https://10.96.0.1/apis/apps/v1/namespaces/default/statefulsets/stackgres http/1.1
2021-03-29 10:13:28,657 INFO [ok.OkHttpClient] (Cluster-ReconciliationCycle) Content-Type: application/json-patch+json; charset=utf-8
2021-03-29 10:13:28,657 INFO [ok.OkHttpClient] (Cluster-ReconciliationCycle) Content-Length: 11605
2021-03-29 10:13:28,657 INFO [ok.OkHttpClient] (Cluster-ReconciliationCycle) Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IkhtS2F4cU0tS2FmcGdKMTlTb2JIUGZJTlh4UDZZbk9JSmlHdTh4Z3BhclUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3Vu
dC9uYW1lc3BhY2UiOiJzdGFja2dyZXMiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlY3JldC5uYW1lIjoic3RhY2tncmVzLW9wZXJhdG9yLXRva2VuLWI3ZmZwIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6InN0YWNrZ3Jlcy1vcGVyYXRvciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2V
ydmljZS1hY2NvdW50LnVpZCI6ImY5YjhkZTliLWU1M2YtNDgwMC1hOWVjLTY5YWJjNjI5ZTE2MSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpzdGFja2dyZXM6c3RhY2tncmVzLW9wZXJhdG9yIn0.ZHcCUtMT3FyEhuNejj2KS5XdZdqQRzfuKnkkCc4kmYd8RuDH309VdkVHIvctvDfccA5bo7OeY9lovigXbms-rDI34m7AmpcDxTxIubZfVzqr5chXgSNmwp
LcksHUv-HntL2j_I-qEjvbMqj4zVidMZJjFn5AHXlfakoG4ttV_8NVWYjEthujFkkJvIAxm9yAcXJcJe5vyvPS8cJc1fnQifKdg8VSOBgwvLCjogudxPLOIWIpWzeHe7BdC1DcFMe7dZWx7PN7Ui0bitUnfrpkRRxhA6quNxOfK923G_Y1Oc1q-6Zrcaly9LaAkG4o2aTwCphNF7VMkXbTH1cEORGKFA
2021-03-29 10:13:28,657 INFO [ok.OkHttpClient] (Cluster-ReconciliationCycle) Host: 10.96.0.1
2021-03-29 10:13:28,657 INFO [ok.OkHttpClient] (Cluster-ReconciliationCycle) Connection: Keep-Alive
2021-03-29 10:13:28,657 INFO [ok.OkHttpClient] (Cluster-ReconciliationCycle) Accept-Encoding: gzip
2021-03-29 10:13:28,657 INFO [ok.OkHttpClient] (Cluster-ReconciliationCycle) User-Agent: okhttp/3.12.6
2021-03-29 10:13:28,657 INFO [ok.OkHttpClient] (Cluster-ReconciliationCycle)
2021-03-29 10:13:28,657 INFO [ok.OkHttpClient] (Cluster-ReconciliationCycle) [{"op":"add","path":"/metadata/annotations","value":{"test":"ñññ"}},{"op":"add","path":"/spec/template/metadata/annotations/test","value":"ñññ"},{"op":"add","path":"/spec/template/spec/containers/0
/volumeMounts/0/readOnly","value":false},{"op":"add","path":"/spec/template/spec/containers/0/volumeMounts/1/readOnly","value":false},{"op":"add","path":"/spec/template/spec/containers/0/volumeMounts/2/readOnly","value":false},{"op":"add","path":"/spec/template/spec/containe
rs/0/volumeMounts/3/readOnly","value":false},{"op":"add","path":"/spec/template/spec/containers/0/volumeMounts/4/readOnly","value":false},{"op":"add","path":"/spec/template/spec/containers/0/volumeMounts/9/readOnly","value":false},{"op":"add","path":"/spec/template/spec/cont
ainers/0/volumeMounts/10/readOnly","value":false},{"op":"add","path":"/spec/template/spec/containers/0/volumeMounts/11/readOnly","value":false},{"op":"add","path":"/spec/template/spec/containers/0/volumeMounts/12/readOnly","value":false},{"op":"replace","path":"/spec/templat
e/spec/containers/1/image","value":"docker.io/ongres/postgres-util:v12.3-build-6.0"},{"op":"replace","path":"/spec/template/spec/containers/1/name","value":"postgres-util"},{"op":"add","path":"/spec/template/spec/containers/1/volumeMounts/0/readOnly","value":false},{"op":"mo
ve","path":"/spec/template/spec/containers/2/volumeMounts/1","from":"/spec/template/spec/containers/1/volumeMounts/1"},{"op":"move","path":"/spec/template/spec/containers/1/args","from":"/spec/template/spec/containers/2/args"},{"op":"move","path":"/spec/template/spec/contain
ers/1/command","from":"/spec/template/spec/containers/2/command"},{"op":"move","path":"/spec/template/spec/containers/1/stdin","from":"/spec/template/spec/containers/2/stdin"},{"op":"move","path":"/spec/template/spec/containers/1/tty","from":"/spec/template/spec/containers/2
/tty"},{"op":"replace","path":"/spec/template/spec/containers/2/image","value":"docker.io/ongres/pgbouncer:v1.13.0-build-6.0"},{"op":"replace","path":"/spec/template/spec/containers/2/name","value":"pgbouncer"},{"op":"add","path":"/spec/template/spec/containers/2/volumeMount
s/0/readOnly","value":false},{"op":"replace","path":"/spec/template/spec/containers/3/args/0","value":"CONFIG_PATH=/etc/fluent-bit\nupdate_config() {\n rm -Rf \"$PG_LOG_PATH/last_config\"\n cp -Lr \"$CONFIG_PATH\" \"$PG_LOG_PATH/last_config\"\n}\n\nhas_config_changed() {\n
for file in $(ls -1 \"$CONFIG_PATH\")\n do\n [ \"$(cat \"$CONFIG_PATH/$file\" | md5sum)\" \\\n != \"$(cat \"$PG_LOG_PATH/last_config/$file\" | md5sum)\" ] \\\n && return || true\n done\n return 1\n}\n\nrun_fluentbit() {\n set -x\n exec /usr/local/bin/flue
nt-bit \\\n -c /etc/fluent-bit/fluentbit.conf\n}\n\nset +x\nwhile true\ndo\n if has_config_changed || [ ! -d \"/proc/$PID\" ]\n then\n update_config\n if [ -n \"$PID\" ]\n then\n kill \"$PID\"\n wait \"$PID\" || true\n fi\n run_fluentbit &\n
PID=\"$!\"\n fi\n sleep 5\ndone\n"},{"op":"replace","path":"/spec/template/spec/containers/3/env/0/name","value":"ETC_PASSWD_PATH"},{"op":"replace","path":"/spec/template/spec/containers/3/env/0/value","value":"/etc/passwd"},{"op":"replace","path":"/spec/template/spec/cont
ainers/3/env/1/name","value":"ETC_GROUP_PATH"},{"op":"replace","path":"/spec/template/spec/containers/3/env/1/value","value":"/etc/group"},{"op":"replace","path":"/spec/template/spec/containers/3/env/2/name","value":"ETC_SHADOW_PATH"},{"op":"replace","path":"/spec/template/s
pec/containers/3/env/2/value","value":"/etc/shadow"},{"op":"replace","path":"/spec/template/spec/containers/3/env/3/name","value":"ETC_GSHADOW_PATH"},{"op":"replace","path":"/spec/template/spec/containers/3/env/3/value","value":"/etc/gshadow"},{"op":"move","path":"/spec/temp
late/spec/containers/3/env/4","from":"/spec/template/spec/containers/5/env/4"},{"op":"move","path":"/spec/template/spec/containers/3/env/5","from":"/spec/template/spec/containers/5/env/4"},{"op":"move","path":"/spec/template/spec/containers/3/env/6","from":"/spec/template/sp
ec/containers/5/env/4"},{"op":"move","path":"/spec/template/spec/containers/3/env/7","from":"/spec/template/spec/containers/5/env/4"},{"op":"move","path":"/spec/template/spec/containers/3/env/8","from":"/spec/template/spec/containers/5/env/4"},{"op":"move","path":"/spec/temp
late/spec/containers/3/env/9","from":"/spec/template/spec/containers/5/env/4"},{"op":"move","path":"/spec/template/spec/containers/3/env/10","from":"/spec/template/spec/containers/5/env/4"},{"op":"move","path":"/spec/template/spec/containers/3/env/11","from":"/spec/template/
spec/containers/5/env/4"},{"op":"move","path":"/spec/template/spec/containers/3/env/12","from":"/spec/template/spec/containers/5/env/4"},{"op":"move","path":"/spec/template/spec/containers/3/env/13","from":"/spec/template/spec/containers/5/env/4"},{"op":"move","path":"/spec/
template/spec/containers/3/env/14","from":"/spec/template/spec/containers/5/env/4"},{"op":"move","path":"/spec/template/spec/containers/3/env/15","from":"/spec/template/spec/containers/5/env/4"},{"op":"move","path":"/spec/template/spec/containers/3/env/16","from":"/spec/temp
late/spec/containers/5/env/4"},{"op":"move","path":"/spec/template/spec/containers/3/env/17","from":"/spec/template/spec/containers/5/env/4"},{"op":"move","path":"/spec/template/spec/containers/3/env/18","from":"/spec/template/spec/containers/5/env/4"},{"op":"move","path":"/
spec/template/spec/containers/3/env/19","from":"/spec/template/spec/containers/5/env/4"},{"op":"move","path":"/spec/template/spec/containers/3/env/20","from":"/spec/template/spec/containers/5/env/4"},{"op":"move","path":"/spec/template/spec/containers/3/env/21","from":"/spec
/template/spec/containers/5/env/4"},{"op":"move","path":"/spec/template/spec/containers/3/env/22","from":"/spec/template/spec/containers/5/env/4"},{"op":"move","path":"/spec/template/spec/containers/3/env/23","from":"/spec/template/spec/containers/5/env/4"},{"op":"move","pat
h":"/spec/template/spec/containers/3/env/24","from":"/spec/template/spec/containers/5/env/4"},{"op":"move","path":"/spec/template/spec/containers/3/env/25","from":"/spec/template/spec/containers/5/env/4"},{"op":"move","path":"/spec/template/spec/containers/3/env/26","from":"
/spec/template/spec/containers/5/env/4"},{"op":"move","path":"/spec/template/spec/containers/3/env/27","from":"/spec/template/spec/containers/5/env/4"},{"op":"move","path":"/spec/template/spec/containers/3/env/28","from":"/spec/template/spec/containers/5/env/4"},{"op":"move"
,"path":"/spec/template/spec/containers/3/env/29","from":"/spec/template/spec/containers/5/env/4"},{"op":"move","path":"/spec/template/spec/containers/3/env/30","from":"/spec/template/spec/containers/5/env/4"},{"op":"move","path":"/spec/template/spec/containers/3/env/31","fr
om":"/spec/template/spec/containers/5/env/4"},{"op":"move","path":"/spec/template/spec/containers/3/env/32","from":"/spec/template/spec/containers/5/env/4"},{"op":"move","path":"/spec/template/spec/containers/3/env/33","from":"/spec/template/spec/containers/5/env/4"},{"op":"
move","path":"/spec/template/spec/containers/3/env/34","from":"/spec/template/spec/containers/5/env/4"},{"op":"replace","path":"/spec/template/spec/containers/3/image","value":"docker.io/ongres/fluentbit:v1.4.6-build-6.0"},{"op":"replace","path":"/spec/template/spec/containe
rs/3/name","value":"fluent-bit"},{"op":"remove","path":"/spec/template/spec/containers/3/ports"},{"op":"replace","path":"/spec/template/spec/containers/3/volumeMounts/0/mountPath","value":"/var/log/postgresql"},{"op":"replace","path":"/spec/template/spec/containers/3/volumeM
ounts/0/name","value":"local"},{"op":"add","path":"/spec/template/spec/containers/3/volumeMounts/0/readOnly","value":false},{"op":"move","path":"/spec/template/spec/containers/3/volumeMounts/0/subPath","from":"/spec/template/spec/containers/5/volumeMounts/0/subPath"},{"op":"
replace","path":"/spec/template/spec/containers/3/volumeMounts/1/mountPath","value":"/etc/fluent-bit"},{"op":"replace","path":"/spec/template/spec/containers/3/volumeMounts/1/name","value":"fluent-bit"},{"op":"move","path":"/spec/template/spec/containers/5/volumeMounts/1/sub
Path","from":"/spec/template/spec/containers/3/volumeMounts/1/subPath"},{"op":"move","path":"/spec/template/spec/containers/3/stdin","from":"/spec/template/spec/containers/5/stdin"},{"op":"move","path":"/spec/template/spec/containers/3/tty","from":"/spec/template/spec/contai
ners/5/tty"},{"op":"replace","path":"/spec/template/spec/containers/5/args/0","value":"run_postgres_exporter() {\n set -x\n exec /usr/local/bin/postgres_exporter \\\n --log.level=info\n}\n\nset +x\nwhile true\ndo\n if ( [ -z \"$PID\" ] || [ ! -d \"/proc/$PID\" ] ) \\\n
&& [ -S '/var/run/postgresql/.s.PGSQL.5432' ]\n then\n if [ -n \"$PID\" ]\n then\n kill \"$PID\"\n wait \"$PID\" || true\n fi\n run_postgres_exporter &\n PID=\"$!\"\n fi\n sleep 5\ndone\n"},{"op":"replace","path":"/spec/template/spec/container
s/5/env/0/name","value":"PGAPPNAME"},{"op":"replace","path":"/spec/template/spec/containers/5/env/0/value","value":"prometheus-postgres-exporter"},{"op":"replace","path":"/spec/template/spec/containers/5/env/1/name","value":"DATA_SOURCE_NAME"},{"op":"replace","path":"/spec/t
emplate/spec/containers/5/env/1/value","value":"postgresql://postgres@:5432/postgres?host=/var/run/postgresql&sslmode=disable"},{"op":"replace","path":"/spec/template/spec/containers/5/env/2/name","value":"PG_EXPORTER_EXTEND_QUERY_PATH"},{"op":"replace","path":"/spec/templat
e/spec/containers/5/env/2/value","value":"/var/opt/postgres-exporter/queries.yaml"},{"op":"replace","path":"/spec/template/spec/containers/5/env/3/name","value":"PG_EXPORTER_CONSTANT_LABELS"},{"op":"replace","path":"/spec/template/spec/containers/5/env/3/value","value":"clus
ter_name=stackgres, namespace=default"},{"op":"replace","path":"/spec/template/spec/containers/5/image","value":"docker.io/ongres/prometheus-postgres-exporter:v0.8.0-build-6.0"},{"op":"replace","path":"/spec/template/spec/containers/5/name","value":"prometheus-postgres-expor
ter"},{"op":"replace","path":"/spec/template/spec/containers/5/volumeMounts/0/mountPath","value":"/var/run/postgresql"},{"op":"replace","path":"/spec/template/spec/containers/5/volumeMounts/0/name","value":"socket"},{"op":"add","path":"/spec/template/spec/containers/5/volume
Mounts/0/readOnly","value":false},{"op":"replace","path":"/spec/template/spec/containers/5/volumeMounts/1/mountPath","value":"/var/opt/postgres-exporter/queries.yaml"},{"op":"replace","path":"/spec/template/spec/containers/5/volumeMounts/1/name","value":"queries"},{"op":"add
","path":"/spec/template/spec/containers/5/ports","value":[{"containerPort":9187}]},{"op":"add","path":"/spec/template/spec/initContainers/0/volumeMounts/0/readOnly","value":false},{"op":"add","path":"/spec/template/spec/initContainers/0/volumeMounts/1/readOnly","value":fals
e},{"op":"add","path":"/spec/template/spec/initContainers/1/volumeMounts/0/readOnly","value":false},{"op":"add","path":"/spec/template/spec/initContainers/1/volumeMounts/1/readOnly","value":false},{"op":"add","path":"/spec/template/spec/initContainers/2/volumeMounts/0/readOn
ly","value":false},{"op":"add","path":"/spec/template/spec/initContainers/2/volumeMounts/1/readOnly","value":false},{"op":"move","path":"/spec/template/spec/volumes/10","from":"/spec/template/spec/volumes/12"},{"op":"move","path":"/spec/template/spec/volumes/11","from":"/spe
c/template/spec/volumes/12"},{"op":"add","path":"/spec/volumeClaimTemplates/0/metadata/annotations","value":{"test":"ñññ"}}]
2021-03-29 10:13:28,657 INFO [ok.OkHttpClient] (Cluster-ReconciliationCycle) --> END PATCH (11605-byte body)
2021-03-29 10:13:28,678 INFO [ok.OkHttpClient] (Cluster-ReconciliationCycle) <-- 422 Unprocessable Entity https://10.96.0.1/apis/apps/v1/namespaces/default/statefulsets/stackgres (20ms)
2021-03-29 10:13:28,678 INFO [ok.OkHttpClient] (Cluster-ReconciliationCycle) Cache-Control: no-cache, private
2021-03-29 10:13:28,678 INFO [ok.OkHttpClient] (Cluster-ReconciliationCycle) Content-Type: application/json
2021-03-29 10:13:28,678 INFO [ok.OkHttpClient] (Cluster-ReconciliationCycle) Date: Mon, 29 Mar 2021 10:13:28 GMT
2021-03-29 10:13:28,678 INFO [ok.OkHttpClient] (Cluster-ReconciliationCycle) Content-Length: 538
2021-03-29 10:13:28,678 INFO [ok.OkHttpClient] (Cluster-ReconciliationCycle)
2021-03-29 10:13:28,678 INFO [ok.OkHttpClient] (Cluster-ReconciliationCycle) {"kind":"Status","apiVersion":"v1","metadata":{},"status":"Failure","message":"StatefulSet.apps \"stackgres\" is invalid: spec: Forbidden: updates to statefulset spec for fields other than 'replica
s', 'template', and 'updateStrategy' are forbidden","reason":"Invalid","details":{"name":"stackgres","group":"apps","kind":"StatefulSet","causes":[{"reason":"FieldValueForbidden","message":"Forbidden: updates to statefulset spec for fields other than 'replicas', 'template', and 'updateStrategy' are forbidden","field":"spec"}]},"code":422}
2021-03-29 10:13:28,678 INFO [ok.OkHttpClient] (Cluster-ReconciliationCycle) <-- END HTTP (538-byte body)
2021-03-29 10:13:28,678 ERROR [io.st.op.re.AbstractReconciliationCycle] (Cluster-ReconciliationCycle) 409| Cluster reconciliation cycle failed reconciling default.stackgres: io.fabric8.kubernetes.client.KubernetesClientException: Failure executing: PATCH at: https://10.96.0.1/apis/apps/v1/namespaces/default/statefulsets/stackgres. Message: StatefulSet.apps "stackgres" is invalid: spec: Forbidden: updates to statefulset spec for fields other than 'replicas', 'template', and 'updateStrategy' are forbidden. Received status: Status(apiVersion=v1, code=422, details=StatusDetails(causes=[StatusCause(field=spec, message=Forbidden: updates to statefulset spec for fields other than 'replicas', 'template', and 'updateStrategy' are forbidden, reason=FieldValueForbidden, additionalProperties={})], group=apps, kind=StatefulSet, name=stackgres, retryAfterSeconds=null, uid=null, additionalProperties={}), kind=Status, message=StatefulSet.apps "stackgres" is invalid: spec: Forbidden: updates to statefulset spec for fields other than 'replicas', 'template', and 'updateStrategy' are forbidden, metadata=ListMeta(_continue=null, remainingItemCount=null, resourceVersion=null, selfLink=null, additionalProperties={}), reason=Invalid, status=Failure, additionalProperties={}).
at io.fabric8.kubernetes.client.dsl.base.OperationSupport.requestFailure(OperationSupport.java:568)
at io.fabric8.kubernetes.client.dsl.base.OperationSupport.assertResponseCode(OperationSupport.java:507)
at io.fabric8.kubernetes.client.dsl.base.OperationSupport.handleResponse(OperationSupport.java:471)
at io.fabric8.kubernetes.client.dsl.base.OperationSupport.handleResponse(OperationSupport.java:430)
at io.fabric8.kubernetes.client.dsl.base.OperationSupport.handlePatch(OperationSupport.java:316)
at io.fabric8.kubernetes.client.dsl.base.BaseOperation.handlePatch(BaseOperation.java:812)
at io.fabric8.kubernetes.client.dsl.base.HasMetadataOperation.lambda$patch$2(HasMetadataOperation.java:133)
at io.fabric8.kubernetes.api.model.apps.DoneableStatefulSet.done(DoneableStatefulSet.java:27)
at io.fabric8.kubernetes.api.model.apps.DoneableStatefulSet.done(DoneableStatefulSet.java:6)
at io.fabric8.kubernetes.client.dsl.base.HasMetadataOperation.patch(HasMetadataOperation.java:139)
at io.fabric8.kubernetes.client.dsl.internal.RollableScalableResourceOperation.patch(RollableScalableResourceOperation.java:177)
at io.fabric8.kubernetes.client.dsl.internal.RollableScalableResourceOperation.patch(RollableScalableResourceOperation.java:43)
at io.stackgres.operatorframework.resource.AbstractResourceHandler.patch(AbstractResourceHandler.java:62)
at io.stackgres.operator.cluster.handler.ClusterStatefulSetHandler_ClientProxy.patch(ClusterStatefulSetHandler_ClientProxy.zig:244)
at io.stackgres.operatorframework.resource.AbstractResourceHandlerSelector.patch(AbstractResourceHandlerSelector.java:79)
at io.stackgres.operator.resource.ClusterResourceHandlerSelector_ClientProxy.patch(ClusterResourceHandlerSelector_ClientProxy.zig:366)
at io.stackgres.operatorframework.reconciliation.AbstractReconciliator.createOrUpdateRequiredResources(AbstractReconciliator.java:152)
at io.stackgres.operatorframework.reconciliation.AbstractReconciliator.reconcile(AbstractReconciliator.java:56)
at io.stackgres.operatorframework.reconciliation.AbstractReconciliationCycle.reconciliationCycle(AbstractReconciliationCycle.java:136)
at io.stackgres.operatorframework.reconciliation.AbstractReconciliationCycle.reconciliationCycleLoop(AbstractReconciliationCycle.java:86)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)