Conversation
Build and publish versioned binaries, container images, and Helm charts from release tags. Signed-off-by: Eitan Yarmush <eitan.yarmush@solo.io>
Resolve atelet discovery and identity from the pod namespace, centralize install defaults, and allow explicitly selected local clusters to run without Pod Certificates. Keep authenticated transport as the default. Signed-off-by: Eitan Yarmush <eitan.yarmush@solo.io>
Add a configurable end-to-end workflow deadline and propagate it through lease acquisition. Apply released worker assignments to the cache immediately so subsequent scheduling sees the completed pause. Signed-off-by: Eitan Yarmush <eitan.yarmush@solo.io>
Parse PKCS1 RSA and SEC1 EC keys alongside PKCS8 keys, including regression coverage for RSA bundles. Signed-off-by: Eitan Yarmush <eitan.yarmush@solo.io>
Require the agentgateway E2E lane, reuse the installed control plane for microVM demos, wait for asset storage initialization, and accommodate runtime startup and counter persistence behavior in E2E checks. Signed-off-by: Eitan Yarmush <eitan.yarmush@solo.io>
Package the control plane, workers, PostgreSQL, RustFS, and CRDs as Helm charts. Keep manifests and generated RBAC aligned, add Helm E2E checks, and include current scheduling, sandbox permissions, and agentgateway configuration. Co-authored-by: Jet Chiang <jetjiang.ez@gmail.com> Co-authored-by: Keith Mattix II <keithmattix2@gmail.com> Signed-off-by: Jet Chiang <pokyuen.jetchiang-ext@solo.io> Signed-off-by: Eitan Yarmush <eitan.yarmush@solo.io>
Allow an external PostgreSQL instance and a configurable schema, validate connection settings, and pass the schema to the API server. Signed-off-by: Eitan Yarmush <eitan.yarmush@solo.io>
Wire the API server snapshot backend and S3 settings to the chart storage configuration. Signed-off-by: Eitan Yarmush <eitan.yarmush@solo.io>
Configure trace, metric, and log endpoints independently, expose trace sampling, and route agentgateway access logs through the collector logs pipeline. Signed-off-by: Eitan Yarmush <eitan.yarmush@solo.io>
Isolate sandbox asset download tests from pause image pulls, explicitly advance the CA file timestamp, and disable VCS stamping for license checks in temporary verification worktrees. Signed-off-by: Eitan Yarmush <eitan.yarmush@solo.io>
Delete application containers before the pause container so their shared sandbox remains available throughout teardown. Cover the deletion order with a regression test. Signed-off-by: Eitan Yarmush <eitan.yarmush@solo.io>
Rebuild the fork on upstream while preserving features, require agentgateway runtime validation, and use a guarded push. Delete task-owned clusters and disposable assets before finishing while preserving shared resources and recovery data. Signed-off-by: Eitan Yarmush <eitan.yarmush@solo.io>
Select agentgateway expectations in the Helm test job, align the chart sandbox assets with the canonical manifest, and enable the CONNECT tunnel logging used by egress validation. This retains upstream gVisor checkpoint and restore fixes and closes configuration gaps between Helm and manifest installations. Signed-off-by: Eitan Yarmush <eitan.yarmush@solo.io>
Expose ateApi.extraArgs so installations can configure API flags such as the template resync interval without editing the deployment template. Signed-off-by: Eitan Yarmush <eitan.yarmush@solo.io>
A layer pull can share a singleflight call with retirement and return without unpacking the removed layer. Distinguish pull results from retirement results and retry after retirement completes. Cover the interleaving with a deterministic concurrency test. Signed-off-by: Eitan Yarmush <eitan.yarmush@solo.io>
The egress ext_proc server listens on loopback. Probe the metrics readiness endpoint so Kubernetes can observe readiness through the pod IP, matching the upstream manifests. Signed-off-by: Eitan Yarmush <eitan.yarmush@solo.io>
global.imageRegistry redirects every image at once for air-gapped mirrors. Component images now resolve through the same registry/repository split every kagent-family chart uses: image.registry was one string carrying its path (ghcr.io/kagent-dev/substrate) and is now the registry host only, joined onto image.repository, so one global value (which overrides image.registry) redirects the whole family. This is a breaking change for values files that put a full prefix in image.registry: rendered silently they would produce a doubled prefix failing only at pod start, so the render fails instead, naming the split. A default render is byte-identical to main. Single-string images.* references (postgres, rustfs, aws-cli, agentgateway) have their registry segment replaced by the containerd rule (first path segment with a dot or colon), preserving repository paths either way. global.imagePullSecrets merges (union) into every pod spec, which previously had no pull-secret surface at all. global.imagePullPolicy replaces the hardcoded IfNotPresent values as a fallback, via substrate.imagePullPolicy. Verified: a default render is byte-identical to main; the mirror knob redirects all 9 images with paths preserved; the old-shape registry fails loudly at template time; pull secrets land on all 9 pod specs; the pullPolicy fallback fires. Signed-off-by: Jonathan Jamroga <jjamroga@gmail.com> Signed-off-by: Eitan Yarmush <eitan.yarmush@solo.io>
* Add Kubernetes credential sidecar for agentgateway egress Resolve ate-secret URIs from Kubernetes Secrets with injector-only mTLS and default-deny atespace-to-namespace grants. Deploy the provider alongside ateapi so it can reuse the existing Pod identity, certificate, and Service. Wire the provider into agentgateway's HTTPS interception route, with optional Helm and Kustomize configuration and namespace-scoped RBAC setup. Pin the nightly containing credential-provider configuration support; its RPC and URI scheme still need alignment before end-to-end injection works. Co-authored-by: Yufan Su <yufans@google.com> Signed-off-by: Eitan Yarmush <eitan.yarmush@solo.io> * Exercise credential injection through the rendered AGW route Add an opt-in Docker integration test covering actor authentication, TLS interception, provider mTLS, namespace denial, and cleartext denial using the Helm egress configuration. Signed-off-by: Eitan Yarmush <eitan.yarmush@solo.io> * Pin AGW with the current credential-provider protocol Use the published multi-architecture build supporting FetchSecret and ate-secret URIs. Document the tested integration and keep Docker pull diagnostics out of the integration test container ID. Signed-off-by: Eitan Yarmush <eitan.yarmush@solo.io> * Exercise Kubernetes credential injection through real actors in Helm E2E Validate exact header injection and namespace, RBAC, and cleartext denials against a local HTTPS origin. Remove fixture workers before their namespace to avoid delayed namespace finalization. Signed-off-by: Eitan Yarmush <eitan.yarmush@solo.io> * Deploy the Kubernetes credential provider independently of ateapi Follow the upstream package and Deployment layout with a dedicated ServiceAccount and Service. Consolidate gateway integration coverage into the cluster E2E suite, including cache isolation across atespaces. Signed-off-by: Eitan Yarmush <eitan.yarmush@solo.io> * Test credential injection through the installed HTTP route Install the provider's get-only Secret RBAC with the chart and standalone manifests. Enable injection on HTTP alongside HTTPS so the E2E can use the installed gateway configuration without modifying ConfigMaps or provisioning origin certificates. Signed-off-by: Eitan Yarmush <eitan.yarmush@solo.io> * Always install credential injection and HTTPS interception Configure the provider and MITM gateway on every Helm install, and run credential and MITM E2E alongside the standard suites using the initial configuration. Signed-off-by: Eitan Yarmush <eitan.yarmush@solo.io> --------- Signed-off-by: Eitan Yarmush <eitan.yarmush@solo.io> Co-authored-by: Yufan Su <yufans@google.com> Signed-off-by: Eitan Yarmush <eitan.yarmush@solo.io>
Build the nested provider package with the release images and publish it under the kubernetes-secrets basename expected by the Helm chart. Signed-off-by: Eitan Yarmush <eitan.yarmush@solo.io>
…y Secrets Signed-off-by: David Haifley <david.haifley@solo.io>
EItanya
force-pushed
the
main
branch
2 times, most recently
from
September 23, 2026 12:32
709c0f0 to
0401cc1
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
A Google service account key cannot be injected into a request as it stands. Vertex AI and the other Google APIs accept OAuth 2.0 access tokens, and minting one means signing a JWT with the key's private key, which a static header value cannot do. Once every credential goes through the egress gateway, a workload behind it such as Claude Code or the Google SDKs has no way to reach Vertex AI.
This adds a second provider name to the Kubernetes credential provider,
google-access-token.kubernetes.io, served by the same Deployment. The path is the same<namespace>/<secret>[/<key>], and the same injector identity, atespace-to-namespace grant and Secret RBAC apply. The provider parses the entry as a service account key, signs the JWT bearer assertion, exchanges it at the key'stoken_uri(HTTPS only) for acloud-platformaccess token, and returns the token in place of the key. The service account's IAM roles decide what the token may do.Tokens are cached per key contents and handed out while at least fifteen minutes remain. The gateway caches a fetched credential for five minutes per actor, so a token returned with less than that left would be used after it expired; the margin keeps the two caches apart and still exchanges a key about once every 45 minutes of an hour-long token. Concurrent fetches of one key share a single exchange, and a rotated key is exchanged on its next fetch. A Secret that is not a service account key, or a key Google rejects, fails with
FAILED_PRECONDITIONnaming the reason; an unreachable token endpoint fails withUNAVAILABLE. Neither the key nor the token is logged.The Helm chart and the agentgateway kustomize component route the new authority to the provider on both the HTTPS and HTTP routes. agentgateway matches the URI authority exactly against that list, so a URI naming the new authority is denied until the entry is present. The Envoy data plane's
--credential-provider-nameflag names one provider and is unchanged; the docs say so.golang.org/x/oauth2becomes a direct dependency; it was already vendored.Not included: a case in the credentials e2e suite, which would need an in-cluster stand-in for Google's token endpoint with a certificate the provider trusts. The unit tests cover the exchange against a TLS stand-in instead.
Testing:
go test -race ./cmd/credential-provider/...: exchange, caching, refresh ahead of the gateway cache, shared concurrent exchange, key rotation, error mapping (non-key Secret, user credential, plaintext token endpoint, corrupt private key, rejected assertion, endpoint failure, short-lived token, missing expiry), denial before any lookup, both authorities on both gateway routes in the chart and kustomize renders.golangci-lint (0 issues), boilerplate headers,
go mod tidyandgo mod vendorproduce no further change,hack/render-manifests.sh --checkpasses.By hand, not committed: with a real service account key the exchanger minted a token from Google's token endpoint, served the second call from cache, and Vertex AI accepted the token for a Claude Sonnet 4.5 request (HTTP 200).
Tests pass
Appropriate changes to documentation are included in the PR