From 247f0dc344235c176f6f4f900c6ed42b553532f9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 2 Oct 2026 03:28:58 +0000 Subject: [PATCH] Release kubemirror 0.10.9 --- charts/kubemirror/Chart.yaml | 4 +- charts/kubemirror/README.md | 83 ++++++++++++++++++++ charts/kubemirror/templates/deployment.yaml | 4 +- charts/kubemirror/values.yaml | 7 +- charts/packages/kubemirror-0.10.9.tgz | Bin 0 -> 5371 bytes index.yaml | 24 +++++- 6 files changed, 113 insertions(+), 9 deletions(-) create mode 100644 charts/kubemirror/README.md create mode 100644 charts/packages/kubemirror-0.10.9.tgz diff --git a/charts/kubemirror/Chart.yaml b/charts/kubemirror/Chart.yaml index 6550b8a..99f851b 100644 --- a/charts/kubemirror/Chart.yaml +++ b/charts/kubemirror/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: kubemirror description: Kubernetes controller for mirroring resources across namespaces type: application -version: 0.9.22 -appVersion: "0.9.22" +version: 0.10.9 +appVersion: "0.10.9" keywords: - kubernetes - controller diff --git a/charts/kubemirror/README.md b/charts/kubemirror/README.md new file mode 100644 index 0000000..cd54edc --- /dev/null +++ b/charts/kubemirror/README.md @@ -0,0 +1,83 @@ +# kubemirror Helm chart + +Deploys the [kubemirror](https://github.com/lukaszraczylo/kubemirror) controller, +which mirrors Kubernetes resources (Secrets, ConfigMaps, and other types) across +namespaces. + +- Chart version: `0.1.0` +- App version: `0.1.0` +- Image: `ghcr.io/lukaszraczylo/kubemirror` + +## Install + +```bash +helm install kubemirror ./charts/kubemirror -n kubemirror --create-namespace +``` + +With a values override: + +```bash +helm install kubemirror ./charts/kubemirror -n kubemirror --create-namespace \ + -f my-values.yaml +``` + +## Uninstall + +```bash +helm uninstall kubemirror -n kubemirror +``` + +## What it creates + +A single-replica `Deployment`, a `ServiceAccount`, a cluster-scoped `ClusterRole` ++ `ClusterRoleBinding` (the controller watches resources across all namespaces), +and a `Service` exposing the metrics (`8080`) and health (`8081`) ports. The +container runs as non-root (uid `65532`) with a read-only root filesystem and all +Linux capabilities dropped. + +## Values + +Defaults are taken from [`values.yaml`](values.yaml). + +| Key | Default | Description | +| --- | --- | --- | +| `replicaCount` | `1` | Number of controller replicas. | +| `image.repository` | `ghcr.io/lukaszraczylo/kubemirror` | Controller image. | +| `image.tag` | `"0.1.0"` | Image tag (falls back to chart `appVersion` if empty). | +| `image.pullPolicy` | `IfNotPresent` | Image pull policy. | +| `serviceAccount.create` | `true` | Create a ServiceAccount. | +| `serviceAccount.name` | `""` | Override the generated ServiceAccount name. | +| `controller.metricsBindAddress` | `":8080"` | `--metrics-bind-address`. | +| `controller.healthProbeBindAddress` | `":8081"` | `--health-probe-bind-address`. | +| `controller.leaderElect` | `true` | Enable leader election (`--leader-elect`). | +| `controller.leaderElectionID` | `"kubemirror-controller-leader"` | Lease name (`--leader-election-id`). | +| `controller.resourceTypes` | `[]` | Resource types to mirror (`--resource-types`). Empty enables auto-discovery. | +| `controller.discoveryInterval` | `"5m"` | Auto-discovery interval (`--discovery-interval`). | +| `controller.resyncPeriod` | `"1h"` | Cache resync period, safety net only (`--resync-period`). | +| `controller.maxTargets` | `100` | Max target namespaces per resource (`--max-targets`). | +| `controller.workerThreads` | `5` | Concurrent reconcile workers (`--worker-threads`). | +| `controller.rateLimitQPS` | `50.0` | API QPS limit (`--rate-limit-qps`). | +| `controller.rateLimitBurst` | `100` | API burst limit (`--rate-limit-burst`). | +| `controller.verifySourceFreshness` | `false` | Verify cache against a direct API read (`--verify-source-freshness`). | +| `controller.lazyWatcherInit` | `false` | Only watch resource types actually in use (`--lazy-watcher-init`). Lowers memory; recommended for production. | +| `controller.watcherScanInterval` | `"5m"` | Scan interval for new types in lazy mode (`--watcher-scan-interval`). | +| `controller.excludedNamespaces` | `""` | Comma-separated namespaces never mirrored to (`--excluded-namespaces`). | +| `controller.includedNamespaces` | `""` | Comma-separated namespace patterns to include (`--included-namespaces`). | +| `service.type` | `ClusterIP` | Service type. | +| `service.metricsPort` | `8080` | Metrics port. | +| `service.healthPort` | `8081` | Health-probe port. | +| `resources.requests` | `100m` CPU / `128Mi` | Container requests. | +| `resources.limits` | `500m` CPU / `512Mi` | Container limits. | +| `nodeSelector` / `tolerations` / `affinity` | `{}` / `[]` / `{}` | Standard scheduling controls. | +| `priorityClassName` | `""` | Pod priority class. | + +> **Memory tip:** setting `controller.resourceTypes` to the exact types you mirror +> (e.g. `["Secret.v1", "ConfigMap.v1"]`), or enabling `controller.lazyWatcherInit`, +> avoids creating watchers for unused resource types and cuts memory use +> substantially versus full auto-discovery. + +## Usage + +After install, mark a source resource for mirroring and opt a target namespace +in. See the [project README](../../README.md) and [examples](../../examples/) for +the full annotation/label reference and worked scenarios. diff --git a/charts/kubemirror/templates/deployment.yaml b/charts/kubemirror/templates/deployment.yaml index b0f897f..704dc08 100644 --- a/charts/kubemirror/templates/deployment.yaml +++ b/charts/kubemirror/templates/deployment.yaml @@ -43,9 +43,7 @@ spec: - --worker-threads={{ .Values.controller.workerThreads }} - --rate-limit-qps={{ .Values.controller.rateLimitQPS }} - --rate-limit-burst={{ .Values.controller.rateLimitBurst }} - {{- if .Values.controller.verifySourceFreshness }} - - --verify-source-freshness=true - {{- end }} + - --verify-source-freshness={{ .Values.controller.verifySourceFreshness }} {{- if .Values.controller.lazyWatcherInit }} - --lazy-watcher-init=true {{- end }} diff --git a/charts/kubemirror/values.yaml b/charts/kubemirror/values.yaml index dd98715..f84db2a 100644 --- a/charts/kubemirror/values.yaml +++ b/charts/kubemirror/values.yaml @@ -3,7 +3,7 @@ replicaCount: 1 image: repository: ghcr.io/lukaszraczylo/kubemirror pullPolicy: IfNotPresent - tag: "0.9.22" + tag: "0.10.9" imagePullSecrets: [] nameOverride: "" @@ -54,10 +54,11 @@ controller: # How often to rediscover available resources in the cluster discoveryInterval: "5m" - # Cache resync period - how often to refresh all cached resources + # Cache resync period - safety net for missed watch events; mirror drift + # is repaired event-driven, so this can stay long # Higher values reduce memory churn and API load # Default: 10m (was 30s in earlier versions) - resyncPeriod: "10m" + resyncPeriod: "1h" # Resource limits maxTargets: 100 diff --git a/charts/packages/kubemirror-0.10.9.tgz b/charts/packages/kubemirror-0.10.9.tgz new file mode 100644 index 0000000000000000000000000000000000000000..4b5695c14873bf9af080f74eb4aaea4f1c0fcb3c GIT binary patch literal 5371 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 Z%0qc559QO!{{;X5|Nk3?ltutz005qQSTq0t literal 0 HcmV?d00001 diff --git a/index.yaml b/index.yaml index eaf12c0..8b2d874 100644 --- a/index.yaml +++ b/index.yaml @@ -5304,6 +5304,28 @@ entries: - https://github.com/lukaszraczylo/helm-charts/releases/download/kube-images-sync-0.1.5/kube-images-sync-0.1.5.tgz version: 0.1.5 kubemirror: + - apiVersion: v2 + appVersion: 0.10.9 + created: "2026-10-02T03:28:58.862053405Z" + description: Kubernetes controller for mirroring resources across namespaces + digest: 330ccfb3dbfec1f25e2413368ad39394a860eddeeb61ccb80f7b30b7cfad4019 + home: https://github.com/lukaszraczylo/kubemirror + keywords: + - kubernetes + - controller + - mirror + - secrets + - configmaps + maintainers: + - email: lukasz@raczylo.com + name: Lukasz Raczylo + name: kubemirror + sources: + - https://github.com/lukaszraczylo/kubemirror + type: application + urls: + - https://github.com/lukaszraczylo/helm-charts/releases/download/kubemirror-0.10.9/kubemirror-0.10.9.tgz + version: 0.10.9 - apiVersion: v2 appVersion: 0.9.22 created: "2026-06-11T04:55:10.159104138Z" @@ -5986,4 +6008,4 @@ entries: urls: - https://github.com/lukaszraczylo/helm-charts/releases/download/kubemirror-0.2.8/kubemirror-0.2.8.tgz version: 0.2.8 -generated: "2026-10-02T03:14:57.94666578Z" +generated: "2026-10-02T03:28:58.861515958Z"