From 7a0404a2ec04e83c8c786368a0174e52ade4f2d2 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sat, 26 Sep 2026 01:14:15 -0400 Subject: [PATCH] fix: report stored node-sysctls images globally The `--scheduler-k3s-global-node-sysctls-image` and `--scheduler-k3s-global-node-sysctls-pause-image` report flags returned the built-in default when nothing was stored, so an unset image could not be told apart from one set to the default. They now report the stored value like every other global flag, and new `--scheduler-k3s-computed-node-sysctls-image` and `--scheduler-k3s-computed-node-sysctls-pause-image` flags report the image that is actually used. --- docs/deployment/schedulers/k3s.md | 4 +- plugins/scheduler-k3s/functions.go | 12 +- plugins/scheduler-k3s/report.go | 168 ++++++++++++++------------- tests/unit/scheduler-k3s-report.bats | 4 +- 4 files changed, 105 insertions(+), 83 deletions(-) diff --git a/docs/deployment/schedulers/k3s.md b/docs/deployment/schedulers/k3s.md index 74545ab8c..500f98f4c 100644 --- a/docs/deployment/schedulers/k3s.md +++ b/docs/deployment/schedulers/k3s.md @@ -1322,8 +1322,8 @@ If unspecified for any task, the default reservation will be `.1` CPU and `128Mi | `letsencrypt-server` | app + global | `prod` | `--scheduler-k3s-letsencrypt-server`, `--scheduler-k3s-global-letsencrypt-server`, `--scheduler-k3s-computed-letsencrypt-server` | ACME directory (`prod` or `staging`) used for app certificates, or `false` to disable all automatic certificate issuance | | `namespace` | app + global | `default` | `--scheduler-k3s-namespace`, `--scheduler-k3s-global-namespace`, `--scheduler-k3s-computed-namespace` | Kubernetes namespace into which the app's resources are installed | | `network-interface` | global only | `eth0` | `--scheduler-k3s-global-network-interface`, `--scheduler-k3s-computed-network-interface` | Host network interface used by k3s | -| `node-sysctls-image` | global only | `busybox:1.36` | `--scheduler-k3s-global-node-sysctls-image` | Image used to apply node-level sysctls, override for air-gapped clusters | -| `node-sysctls-pause-image` | global only | `registry.k8s.io/pause:3.9` | `--scheduler-k3s-global-node-sysctls-pause-image` | Image keeping the node sysctls daemonset pods running | +| `node-sysctls-image` | global only | `busybox:1.36` | `--scheduler-k3s-global-node-sysctls-image`, `--scheduler-k3s-computed-node-sysctls-image` | Image used to apply node-level sysctls, override for air-gapped clusters | +| `node-sysctls-pause-image` | global only | `registry.k8s.io/pause:3.9` | `--scheduler-k3s-global-node-sysctls-pause-image`, `--scheduler-k3s-computed-node-sysctls-pause-image` | Image keeping the node sysctls daemonset pods running | | `rollback-on-failure` | app + global | `false` | `--scheduler-k3s-rollback-on-failure`, `--scheduler-k3s-global-rollback-on-failure`, `--scheduler-k3s-computed-rollback-on-failure` | When `true`, helm rolls back the release if a deploy fails | | `shm-size` | app + global | none | `--scheduler-k3s-shm-size`, `--scheduler-k3s-global-shm-size`, `--scheduler-k3s-computed-shm-size` | `/dev/shm` size override applied to app containers | | `token` | global only | none | `--scheduler-k3s-global-token` (masked as `*******` in default stdout output; the raw value is returned when queried via `--format json` or when this flag is requested explicitly) | Cluster join token used by `scheduler-k3s:cluster-add` | diff --git a/plugins/scheduler-k3s/functions.go b/plugins/scheduler-k3s/functions.go index 70426990b..dafa96067 100644 --- a/plugins/scheduler-k3s/functions.go +++ b/plugins/scheduler-k3s/functions.go @@ -1646,8 +1646,12 @@ func getComputedKustomizeRootPath(appName string) string { return kustomizeRootPath } +func getGlobalNodeSysctlsImage() string { + return common.PropertyGet("scheduler-k3s", "--global", "node-sysctls-image") +} + func getComputedNodeSysctlsImage() string { - image := common.PropertyGet("scheduler-k3s", "--global", "node-sysctls-image") + image := getGlobalNodeSysctlsImage() if image == "" { image = DefaultNodeSysctlsImage } @@ -1655,8 +1659,12 @@ func getComputedNodeSysctlsImage() string { return image } +func getGlobalNodeSysctlsPauseImage() string { + return common.PropertyGet("scheduler-k3s", "--global", "node-sysctls-pause-image") +} + func getComputedNodeSysctlsPauseImage() string { - image := common.PropertyGet("scheduler-k3s", "--global", "node-sysctls-pause-image") + image := getGlobalNodeSysctlsPauseImage() if image == "" { image = DefaultNodeSysctlsPauseImage } diff --git a/plugins/scheduler-k3s/report.go b/plugins/scheduler-k3s/report.go index c2e9b805d..8beeebc04 100644 --- a/plugins/scheduler-k3s/report.go +++ b/plugins/scheduler-k3s/report.go @@ -40,85 +40,89 @@ func ReportSingleApp(appName string, format string, infoFlag string) error { } flags = map[string]common.ReportFunc{ - "--scheduler-k3s-computed-cert-issuer-kind": reportComputedCertIssuerKind, - "--scheduler-k3s-global-cert-issuer-kind": reportGlobalCertIssuerKind, - "--scheduler-k3s-computed-cert-issuer-name": reportComputedCertIssuerName, - "--scheduler-k3s-global-cert-issuer-name": reportGlobalCertIssuerName, - "--scheduler-k3s-computed-deploy-timeout": reportComputedDeployTimeout, - "--scheduler-k3s-global-deploy-timeout": reportGlobalDeployTimeout, - "--scheduler-k3s-computed-image-pull-secrets": reportComputedImagePullSecrets, - "--scheduler-k3s-global-image-pull-secrets": reportGlobalImagePullSecrets, - "--scheduler-k3s-computed-ingress-class": reportComputedIngressClass, - "--scheduler-k3s-global-ingress-class": reportGlobalIngressClass, - "--scheduler-k3s-computed-kubeconfig-path": reportComputedKubeconfigPath, - "--scheduler-k3s-global-kubeconfig-path": reportGlobalKubeconfigPath, - "--scheduler-k3s-computed-kube-context": reportComputedKubeContext, - "--scheduler-k3s-global-kube-context": reportGlobalKubeContext, - "--scheduler-k3s-computed-kustomize-root-path": reportComputedKustomizeRootPath, - "--scheduler-k3s-global-kustomize-root-path": reportGlobalKustomizeRootPath, - "--scheduler-k3s-computed-letsencrypt-server": reportComputedLetsencryptServer, - "--scheduler-k3s-global-letsencrypt-server": reportGlobalLetsencryptServer, - "--scheduler-k3s-computed-letsencrypt-email-prod": reportComputedLetsencryptEmailProd, - "--scheduler-k3s-global-letsencrypt-email-prod": reportGlobalLetsencryptEmailProd, - "--scheduler-k3s-computed-letsencrypt-email-stag": reportComputedLetsencryptEmailStag, - "--scheduler-k3s-global-letsencrypt-email-stag": reportGlobalLetsencryptEmailStag, - "--scheduler-k3s-computed-namespace": reportComputedNamespace, - "--scheduler-k3s-global-namespace": reportGlobalNamespace, - "--scheduler-k3s-computed-network-interface": reportComputedNetworkInterface, - "--scheduler-k3s-global-network-interface": reportGlobalNetworkInterface, - "--scheduler-k3s-global-node-sysctls-image": reportGlobalNodeSysctlsImage, - "--scheduler-k3s-global-node-sysctls-pause-image": reportGlobalNodeSysctlsPauseImage, - "--scheduler-k3s-computed-rollback-on-failure": reportComputedRollbackOnFailure, - "--scheduler-k3s-global-rollback-on-failure": reportGlobalRollbackOnFailure, - "--scheduler-k3s-computed-shm-size": reportComputedShmSize, - "--scheduler-k3s-global-shm-size": reportGlobalShmSize, - tokenFlag: tokenReportFunc, + "--scheduler-k3s-computed-cert-issuer-kind": reportComputedCertIssuerKind, + "--scheduler-k3s-global-cert-issuer-kind": reportGlobalCertIssuerKind, + "--scheduler-k3s-computed-cert-issuer-name": reportComputedCertIssuerName, + "--scheduler-k3s-global-cert-issuer-name": reportGlobalCertIssuerName, + "--scheduler-k3s-computed-deploy-timeout": reportComputedDeployTimeout, + "--scheduler-k3s-global-deploy-timeout": reportGlobalDeployTimeout, + "--scheduler-k3s-computed-image-pull-secrets": reportComputedImagePullSecrets, + "--scheduler-k3s-global-image-pull-secrets": reportGlobalImagePullSecrets, + "--scheduler-k3s-computed-ingress-class": reportComputedIngressClass, + "--scheduler-k3s-global-ingress-class": reportGlobalIngressClass, + "--scheduler-k3s-computed-kubeconfig-path": reportComputedKubeconfigPath, + "--scheduler-k3s-global-kubeconfig-path": reportGlobalKubeconfigPath, + "--scheduler-k3s-computed-kube-context": reportComputedKubeContext, + "--scheduler-k3s-global-kube-context": reportGlobalKubeContext, + "--scheduler-k3s-computed-kustomize-root-path": reportComputedKustomizeRootPath, + "--scheduler-k3s-global-kustomize-root-path": reportGlobalKustomizeRootPath, + "--scheduler-k3s-computed-letsencrypt-server": reportComputedLetsencryptServer, + "--scheduler-k3s-global-letsencrypt-server": reportGlobalLetsencryptServer, + "--scheduler-k3s-computed-letsencrypt-email-prod": reportComputedLetsencryptEmailProd, + "--scheduler-k3s-global-letsencrypt-email-prod": reportGlobalLetsencryptEmailProd, + "--scheduler-k3s-computed-letsencrypt-email-stag": reportComputedLetsencryptEmailStag, + "--scheduler-k3s-global-letsencrypt-email-stag": reportGlobalLetsencryptEmailStag, + "--scheduler-k3s-computed-namespace": reportComputedNamespace, + "--scheduler-k3s-global-namespace": reportGlobalNamespace, + "--scheduler-k3s-computed-network-interface": reportComputedNetworkInterface, + "--scheduler-k3s-global-network-interface": reportGlobalNetworkInterface, + "--scheduler-k3s-computed-node-sysctls-image": reportComputedNodeSysctlsImage, + "--scheduler-k3s-global-node-sysctls-image": reportGlobalNodeSysctlsImage, + "--scheduler-k3s-computed-node-sysctls-pause-image": reportComputedNodeSysctlsPauseImage, + "--scheduler-k3s-global-node-sysctls-pause-image": reportGlobalNodeSysctlsPauseImage, + "--scheduler-k3s-computed-rollback-on-failure": reportComputedRollbackOnFailure, + "--scheduler-k3s-global-rollback-on-failure": reportGlobalRollbackOnFailure, + "--scheduler-k3s-computed-shm-size": reportComputedShmSize, + "--scheduler-k3s-global-shm-size": reportGlobalShmSize, + tokenFlag: tokenReportFunc, } } else { flags = map[string]common.ReportFunc{ - "--scheduler-k3s-computed-cert-issuer-kind": reportComputedCertIssuerKind, - "--scheduler-k3s-cert-issuer-kind": reportCertIssuerKind, - "--scheduler-k3s-global-cert-issuer-kind": reportGlobalCertIssuerKind, - "--scheduler-k3s-computed-cert-issuer-name": reportComputedCertIssuerName, - "--scheduler-k3s-cert-issuer-name": reportCertIssuerName, - "--scheduler-k3s-global-cert-issuer-name": reportGlobalCertIssuerName, - "--scheduler-k3s-computed-deploy-timeout": reportComputedDeployTimeout, - "--scheduler-k3s-deploy-timeout": reportDeployTimeout, - "--scheduler-k3s-global-deploy-timeout": reportGlobalDeployTimeout, - "--scheduler-k3s-computed-image-pull-secrets": reportComputedImagePullSecrets, - "--scheduler-k3s-image-pull-secrets": reportImagePullSecrets, - "--scheduler-k3s-global-image-pull-secrets": reportGlobalImagePullSecrets, - "--scheduler-k3s-computed-ingress-class": reportComputedIngressClass, - "--scheduler-k3s-global-ingress-class": reportGlobalIngressClass, - "--scheduler-k3s-computed-kubeconfig-path": reportComputedKubeconfigPath, - "--scheduler-k3s-global-kubeconfig-path": reportGlobalKubeconfigPath, - "--scheduler-k3s-computed-kube-context": reportComputedKubeContext, - "--scheduler-k3s-global-kube-context": reportGlobalKubeContext, - "--scheduler-k3s-computed-kustomize-root-path": reportComputedKustomizeRootPath, - "--scheduler-k3s-kustomize-root-path": reportKustomizeRootPath, - "--scheduler-k3s-global-kustomize-root-path": reportGlobalKustomizeRootPath, - "--scheduler-k3s-computed-letsencrypt-server": reportComputedLetsencryptServer, - "--scheduler-k3s-letsencrypt-server": reportLetsencryptServer, - "--scheduler-k3s-global-letsencrypt-server": reportGlobalLetsencryptServer, - "--scheduler-k3s-computed-letsencrypt-email-prod": reportComputedLetsencryptEmailProd, - "--scheduler-k3s-letsencrypt-email-prod": reportLetsencryptEmailProd, - "--scheduler-k3s-global-letsencrypt-email-prod": reportGlobalLetsencryptEmailProd, - "--scheduler-k3s-computed-letsencrypt-email-stag": reportComputedLetsencryptEmailStag, - "--scheduler-k3s-letsencrypt-email-stag": reportLetsencryptEmailStag, - "--scheduler-k3s-global-letsencrypt-email-stag": reportGlobalLetsencryptEmailStag, - "--scheduler-k3s-computed-namespace": reportComputedNamespace, - "--scheduler-k3s-namespace": reportNamespace, - "--scheduler-k3s-global-namespace": reportGlobalNamespace, - "--scheduler-k3s-computed-network-interface": reportComputedNetworkInterface, - "--scheduler-k3s-global-network-interface": reportGlobalNetworkInterface, - "--scheduler-k3s-global-node-sysctls-image": reportGlobalNodeSysctlsImage, - "--scheduler-k3s-global-node-sysctls-pause-image": reportGlobalNodeSysctlsPauseImage, - "--scheduler-k3s-computed-rollback-on-failure": reportComputedRollbackOnFailure, - "--scheduler-k3s-rollback-on-failure": reportRollbackOnFailure, - "--scheduler-k3s-global-rollback-on-failure": reportGlobalRollbackOnFailure, - "--scheduler-k3s-computed-shm-size": reportComputedShmSize, - "--scheduler-k3s-global-shm-size": reportGlobalShmSize, - "--scheduler-k3s-shm-size": reportShmSize, + "--scheduler-k3s-computed-cert-issuer-kind": reportComputedCertIssuerKind, + "--scheduler-k3s-cert-issuer-kind": reportCertIssuerKind, + "--scheduler-k3s-global-cert-issuer-kind": reportGlobalCertIssuerKind, + "--scheduler-k3s-computed-cert-issuer-name": reportComputedCertIssuerName, + "--scheduler-k3s-cert-issuer-name": reportCertIssuerName, + "--scheduler-k3s-global-cert-issuer-name": reportGlobalCertIssuerName, + "--scheduler-k3s-computed-deploy-timeout": reportComputedDeployTimeout, + "--scheduler-k3s-deploy-timeout": reportDeployTimeout, + "--scheduler-k3s-global-deploy-timeout": reportGlobalDeployTimeout, + "--scheduler-k3s-computed-image-pull-secrets": reportComputedImagePullSecrets, + "--scheduler-k3s-image-pull-secrets": reportImagePullSecrets, + "--scheduler-k3s-global-image-pull-secrets": reportGlobalImagePullSecrets, + "--scheduler-k3s-computed-ingress-class": reportComputedIngressClass, + "--scheduler-k3s-global-ingress-class": reportGlobalIngressClass, + "--scheduler-k3s-computed-kubeconfig-path": reportComputedKubeconfigPath, + "--scheduler-k3s-global-kubeconfig-path": reportGlobalKubeconfigPath, + "--scheduler-k3s-computed-kube-context": reportComputedKubeContext, + "--scheduler-k3s-global-kube-context": reportGlobalKubeContext, + "--scheduler-k3s-computed-kustomize-root-path": reportComputedKustomizeRootPath, + "--scheduler-k3s-kustomize-root-path": reportKustomizeRootPath, + "--scheduler-k3s-global-kustomize-root-path": reportGlobalKustomizeRootPath, + "--scheduler-k3s-computed-letsencrypt-server": reportComputedLetsencryptServer, + "--scheduler-k3s-letsencrypt-server": reportLetsencryptServer, + "--scheduler-k3s-global-letsencrypt-server": reportGlobalLetsencryptServer, + "--scheduler-k3s-computed-letsencrypt-email-prod": reportComputedLetsencryptEmailProd, + "--scheduler-k3s-letsencrypt-email-prod": reportLetsencryptEmailProd, + "--scheduler-k3s-global-letsencrypt-email-prod": reportGlobalLetsencryptEmailProd, + "--scheduler-k3s-computed-letsencrypt-email-stag": reportComputedLetsencryptEmailStag, + "--scheduler-k3s-letsencrypt-email-stag": reportLetsencryptEmailStag, + "--scheduler-k3s-global-letsencrypt-email-stag": reportGlobalLetsencryptEmailStag, + "--scheduler-k3s-computed-namespace": reportComputedNamespace, + "--scheduler-k3s-namespace": reportNamespace, + "--scheduler-k3s-global-namespace": reportGlobalNamespace, + "--scheduler-k3s-computed-network-interface": reportComputedNetworkInterface, + "--scheduler-k3s-global-network-interface": reportGlobalNetworkInterface, + "--scheduler-k3s-computed-node-sysctls-image": reportComputedNodeSysctlsImage, + "--scheduler-k3s-global-node-sysctls-image": reportGlobalNodeSysctlsImage, + "--scheduler-k3s-computed-node-sysctls-pause-image": reportComputedNodeSysctlsPauseImage, + "--scheduler-k3s-global-node-sysctls-pause-image": reportGlobalNodeSysctlsPauseImage, + "--scheduler-k3s-computed-rollback-on-failure": reportComputedRollbackOnFailure, + "--scheduler-k3s-rollback-on-failure": reportRollbackOnFailure, + "--scheduler-k3s-global-rollback-on-failure": reportGlobalRollbackOnFailure, + "--scheduler-k3s-computed-shm-size": reportComputedShmSize, + "--scheduler-k3s-global-shm-size": reportGlobalShmSize, + "--scheduler-k3s-shm-size": reportShmSize, } } @@ -686,14 +690,22 @@ func reportGlobalNetworkInterface(appName string) string { return getGlobalNetworkInterface() } -func reportGlobalNodeSysctlsImage(appName string) string { +func reportComputedNodeSysctlsImage(appName string) string { return getComputedNodeSysctlsImage() } -func reportGlobalNodeSysctlsPauseImage(appName string) string { +func reportGlobalNodeSysctlsImage(appName string) string { + return getGlobalNodeSysctlsImage() +} + +func reportComputedNodeSysctlsPauseImage(appName string) string { return getComputedNodeSysctlsPauseImage() } +func reportGlobalNodeSysctlsPauseImage(appName string) string { + return getGlobalNodeSysctlsPauseImage() +} + func reportComputedRollbackOnFailure(appName string) string { return getComputedRollbackOnFailure(appName) } diff --git a/tests/unit/scheduler-k3s-report.bats b/tests/unit/scheduler-k3s-report.bats index f70d6fd6c..76268eb2b 100644 --- a/tests/unit/scheduler-k3s-report.bats +++ b/tests/unit/scheduler-k3s-report.bats @@ -7,7 +7,7 @@ setup() { } teardown() { - for prop in cert-issuer-kind cert-issuer-name deploy-timeout image-pull-secrets ingress-class kubeconfig-path kube-context kustomize-root-path namespace network-interface rollback-on-failure shm-size token; do + for prop in cert-issuer-kind cert-issuer-name deploy-timeout image-pull-secrets ingress-class kubeconfig-path kube-context kustomize-root-path namespace network-interface node-sysctls-image node-sysctls-pause-image rollback-on-failure shm-size token; do dokku scheduler-k3s:set --global "$prop" >/dev/null 2>/dev/null || true done global_teardown @@ -56,6 +56,8 @@ assert_k3s_global_unset_set() { assert_k3s_global_unset_set "network-interface" "eth0" "eth1" assert_k3s_global_unset_set "kubeconfig-path" "/etc/rancher/k3s/k3s.yaml" "/tmp/custom-kubeconfig.yaml" assert_k3s_global_unset_set "cert-issuer-kind" "ClusterIssuer" "Issuer" + assert_k3s_global_unset_set "node-sysctls-image" "busybox:1.36" "registry.internal/busybox:1.36" + assert_k3s_global_unset_set "node-sysctls-pause-image" "registry.k8s.io/pause:3.9" "registry.internal/pause:3.9" } @test "(scheduler-k3s:report --global) empty-default properties expose computed sibling" {