Install on GKE with Helm
Install CodeIntegrity in a GKE cluster with Helm.
This guide installs the CodeIntegrity dashboard, MCP gateway, token vault, sandbox runtime, PostgreSQL databases, and a public GKE Gateway.
The initial deployment uses HTTP for evaluation. Configure HTTPS before using OAuth-protected MCP servers.
Before you begin
You need:
- A GKE cluster with Gateway API enabled
gcloudandkubectl- Helm 3.17 or newer
- OpenSSL, Perl, and cURL
codeintegrity-pull-key.jsonfrom CodeIntegrity
Use the latest Helm release. Helm enabled OCI support by default in 3.8, and
the --take-ownership flag used below was added in 3.17.
Run the commands in this guide from Bash or Zsh.
Remove an existing deployment
Skip this section for a new installation or an upgrade.
These commands permanently delete the existing CodeIntegrity deployment and all data stored in its Kubernetes namespaces.
CONTEXT="$(kubectl config current-context)"
printf 'This permanently deletes CodeIntegrity from %s.\n' "$CONTEXT"
read -r -p "Type the full context name to continue: " CONFIRM_CONTEXT
test "$CONFIRM_CONTEXT" = "$CONTEXT" || exit 1
helm uninstall codeintegrity -n codeintegrity --ignore-not-found
helm uninstall agent-sandbox -n agent-sandbox-system --ignore-not-found
kubectl delete namespace codeintegrity agent-sandbox-system --ignore-not-found
kubectl wait --for=delete namespace/codeintegrity --timeout=15m
kubectl wait --for=delete namespace/agent-sandbox-system --timeout=15mInstall CodeIntegrity
Check Helm and connect to GKE
Confirm your Helm version and the cluster where you want to install CodeIntegrity:
helm version --short
CONTEXT="$(kubectl config current-context)"
printf 'Target context: %s\n' "$CONTEXT"
read -r -p "Type the full context name to continue: " CONFIRM_CONTEXT
test "$CONFIRM_CONTEXT" = "$CONTEXT" || exit 1
kubectl get storageclass
kubectl get gatewayclass gke-l7-global-external-managedContinue when Helm reports version 3.17 or newer, the context is correct, and the last two commands return a storage class and the GKE Gateway class.
Download the Helm charts
From the directory containing codeintegrity-pull-key.json, create an
installation directory and sign in to the CodeIntegrity registry:
mkdir -p codeintegrity-install
cp codeintegrity-pull-key.json codeintegrity-install/
cd codeintegrity-install
base64 < codeintegrity-pull-key.json | tr -d '\n' | \
helm registry login us-central1-docker.pkg.dev \
-u _json_key_base64 \
--password-stdinDownload the latest charts:
rm -rf agent-sandbox-chart codeintegrity-chart
helm pull \
oci://us-central1-docker.pkg.dev/orchestrator-prod-492817/codeintegrity/charts/agent-sandbox \
--untar --untardir agent-sandbox-chart
helm pull \
oci://us-central1-docker.pkg.dev/orchestrator-prod-492817/codeintegrity/charts/codeintegrity \
--untar --untardir codeintegrity-chart
cp codeintegrity-chart/codeintegrity/values.onpremise.yaml values.yamlConfigure CodeIntegrity
The chart includes the complete values.yaml below. The previous step
copied it into your installation directory. You can also copy this example
into values.yaml:
global:
imageTag: ""
webAppUrl: http://localhost:3000
mcpGatewayUrl: http://localhost:8080
imagePullSecret:
username: _json_key_base64
password: replace-with-base64-encoded-pull-key
secrets:
internalApiToken: replace-with-internal-api-token
sandboxProxyToken: replace-with-sandbox-proxy-token
tokenvaultEncryptionKey: replace-with-32-byte-vault-encryption-key
betterAuthSecret: replace-with-better-auth-secret
geminiApiKey: replace-with-gemini-api-key
googleClientSecret: ""
microsoftClientSecret: ""
dashboardIdpClientSecret: ""
postgres:
dashboard:
password: replace-with-dashboard-postgres-password
gateway:
password: replace-with-gateway-postgres-password
tokenvault:
password: replace-with-tokenvault-postgres-password
gateway:
replicas: 1
auth:
issuer: ""
jwksUrl: ""
sandbox:
runtime:
replicas: 6
dashboard:
google:
clientId: ""
microsoft:
clientId: ""
tenantId: ""
idp:
issuer: ""
clientId: ""
scopes: openid profile email
roleClaim: role
gkeGateway:
enabled: true
healthCheckPolicy: trueGenerate the required secrets and save them in values.yaml:
perl -0pi -e "
s#replace-with-base64-encoded-pull-key#$(base64 < codeintegrity-pull-key.json | tr -d '\n')#;
s#replace-with-internal-api-token#$(openssl rand -base64 32 | tr -d '\n')#;
s#replace-with-sandbox-proxy-token#$(openssl rand -base64 32 | tr -d '\n')#;
s#replace-with-32-byte-vault-encryption-key#$(openssl rand -hex 16)#;
s#replace-with-better-auth-secret#$(openssl rand -base64 32 | tr -d '\n')#;
s#replace-with-gemini-api-key#\"\"#;
s#replace-with-dashboard-postgres-password#$(openssl rand -base64 32 | tr -d '\n')#;
s#replace-with-gateway-postgres-password#$(openssl rand -base64 32 | tr -d '\n')#;
s#replace-with-tokenvault-postgres-password#$(openssl rand -base64 32 | tr -d '\n')#;
" values.yaml
chmod 600 values.yaml
if grep -Eq 'replace-with-[a-z]' values.yaml; then
echo "values.yaml still contains required placeholders"
exit 1
fiStore values.yaml securely. You need the same file to upgrade the
deployment and recover encrypted credentials.
Install Agent Sandbox
helm upgrade --install agent-sandbox \
agent-sandbox-chart/agent-sandbox \
--namespace agent-sandbox-system \
--create-namespace \
--wait --timeout 10mInstall CodeIntegrity
This deployment creates the GKE Gateway that provides the public address.
helm upgrade --install codeintegrity \
codeintegrity-chart/codeintegrity \
--namespace codeintegrity \
--create-namespace \
-f values.yaml \
--take-ownership \
--wait --timeout 10mSet the public address
Wait for GKE to assign an IP address, then save it in values.yaml:
kubectl wait --for=condition=Programmed gateway/codeintegrity-route \
-n codeintegrity --timeout=15m
IP="$(kubectl get gateway codeintegrity-route -n codeintegrity \
-o jsonpath='{.status.addresses[0].value}')"
test -n "$IP" || { echo "Gateway external IP is not ready"; exit 1; }
perl -0pi -e \
"s#webAppUrl: .*#webAppUrl: http://${IP}#; s#mcpGatewayUrl: .*#mcpGatewayUrl: http://${IP}#" \
values.yamlApply the public address:
helm upgrade --install codeintegrity \
codeintegrity-chart/codeintegrity \
--namespace codeintegrity \
--create-namespace \
-f values.yaml \
--take-ownership \
--wait --timeout 10mVerify the deployment
Wait up to 10 minutes for the public endpoint:
IP="$(kubectl get gateway codeintegrity-route -n codeintegrity \
-o jsonpath='{.status.addresses[0].value}')"
for attempt in {1..60}; do
curl -fsS "http://$IP/api/health" && break
sleep 10
done
curl -fsS "http://$IP/api/health"
printf '\nOpen http://%s\n' "$IP"A healthy deployment returns:
{"status":"ok","database_ok":true,"schema_ok":true}Open the printed URL and create your account.
Try your gateway
In the dashboard:
- Open MCP Servers and add a server from the catalog (for example DeepWiki, which needs no credentials).
- Open MCP Gateways, create a gateway, and select the server you just added. The gateway status becomes Active within a few seconds.
- Open API Keys and create a key. Copy it immediately — it is shown only once.
Then call the gateway's MCP endpoint with your key (replace <slug>
with your gateway's slug and <key> with the copied key):
IP="$(kubectl get gateway codeintegrity-route -n codeintegrity \
-o jsonpath='{.status.addresses[0].value}')"
curl -fsS "http://$IP/mcp/<slug>" \
-H "Authorization: Bearer <key>" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"curl","version":"1.0"}}}'A valid key returns the gateway's initialize response (server info and
capabilities); a missing or revoked key returns 401. Your tools are
available as search and execute_code on the same endpoint with any
MCP client.
Configure HTTPS for OAuth (optional)
Skip this section if you are evaluating CodeIntegrity over HTTP without
OAuth-protected MCP servers. OAuth requires HTTPS and a stable hostname.
Replace app.example.com with your hostname.
Reserve a static IP
DOMAIN=app.example.com
gcloud compute addresses create codeintegrity-ip --global --ip-version=IPV4
STATIC_IP="$(gcloud compute addresses describe codeintegrity-ip \
--global --format='value(address)')"
printf 'Create an A record for %s pointing to %s\n' "$DOMAIN" "$STATIC_IP"Create the certificate
DOMAIN=app.example.com
gcloud certificate-manager dns-authorizations create codeintegrity-dns-auth \
--domain="$DOMAIN"
gcloud certificate-manager dns-authorizations describe codeintegrity-dns-auth \
--format='value(dnsResourceRecord.name, dnsResourceRecord.data)'
gcloud certificate-manager certificates create codeintegrity-cert \
--domains="$DOMAIN" \
--dns-authorizations=codeintegrity-dns-auth
gcloud certificate-manager maps create codeintegrity-cert-map
gcloud certificate-manager maps entries create codeintegrity-cert-map-entry \
--map=codeintegrity-cert-map \
--certificates=codeintegrity-cert \
--hostname="$DOMAIN"Create the DNS records
Create the CNAME printed by the DNS authorization command and the A record printed by the static IP command.
Update values.yaml
Set these values, replacing app.example.com with your hostname:
global:
webAppUrl: https://app.example.com
mcpGatewayUrl: https://app.example.com
gkeGateway:
enabled: true
staticIpName: codeintegrity-ip
publicHost: app.example.com
certificateMapName: codeintegrity-cert-map
healthCheckPolicy: trueApply and verify HTTPS
helm upgrade --install codeintegrity \
codeintegrity-chart/codeintegrity \
--namespace codeintegrity \
--create-namespace \
-f values.yaml \
--take-ownership \
--wait --timeout 10mWhen the certificate becomes active, verify the public endpoint:
DOMAIN=app.example.com
curl -fsS "https://$DOMAIN/api/health"If you created MCP gateways before changing the hostname, open MCP Gateways and save each gateway once. This updates its connection URL and OAuth callback.
Upgrade CodeIntegrity
Run this from your codeintegrity-install directory. Your registry
credentials from the install are reused, and values.yaml stays as-is.
rm -rf agent-sandbox-chart codeintegrity-chart && \
helm pull oci://us-central1-docker.pkg.dev/orchestrator-prod-492817/codeintegrity/charts/agent-sandbox --untar --untardir agent-sandbox-chart && \
helm pull oci://us-central1-docker.pkg.dev/orchestrator-prod-492817/codeintegrity/charts/codeintegrity --untar --untardir codeintegrity-chart && \
kubectl apply -f agent-sandbox-chart/agent-sandbox/crds/ && \
helm upgrade --install agent-sandbox agent-sandbox-chart/agent-sandbox \
--namespace agent-sandbox-system --wait --timeout 10m && \
helm upgrade --install codeintegrity codeintegrity-chart/codeintegrity \
--namespace codeintegrity -f values.yaml --take-ownership --wait --timeout 10mMCP traffic pauses for a few seconds while the gateway restarts. Data, API keys, and audit history are preserved automatically. Access policies and named API-key server assignments are not carried over — recreate them after the upgrade.
Verify with curl -fsS http://<your-address>/api/health — it should report
database_ok and schema_ok as true.