32 Commits

Author SHA1 Message Date
Jose Diaz-Gonzalez
d134e75371 feat: support manually managed cert issuers on k3s
The `cert-issuer-name` and `cert-issuer-kind` properties point an app's generated `Certificate` at a cert-manager issuer created outside of Dokku, allowing certificates to be issued through solvers the built-in letsencrypt integration cannot use, such as `dns01` for wildcard certificates. Setting an issuer enables https on its own, as a manually managed issuer has no email for Dokku to configure. An imported certificate still takes precedence, and `letsencrypt-server false` remains the single off switch. Dokku warns before a build starts when the referenced issuer is absent from the cluster, without blocking the deploy. Wildcard domains no longer collide with their apex domain when generating ingress names, and `letsencrypt-server` values are now validated when set rather than at deploy time.
2026-08-08 15:16:12 -04:00
Jose Diaz-Gonzalez
099cf10e98 fix: match control-plane nodes by their modern label
Kubernetes 1.20 deprecated the node-role.kubernetes.io/master label and replaced it with node-role.kubernetes.io/control-plane, and 1.24 dropped the legacy label entirely. The scheduler-k3s:cluster:add join path still filtered control-plane nodes with master=true, so on any k3s release built from Kubernetes 1.24+ the lookup matched zero nodes and aborted with "no nodes found in the cluster" before the worker could join.
2026-05-31 16:24:23 -04:00
Jose Diaz-Gonzalez
09c17e1653 fix: split more report global keys into raw and computed
Three plugins still leaked the built-in default through `<plugin>-global-<property>` after the broader raw/computed split in #8640. External tooling reading `:report --format json` for drift detection could not distinguish "set to default" from "never set" - after a `:set --global` followed by an unset, the JSON still reported the default value. The `<plugin>-global-<property>` keys now hold the raw stored value (empty when nothing has been set) and `<plugin>-computed-<property>` keys hold the effective value with per-app, global, and built-in default fallback. Every global property now has a computed sibling for shape consistency, including those whose default is empty. Internal callers in `scheduler-k3s` that previously read the default-applied global helpers now consume new `getComputed*` helpers, keeping deploy-time behavior unchanged.
2026-05-25 15:33:41 -04:00
Jose Diaz-Gonzalez
ef9bdc0379 fix: split env config and image pull secret into separate helm releases
Bundling these Secrets in the app helm chart caused two bugs in the scheduler-k3s plugin: a chart rollback could delete Secrets that older ReplicaSets still referenced by exact timestamped name (`env-{app}.{ts}` and `ims-{app}.{ts}`), hard-crashing pods until manual intervention; and the strategic-merge `patchMergeKey` on `imagePullSecrets` let stale entries leak into the live Deployment until the list pointed at many nonexistent Secrets. Each Secret now lives in its own helm release with a stable name (`config-{app}` and `pull-secret-{app}`), installed before the app chart on every deploy. The deployment trigger also prunes any leaked `imagePullSecrets` entries from the live Deployment so the next deploy lands on a clean list, and the rename and destroy paths uninstall the new releases (and the previously-leaked TLS release on rename) under the old app name.
2026-04-29 12:18:03 -04:00
Jose Diaz-Gonzalez
da13367ca8 feat: add version-aware helm chart upgrade callbacks
Some helm chart upgrades require side-effects that a plain `helm upgrade` cannot perform, such as deleting deployments whose immutable selectors changed. Charts may now register pre and post upgrade hooks against a target version; applicable hooks fire in ascending semver order, each bracketed around an upgrade to its version, with a final upgrade to the chart's configured version when needed. The new `keda-add-ons-http` 0.12.2 hook deletes the chart-managed deployments before the upgrade so the new selectors take effect cleanly.
2026-04-27 07:57:38 -04:00
Jose Diaz-Gonzalez
f004dafb99 fix: wrap the TerminalSizeQueue in an adapter
This fixes an issue with the updated interface dropped in ce4d90902a
2025-12-25 20:58:24 -05:00
Jose Diaz-Gonzalez
3f70728451 feat: implement forbid/replace logic for k3s pods spawned via cron:run 2025-11-15 16:19:23 -05:00
Jose Diaz-Gonzalez
4a357e9896 fix: properly suspend and resume k8s CronJob objects when executing scheduler-cron-write 2025-11-09 23:16:38 -05:00
Jose Diaz-Gonzalez
2699f51f76 fix: respect the k3s master node version when adding a new worker to the k3s cluster
Previously, it was possible to have a kubernetes version mismatch on new worker nodes if a newer version of kubernetes was released prior to upgrading the master nodes to that version. This can sometimes cause cluster instability.

