-
Notifications
You must be signed in to change notification settings - Fork 35
fix(operations): replace the component removal recipe that undoes itself #684
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
67a4fbe
34825aa
0e431eb
f621e84
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -41,6 +41,7 @@ Bundles have optional components that need to be explicitly enabled (included) i | |
| Regular bundle components can, on the other hand, be disabled (excluded) from the installation, when you don't need them. | ||
|
|
||
| Use `bundles.enabledPackages` and `bundles.disabledPackages` in the Platform Package values. | ||
| Every entry in those lists is a fully-qualified name under the `cozystack.` prefix — run `kubectl get packagesource` to see the exact names on your cluster. `kubectl get package` answers only for `disabledPackages`, because an optional component has no Package object until its name is already in `enabledPackages`. | ||
| For example, [installing Cozystack in Hetzner]({{% ref "/docs/v1.0/install/providers/hetzner" %}}) | ||
| requires swapping default load balancer, MetalLB, with one made specifically for Hetzner, called RobotLB: | ||
|
|
||
|
|
@@ -56,16 +57,37 @@ spec: | |
| values: | ||
| bundles: | ||
| disabledPackages: | ||
| - metallb | ||
| - cozystack.metallb | ||
| enabledPackages: | ||
| - hetzner-robotlb | ||
| - cozystack.hetzner-robotlb | ||
| # rest of the config | ||
| ``` | ||
|
|
||
| Disabling components must be done before installing Cozystack. | ||
| Applying updated configuration with `disabledPackages` will not remove components that are already installed. | ||
| To remove already installed components, delete the Helm release manually using this command: | ||
| Disabling a component before installing Cozystack keeps it out of the installation entirely. | ||
|
|
||
| On v1.0 the platform does not annotate the Packages it renders with `helm.sh/resource-policy: keep`, so adding a name to `disabledPackages` also removes the component when it is already installed. The next platform reconcile drops the Package, the operator's ownerReference takes the component's HelmRelease with it, and Flux uninstalls the release. There is no second command and no confirmation step, so back up anything you still need before making that edit. | ||
|
|
||
| {{% alert title="Warning" color="warning" %}} | ||
| Uninstalling the component's Helm release destroys more than the workloads. Anything the chart rendered as an ordinary template without `helm.sh/resource-policy: keep` goes with the release, CRDs and namespaces included, and Kubernetes deletes every custom resource of those CRD kinds along with them. Removing `cozystack.metallb` takes every CRD the MetalLB chart bundles, subcharts included, and with them every custom resource of those kinds cluster-wide; removing `cozystack.cozystack-basics` takes the `cozy-public` and `tenant-root` namespaces and everything stored in them, which is every application in the root tenant. Back up anything you still need first. | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [MAJOR] the v0 tree keeps the bare command and gets none of the warning Out of this diff, and pre-existing, so a follow-up PR is a fine resolution. Raising it here because it is the same gap you folded v1.0 in to close last round, and v0 is the last tree still carrying the original line: $ grep -n 'kubectl delete hr' content/en/docs/v0/operations/configuration/components.md
66:kubectl delete hr -n <namespace> <component>
$ grep -c '^content/en/docs/v0/' /tmp/...-files.txt
0The page is published and carries no deprecation banner: $ sed -n '236,239p' hugo.yaml
- version: "v0"
url: "/docs/v0/"
id: "v0"
order: 1The destruction the Warning describes belongs to
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Folded in here rather than deferred, at f621e84. v0 keeps its recipe and gets the warning ahead of the command. I checked |
||
| {{% /alert %}} | ||
|
|
||
| The namespace a component installs into is the exception: the operator applies that one itself, outside the component's release and with no ownerReference, so the uninstall never had it to remove. | ||
|
|
||
| The removal starts when the operator picks the edit up, so take the component's releases first — the Package the selector needs goes away with the component. The operator labels every HelmRelease it renders with the name of the Package that produced it, and one Package can own several: | ||
|
|
||
| ```bash | ||
| kubectl delete hr -n <namespace> <component> | ||
| kubectl get helmrelease --all-namespaces --selector cozystack.io/package=<package-name> \ | ||
| --output custom-columns='NAMESPACE:.metadata.namespace,NAME:.metadata.name,SUSPENDED:.spec.suspend' | ||
| ``` | ||
|
|
||
| Clear `spec.suspend` on any release that shows `true` before making the edit. Flux skips the uninstall for a suspended HelmRelease and only drops its own finalizer, so that release disappears with everything it installed left behind and nothing left managing it. | ||
|
|
||
| Then wait on each release from the listing to know the destructive part has finished: | ||
|
|
||
| ```bash | ||
| kubectl wait --for=delete helmrelease/<name> --namespace <namespace> --timeout=10m | ||
| ``` | ||
|
|
||
| `kubectl wait --for=delete` exits 0 for a name that was never there, silently and with nothing to tell it apart from a deletion it watched, so take both values from the listing rather than guessing them. A returned wait says the HelmRelease is gone, not that the uninstall ran. | ||
|
|
||
| `kubectl delete hr` is not a lighter-weight way to do the same thing. Flux uninstalls the release when an unsuspended HelmRelease goes away, so it destroys the same CRDs and custom resources, and then the Package recreates the HelmRelease and the chart reinstalls. The workloads come back, the custom resources do not. If you have run it before, those custom resources are already gone and have to be recreated from your own manifests or a backup. | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[MINOR] No signal for when the destructive uninstall has actually finished
internal/operator/package_reconciler.go registers no finalizer on Package (verified: the only finalizer usage in the tree belongs to an unrelated tapmaterializer reconciler), so kubectl delete package.cozystack.io returns as soon as the Package object itself is gone. The owned HelmRelease's deletion, and the helm uninstall inside it that destroys the CRDs/namespaces the Warning describes, proceeds asynchronously afterward via the ownerReference cascade. The recipe has no follow-up check for confirming the destructive step is actually done. Same text is duplicated identically at v1.1:84, v1.2:89, v1.3:89, v1.4:89, v1.5:89, v1.6:89.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added a wait after the delete:
with a line saying why the delete returns early.