Helm install¶
Coxswain is published as an OCI Helm chart at ghcr.io/coxswain-labs/charts/coxswain.
Install¶
# Install Gateway API CRDs first (prerequisite — once per cluster)
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/latest/download/standard-install.yaml
# Install the latest release
helm install coxswain oci://ghcr.io/coxswain-labs/charts/coxswain \
--namespace coxswain-system --create-namespace
To pin a specific version:
helm install coxswain oci://ghcr.io/coxswain-labs/charts/coxswain \
--version 0.5.0 \
--namespace coxswain-system --create-namespace
Upgrade¶
helm upgrade coxswain oci://ghcr.io/coxswain-labs/charts/coxswain \
--namespace coxswain-system
Inspect default values¶
helm show values oci://ghcr.io/coxswain-labs/charts/coxswain
Common values¶
| Value | Default | Description |
|---|---|---|
controller.replicas |
2 |
Controller replica count; PDB is only provisioned when ≥ 2 |
controller.podDisruptionBudget.enabled |
true |
Provision a PDB for the controller (effective when replicas ≥ 2) |
image.tag |
(chart appVersion) | Image tag to deploy |
controllerName |
coxswain-labs.dev/gateway-controller |
GatewayClass controllerName to claim |
watchNamespace |
"" |
Restrict watch to a single namespace; empty = cluster-wide |
proxy.ingress.http.port |
80 |
Ingress HTTP listener port |
proxy.ingress.https.port |
443 |
Ingress HTTPS listener port |
proxy.shared.replicas |
1 |
Static replica count (ignored when autoscaling.enabled) |
proxy.shared.autoscaling.enabled |
false |
Enable HPA for the shared proxy |
proxy.shared.autoscaling.minReplicas |
2 |
HPA lower bound; must be ≥ 2 for the PDB to be active |
proxy.shared.autoscaling.maxReplicas |
10 |
HPA upper bound |
proxy.shared.autoscaling.targetCPUUtilizationPercentage |
80 |
HPA CPU utilization target |
proxy.shared.podDisruptionBudget.enabled |
true |
Provision a PDB for the shared proxy (effective when floor ≥ 2) |
proxy.shared.threads |
2 |
Worker threads per shared proxy service |
proxy.shared.resources.requests.cpu |
100m |
Shared proxy CPU request |
proxy.shared.resources.requests.memory |
128Mi |
Shared proxy memory request |
proxy.shared.resources.limits.cpu |
500m |
Shared proxy CPU limit |
proxy.shared.resources.limits.memory |
256Mi |
Shared proxy memory limit |
See the Helm chart README for the full values reference.
Namespace-scoped install¶
By default Coxswain watches the entire cluster. To restrict to a single namespace:
helm install coxswain oci://ghcr.io/coxswain-labs/charts/coxswain \
--namespace coxswain-system --create-namespace \
--set watchNamespace=my-namespace
Note
watchNamespace only narrows what the controller reads — the chart still installs the cluster-wide ClusterRole/ClusterRoleBinding. To scope RBAC as well, render the manifests with helm template and edit them by hand before applying.
ValidatingAdmissionPolicy¶
On Kubernetes ≥ 1.30, the chart installs a ValidatingAdmissionPolicy that rejects Ingresses carrying malformed ingress.coxswain-labs.dev/* annotation values at kubectl apply time. The policy is enabled by default and silently skipped on clusters that do not advertise admissionregistration.k8s.io/v1/ValidatingAdmissionPolicy, so installing on an older cluster is safe.
To disable it explicitly:
helm install coxswain oci://ghcr.io/coxswain-labs/charts/coxswain \
--namespace coxswain-system --create-namespace \
--set vap.enabled=false
Control-plane CA¶
The controller secures the controller↔proxy discovery channel with mandatory
mTLS. By default (discovery.ca.mode=auto) it self-generates the CA and works
out of the box — nothing to provision. To consume a cert-manager-managed or
bring-your-own CA instead, set discovery.ca.mode=external and supply the
Secret. See Control-plane security.
Uninstall¶
helm uninstall coxswain --namespace coxswain-system
kubectl delete namespace coxswain-system
Warning
The Gateway API CRDs are not removed — uninstalling them would delete all Gateway and HTTPRoute objects in the cluster.