This change fetches the lowest node version associated with a master node and then uses that to install k3s on the worker node.
2025-10-12 20:28:11 -04:00
Jose Diaz-Gonzalez
d33393d3fd feat: debug failed global helm chart installations by checking all pod logs 2025-07-23 18:40:43 -04:00
Jose Diaz-Gonzalez
2dea993804 fix: also stop k8s cron tasks when calling ps:stop 2025-06-10 21:45:08 -04:00
closeobserve
9e2836fe7f chore: fix some comments
Signed-off-by: closeobserve <pingcap@yahoo.com>
2025-04-13 17:46:06 +08:00
Tasos Maschalidis
63182e80e0 Use common.ToBool to check DOKKU_FORCE_TTY 2024-12-17 19:43:16 +02:00
Tasos Maschalidis
838beb4db3 Take DOKKU_FORCE_TTY setting into account for run commands with k3s-scheduler 2024-12-17 19:11:01 +02:00
Jose Diaz-Gonzalez
233e588c3b fix: only raise nil responses for k8s list calls as errors
Empty items should just be treated as such.
2024-12-11 22:56:53 -05:00
Jose Diaz-Gonzalez
5fcbd5bbde Merge pull request #7403 from Tashows/fix-ims-k3s-run
Properly resolve imagePullSecrets from app and deploymentID if relevant property does not exist
2024-12-11 11:39:26 -05:00
Jose Diaz-Gonzalez
ed0ba7072f refactor: check to see if a deployment-specific image pull secret exists before utilizing it. 2024-12-11 09:23:44 -05:00
Tasos Maschalidis
1739d5ec16 Check if tty is actually used and support proper output when it's not 2024-12-10 14:31:36 +02:00
Jose Diaz-Gonzalez
ec41dd2e70 refactor: output logs for completed containers
Previously, a container that exited immediately would just show an error message, which is probably not what we want.

If the pod has exited, we will display the logs on stdout for the user and then exit appropriately.

This change also refactors how log streaming works so that we respect exiting when the stream has no content (such as when the container has exited). Previously, the container would just hang around forever due to not being properly canceled. Due to this refactor, the prefix is now split out into a separate writer.
2024-11-04 14:41:42 -05:00
Jose Diaz-Gonzalez
90e8cac12f feat: implement nginx:show-config for k3s plugin
This allows users to see what nginx configs are in use for their applications.

Closes #7291
2024-10-21 22:09:09 -04:00
Jose Diaz-Gonzalez
611006af73 feat: add support for non-local nginx implementations
If the scheduler is not docker-local, we will assume that a separate plugin trigger will pull access/error logs on our behalf. For k3s, the naive implementation is to pull logs from a single container (multiple ingress-nginx pods will be supported in a future release).

Closes #7268
2024-10-17 00:18:24 -04:00
Jose Diaz-Gonzalez
d4b484a33a fix: replace existing port-map ingress objects with domain ingress objects
Domains cannot be reused across ingress objects, and port maps are a function of a domain, so the inversion here makes most sense (at the cost of some downtime when migrating.
2024-03-12 03:55:40 -04:00
Jose Diaz-Gonzalez
c0f01c58d6 feat: add initial support for interacting with ClusterTriggerAuthentication objects
These will be provisioned to the keda namespace and referenced by Triggers if they exist (as a fallback to app-specific values).
2024-03-06 03:39:11 -05:00
Jose Diaz-Gonzalez
72067fcfd2 feat: add ability for users to specify alternative kubeconfig and kubecontext
This will provide the possibility for users to talk to existing kubernetes clusters, thereby removing one of the biggest reasons for having the old scheduler-kubernetes plugin around.
2024-02-22 07:42:15 -05:00
Jose Diaz-Gonzalez
8711a1c801 fix: force set the kubectl path when running kubectl commands 2024-02-06 14:39:48 -05:00
Jose Diaz-Gonzalez
2619c3db08 fix: ensure critical addons come up when the node is tainted
Rather than taint on `node-role.kubernetes.io/master=true:NoSchedule`, we check for `CriticalAddonsOnly=true:NoSchedule` and taint on that.
2024-01-23 03:00:27 -05:00
Jose Diaz-Gonzalez
f7acbb1e7c refactor: place all required manifests in a single location
This will make it easier for us to apply the installs.
2024-01-23 03:00:27 -05:00
Jose Diaz-Gonzalez
0730647af7 feat: implement :cluster-list and :cluster-remove
These - and the existing :cluster-add command - do not require root.
2024-01-23 03:00:27 -05:00
Jose Diaz-Gonzalez
3375474a4c feat: copy the registry file to all remote hosts 2024-01-23 03:00:27 -05:00
Jose Diaz-Gonzalez
69e9511666 feat: implement cluster joining for server and worker nodes
Different options get applied to each depending on what is needed for the role.

This also updates how we initialize the cluster to better support how metrics exposure and cross-server networking.
2024-01-23 03:00:27 -05:00
Jose Diaz-Gonzalez
e4855941fe feat: allow for stable cron names
The cron id is too long to store in the cronjob, so we generate a short identifier and look that up each time on deploy to ensure stability across time.
2024-01-23 03:00:27 -05:00
Jose Diaz-Gonzalez
297853781f refactor: move all k8s code behind client
Also fix an issue where attaching to pods fails in rare cases
2024-01-23 03:00:27 -05:00