Skip to content

Commit c2f5f9e

Browse files
committed
docs(MADR): reframe helm structure as subchart, group passthrough values
Signed-off-by: slonka <[email protected]>
1 parent 9196180 commit c2f5f9e

File tree

1 file changed

+28
-23
lines changed

1 file changed

+28
-23
lines changed

docs/madr/decisions/094-zone-proxy-deployment-model.md

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ This architectural change requires revisiting the deployment model for zone prox
2222
**Scope of this document**: This MADR focuses on **deployment tooling** — how users deploy zone proxies via Helm, Konnect UI, and Terraform.
2323

2424
**Single-mesh focus**: This document assumes **single-mesh-per-zone as the default** deployment pattern.
25-
For multi-mesh scenarios, deploy additional zone proxies using separate Helm releases with a dedicated zone-proxy chart. This can be packaged either as an independent `kuma-zone-proxy` chart (separate release cycle, full independence) or as a subchart of the main kuma chart (single repo, tighter coupling). See the multi-mesh deployment guide for details.
25+
For multi-mesh scenarios, deploy additional zone proxies using separate Helm releases with a dedicated `kuma-zone-proxy` chart. A multi-mesh deployment guide will be provided separately.
2626

2727
This document addresses the following questions:
2828

@@ -38,7 +38,7 @@ Note: Whether zone ingress and egress share a single deployment is addressed in
3838
| Per-mesh Services | **Yes** - each mesh gets its own Service/LoadBalancer for mTLS isolation |
3939
| Namespace placement | **kuma-system** |
4040
| Deployment mechanism | **Helm-managed** (current pattern extended for mesh-scoped zone proxies) |
41-
| Helm release structure | **Single release** (CP + zone proxy in one chart) |
41+
| Helm release structure | **Subchart** — single release for default mesh; standalone release for additional meshes |
4242

4343
| Question | Decision |
4444
|----------|----------|
@@ -355,6 +355,7 @@ zoneProxy:
355355
mesh: my-very-long-mesh-name-that-exceeds-limits
356356
service:
357357
name: zp-long-mesh # Override when auto-generated name is too long
358+
spec: {} # Additional Service spec fields if needed
358359
```
359360

360361
**Cost implication**: More LoadBalancers = higher cloud cost.
@@ -390,9 +391,13 @@ zoneProxy:
390391
mesh: default
391392
```
392393
393-
#### Helm Release Structure Options
394+
#### Helm Release Structure: Subchart Approach
394395
395-
##### Option 1: Single Release (CP + Zone Proxy) — Recommended for Single-Mesh
396+
The zone proxy is packaged as a `kuma-zone-proxy` subchart of the main `kuma` chart. This single packaging naturally supports both single-mesh and multi-mesh deployment modes.
397+
398+
##### Single Release (Default — Single-Mesh)
399+
400+
The `kuma-zone-proxy` subchart is a dependency of the main `kuma` chart. A single `helm install` deploys everything:
396401

397402
```bash
398403
helm install kuma kuma/kuma -f values.yaml
@@ -419,53 +424,53 @@ zoneProxy:
419424

420425
**Best for**: Single-mesh deployments (the default), teams preferring simplicity, GitOps workflows.
421426

422-
##### Option 2: Two Releases (CP separate from Zone Proxy)
427+
##### Standalone Release (Multi-Mesh)
428+
429+
For additional meshes, install the same `kuma-zone-proxy` chart as a separate Helm release:
423430

424431
```bash
425-
helm install kuma-cp kuma/kuma -f cp-values.yaml
426-
helm install kuma-zone-proxy kuma/kuma-zone-proxy -f zone-proxy-values.yaml
432+
helm install kuma-zone-proxy-payments kuma/kuma-zone-proxy -f zone-proxy-values.yaml
427433
```
428434

429435
```yaml
430-
# cp-values.yaml
431-
controlPlane:
432-
mode: zone
433-
zone: zone-1
434-
435-
# zone-proxy-values.yaml (new chart)
436+
# zone-proxy-values.yaml
436437
enabled: true
437-
# mesh defaults to "default"
438+
mesh: payments-mesh
438439
replicas: 1
439440
```
440441

441442
| Aspect | Analysis |
442443
|--------|----------|
443-
| **Simplicity** | ⚠️ Two charts to manage |
444+
| **Simplicity** | ⚠️ Separate release per additional mesh |
444445
| **Upgrades** | ✅ Can upgrade CP independently of zone proxy |
445446
| **Lifecycle coupling** | ✅ Zone proxy changes don't affect CP stability |
446447
| **Failure blast radius** | ✅ Bad zone proxy config doesn't break CP |
447448
| **GitOps** | ✅ Clear separation of concerns |
448449

449-
**Best for**: Production environments wanting CP stability isolation.
450+
**Best for**: Multi-mesh deployments, production environments wanting CP stability isolation.
450451

451452
##### Recommendation
452453

453-
**Option 1 (single release)** for single-mesh deployments. Option 2 when CP stability isolation is required or for multi-mesh scenarios.
454+
**Subchart approach**: single release for the default mesh (simple, one `helm install`); standalone release of the same `kuma-zone-proxy` chart for additional meshes.
454455

455-
##### Helm Chart Structure: Pod Spec Passthrough
456+
##### Helm Chart Structure: Passthrough Values
456457

457458
**Problem**: Current Helm charts enumerate Kubernetes fields one by one — the ingress chart alone is 292 lines for ~15 fields. Users are blocked when they need an unsupported field (e.g., `shareProcessNamespace`, `initContainers`, `topologySpreadConstraints`), creating a cat-and-mouse problem where the chart never fully covers the Kubernetes API surface.
458459

459-
**Solution**: The zone proxy chart accepts raw `podSpec`, `containers`, and `serviceSpec` sections. Helm's `merge` overlays user values onto sensible defaults. Adding any PodSpec, container, or Service field requires zero template changes.
460+
**Solution**: The zone proxy chart groups passthrough values by Kubernetes resource. Helm's `merge` overlays user values onto sensible defaults. Adding any PodSpec, container, or Service field requires zero template changes.
460461

461462
```yaml
462-
# values.yaml — open-ended passthrough
463+
# values.yaml — resource-grouped passthrough
463464
zoneProxy:
464465
enabled: true
465466
mesh: default
466-
podSpec: {} # ANY valid PodSpec field (nodeSelector, tolerations, initContainers, etc.)
467-
containers: {} # ANY container field (resources, lifecycle, securityContext, env, etc.)
468-
serviceSpec: {} # ANY Service spec field (externalTrafficPolicy, loadBalancerSourceRanges, etc.)
467+
service:
468+
name: "" # Override when auto-generated name exceeds 63 chars
469+
spec: {} # ANY Service spec field (externalTrafficPolicy, loadBalancerSourceRanges, etc.)
470+
deployment:
471+
name: "" # Override when auto-generated name is needed
472+
podSpec: {} # ANY valid PodSpec field (nodeSelector, tolerations, initContainers, etc.)
473+
containers: [] # Container overrides (resources, lifecycle, securityContext, env, etc.)
469474
```
470475

471476
HPA and PDB settings use dedicated fields (`autoscaling.*`, `pdb.*`) since they have few, well-defined options.

0 commit comments

Comments
 (0)