{"id":51940358,"url":"https://github.com/comet-ml/envoy-router","last_synced_at":"2026-07-28T18:02:02.071Z","repository":{"id":344836953,"uuid":"1183308104","full_name":"comet-ml/envoy-router","owner":"comet-ml","description":null,"archived":false,"fork":false,"pushed_at":"2026-03-18T13:35:00.000Z","size":521,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-08T10:41:41.849Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/comet-ml.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-16T13:33:04.000Z","updated_at":"2026-03-18T13:34:57.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/comet-ml/envoy-router","commit_stats":null,"previous_names":["comet-ml/envoy-router"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/comet-ml/envoy-router","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/comet-ml%2Fenvoy-router","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/comet-ml%2Fenvoy-router/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/comet-ml%2Fenvoy-router/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/comet-ml%2Fenvoy-router/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/comet-ml","download_url":"https://codeload.github.com/comet-ml/envoy-router/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/comet-ml%2Fenvoy-router/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":36002533,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-07-28T02:00:06.341Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-07-28T18:02:01.529Z","updated_at":"2026-07-28T18:02:02.061Z","avatar_url":"https://github.com/comet-ml.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# envoy-router\n\nKubernetes operator that dynamically routes traffic to 100+ pods without hitting the ALB 100-target-group limit.\n\n## How it works\n\nInstead of one ALB target group per pod, a single **Envoy Gateway** handles all routing internally. The operator watches labelled pods and manages Gateway API resources automatically:\n\n```\nALB → Envoy Gateway (1 target group) → HTTPRoute /pp-\u003cid\u003e → pod\n```\n\nFor each pod with `envoy-router/enabled: \"true\"`, the operator creates:\n- A **Service** (selector-less, same name as the pod)\n- An **EndpointSlice** pointing directly at the pod IP\n- An **HTTPRoute** with path prefix `/\u003cpod-name\u003e` attached to the Gateway in the pod's namespace\n\nResources are cleaned up automatically when pods are deleted.\n\n## Install\n\nEnvoy Gateway is bundled as a Helm dependency — one `helm install` deploys everything: EG controller, Gateway, and the operator.\n\n### Single namespace\n\n```bash\nhelm install envoy-router oci://ghcr.io/comet-ml/charts/envoy-router \\\n  --version 0.1.3 --namespace ns-1 --create-namespace\n```\n\n### Multiple namespaces\n\nThe EG controller and GatewayClass are cluster-scoped singletons — only the first install should create them. Use the bundled `values-secondary.yaml` preset for every subsequent namespace:\n\n```bash\n# First namespace — installs EG controller + GatewayClass + Gateway + operator\nhelm install envoy-router oci://ghcr.io/comet-ml/charts/envoy-router \\\n  --version 0.1.3 --namespace ns-1 --create-namespace\n\n# Additional namespaces — installs Gateway + operator only\nhelm install envoy-router oci://ghcr.io/comet-ml/charts/envoy-router \\\n  --version 0.1.3 --namespace ns-2 --create-namespace \\\n  -f https://raw.githubusercontent.com/comet-ml/envoy-router/main/charts/envoy-router/values-secondary.yaml\n```\n\nEach namespace gets its own isolated Envoy proxy. The HTTPRoute in each namespace attaches to the Gateway in that same namespace:\n\n```\nns-1:  ALB-1 → Gateway (ns-1) → HTTPRoutes for pods in ns-1\nns-2:  ALB-2 → Gateway (ns-2) → HTTPRoutes for pods in ns-2\n```\n\nEach ALB needs one rule: forward `/*` to the Envoy proxy Service for that namespace. No per-pod rules.\n\n### Shared (pre-existing) Envoy Gateway\n\nIf you already manage Envoy Gateway separately at the cluster level, disable the bundled install:\n\n```bash\nhelm install envoy-router oci://ghcr.io/comet-ml/charts/envoy-router \\\n  --version 0.1.3 --namespace ns-1 --create-namespace \\\n  --set envoy-gateway.enabled=false\n```\n\n## Making a pod routable\n\nAdd the label to any pod:\n\n```yaml\nmetadata:\n  labels:\n    envoy-router/enabled: \"true\"\n```\n\nThe pod will be reachable at `https://your-domain.com/\u003cpod-name\u003e/` within seconds.\n\n## Configuration\n\n| Value | Default | Description |\n|---|---|---|\n| `operator.podPort` | `8080` | Port the pods listen on |\n| `operator.servicePort` | `80` | Port exposed on created Services |\n| `operator.watchNamespace` | `\"\"` | Restrict operator to one namespace. Empty = all namespaces |\n| `gateway.create` | `true` | Set `false` to skip Gateway creation |\n| `gateway.createClass` | `true` | Create the GatewayClass (cluster-scoped — set `false` for 2nd+ namespace installs) |\n| `gateway.className` | `envoy-router` | GatewayClass name |\n| `gateway.port` | `80` | Listener port on the Gateway |\n| `envoy-gateway.enabled` | `true` | Install the Envoy Gateway controller. Set `false` for 2nd+ namespace installs or if managing EG separately |\n| `metrics.serviceMonitor.enabled` | `false` | Create a Prometheus ServiceMonitor |\n| `metrics.serviceMonitor.namespace` | release namespace | Namespace to create the ServiceMonitor in |\n| `metrics.serviceMonitor.interval` | `30s` | Prometheus scrape interval |\n| `metrics.serviceMonitor.additionalLabels` | `{}` | Extra labels on the ServiceMonitor (e.g. `release: prometheus`) |\n\n## Metrics\n\nThe operator exposes Prometheus metrics at `:8080/metrics`. A `Service` is always created; enable the `ServiceMonitor` for Prometheus discovery:\n\n```bash\nhelm install envoy-router oci://ghcr.io/comet-ml/charts/envoy-router \\\n  --namespace ns-1 --create-namespace \\\n  --set metrics.serviceMonitor.enabled=true \\\n  --set metrics.serviceMonitor.additionalLabels.release=prometheus\n```\n\n| Metric | Type | Description |\n|---|---|---|\n| `envoy_router_managed_pods` | Gauge | Pods currently managed by the operator |\n| `controller_runtime_reconcile_total` | Counter | Reconcile calls by result (success/error/requeue) |\n| `controller_runtime_reconcile_time_seconds` | Histogram | Reconcile duration |\n\n## Test chart\n\n`charts/envoy-router-test` is a self-contained smoke-test chart that installs `envoy-router` as a dependency alongside test pods and an internal ALB Ingress:\n\n```bash\n# First namespace (creates EG controller + GatewayClass)\nhelm upgrade --install --namespace envoy-router-test --create-namespace \\\n  envoy-router-test charts/envoy-router-test\n\n# Additional namespaces\nhelm upgrade --install --namespace envoy-router-test-2 --create-namespace \\\n  --set ingress.host=test-pp-2.dev.comet.com \\\n  --set envoy-router.gateway.createClass=false \\\n  --set envoy-router.envoy-gateway.enabled=false \\\n  envoy-router-test-2 charts/envoy-router-test\n```\n\n## Development\n\n```bash\nmake build          # build binary\nmake test           # run tests\nmake docker-build   # build image (IMAGE_REPO / IMAGE_TAG overridable)\nmake docker-push\nmake helm-test      # run helm-unittest\nmake upgrade        # helm upgrade after changes\n```\n\n## Releases\n\nDocker images and Helm charts are published to GHCR on every `v*` tag.\n\n| Artifact | Location |\n|---|---|\n| Docker image | `ghcr.io/comet-ml/envoy-router` |\n| Helm chart | `oci://ghcr.io/comet-ml/charts/envoy-router` |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcomet-ml%2Fenvoy-router","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcomet-ml%2Fenvoy-router","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcomet-ml%2Fenvoy-router/lists"}