GKE Helm Chart
Helm chart for deploying DecisionRules to Google Kubernetes Engine (GKE). What it deploys, what you need to provision separately, and how to configure it.
The decisionrules-gke chart deploys DecisionRules to Google Kubernetes Engine (GKE), both Standard and Autopilot clusters. The client and the server are exposed through a single GKE Ingress (Google Cloud Application Load Balancer) with a Google-managed TLS certificate by default. All credentials are read from Kubernetes Secrets that you create yourself, so nothing sensitive is stored in values files or in the Helm release.
For a complete walkthrough including the Google Cloud infrastructure, see Google Kubernetes Engine (GKE).
Chart name
decisionrules-gke
Helm repository
https://decisionrules.github.io/helm-charts/decisionrules-gke/
Artifact Hub
Images
decisionrules/client (rootless variant), decisionrules/server, decisionrules/ai-engine, decisionrules/business-intelligence from Docker Hub
What you need to provision separately
The chart deploys only the DecisionRules application. Prepare the following before you install it:
GKE cluster
Yes
Standard or Autopilot. It must be VPC-native (the default for new clusters) with the HTTP Load Balancing add-on enabled (also the default).
MongoDB
Yes
Two databases: the main database (MONGO_DB_URI) and the Business Intelligence (audit) database (BI_MONGO_DB_URI). They can live on the same MongoDB cluster, for example MongoDB Atlas connected through network peering.
Redis
Yes
For example Memorystore for Redis. Used by the server (REDIS_URL).
DecisionRules license key
Yes
LICENSE_KEY
Secret with the AI provider key (AIA_SECRET)
Only with AI Engine
The AI Engine is enabled by default. See AI Engine providers and models.
Two DNS names (client and API)
Yes, with Ingress
You create A records pointing at the load balancer IP.
Reserved static IP address
Recommended
Keeps the IP stable if the Ingress is recreated. Global for the external load balancer, regional for the internal one.
SSL policy, Cloud Armor policy
Optional
Referenced by name.
Your own TLS certificate
Optional
Instead of the Google-managed certificate. Required for the internal load balancer.
Outbound proxy and a ConfigMap with its CA certificate
Optional
Only when outbound traffic must go through a proxy.
Outbound access to the license and distribution servers
Yes
See Prerequisites, or use an Offline License.
The chart does not create MongoDB, Redis, Secrets, ConfigMaps, static IP addresses, DNS records or persistent volumes.
What the chart deploys
Client
Deployment, Service
Yes
client.enabled
Server
Deployment, Service, HorizontalPodAutoscaler
Yes
server.enabled, server.autoscaling.enabled
AI Engine
Deployment, Service (cluster-internal only)
Yes
aiEngine.enabled
Business Intelligence
Deployment (no Service)
Yes
businessIntelligence.enabled
Load balancer
Ingress, ManagedCertificate, FrontendConfig, BackendConfig (one per client and server Service)
Yes
ingress.*
Resources are named after the Helm release, for example <release>-server, <release>-server-service and <release>-ingress.
When the Ingress is enabled:
One Ingress routes
ingress.hosts.clientto the client andingress.hosts.serverto the server, so a single load balancer with one IP address serves both.The client and server Services use container-native load balancing (network endpoint groups).
A BackendConfig per Service sets the load balancer health check explicitly:
/health-checkon the server,/on the client.A ManagedCertificate requests a Google-managed certificate for both hostnames.
A FrontendConfig redirects HTTP to HTTPS and applies an optional SSL policy.
Secrets
The chart reads credentials from existing Kubernetes Secrets in the release namespace. You set only the name of the Secret in the values, never the values themselves.
server.existingSecret
decisionrules-config
MONGO_DB_URI, BI_MONGO_DB_URI, REDIS_URL, LICENSE_KEY
aiEngine.existingSecret
decisionrules-config
AIA_SECRET (only when aiEngine.enabled=true)
The chart fails to render with a clear error message when server.existingSecret is empty, or when aiEngine.existingSecret is empty while the AI Engine is enabled.
Using Google Secret Manager
For production, keep the credentials in Google Secret Manager and sync them into the cluster with the External Secrets Operator, authenticated through Workload Identity. The Kubernetes ServiceAccount used by the SecretStore needs the roles/secretmanager.secretAccessor role on the secrets.
Exposing the application
Default: external load balancer with a Google-managed certificate
With the defaults, you only set the two hostnames (and, ideally, a reserved static IP address):
After installation, point DNS A records for both hostnames at the load balancer IP address. Google provisions the certificate only after DNS resolves to the load balancer, which usually takes 15 to 60 minutes. Until the certificate is Active, HTTPS requests fail and HTTP requests are redirected to HTTPS.
Your own certificate
Disable the managed certificate and reference either a Kubernetes TLS Secret or certificates already uploaded to Google Cloud:
Internal load balancer
For a deployment that is reachable only from your VPC (and connected networks), use the internal Application Load Balancer (gce-internal). It needs a proxy-only subnet in the cluster's region. Google-managed certificates are not supported by the internal load balancer, and the chart applies the HTTPS redirect and the SSL policy (FrontendConfig) only to the external one. Provide your own certificate:
Your own ingress or Gateway API
Set ingress.enabled=false to expose the Services yourself, for example with Gateway API HTTPRoute resources. In that case the chart cannot derive the public URLs, so you must set them explicitly:
The Services are <release>-client-service (port 4000) and <release>-server-service (port 8080).
Application URLs
API_URL
Server, Client
server.apiUrl (for the client client.apiUrl takes precedence) → <scheme>://<ingress.hosts.server>
CLIENT_URL
Server
server.clientUrl → <scheme>://<ingress.hosts.client>/#
AI_ENGINE_URL
Server
server.aiEngineUrl → internal AI Engine Service URL (only when the AI Engine is enabled)
The scheme is https when a certificate is configured (managed certificate, tls.secretName or tls.preSharedCerts), otherwise http. If the Ingress or the corresponding component is disabled and no explicit URL is set, the chart fails with an error message instead of using a placeholder.
Server sizing
The server.solver value sizes the server for the rule solver you use:
server.solver
Use for
Server CPU / memory per Pod
Autoscaling
aero (default)
AERO (v2) solver or mixed v1/v2 traffic
4000m / 4Gi (requests = limits)
2–5 Pods
gaia
GAIA (v1) solver only
1000m / 1Gi requests, 2000m / 2Gi limits
2–10 Pods
AERO uses several CPUs within one process, so it runs best on fewer, larger replicas. The profiles are defined in server.solverProfiles in the chart's values.yaml, so you can adjust them, for example --set server.solverProfiles.aero.maxReplicas=8. To size the server yourself regardless of the profile, set server.resources and server.autoscaling.minReplicas / maxReplicas; they take precedence over the profile. See server sizing for scaling and resource reserve.
On GKE Autopilot you pay for the requested resources, so the aero profile with two server Pods requests 8 vCPU and 8 GiB for the server alone.
Security context
GKE does not enforce non-root containers by default, so the chart sets a security context for every component. It is compatible with the Kubernetes restricted Pod Security Standard and with typical Policy Controller / Gatekeeper rules:
runAsNonRoot: truewith the image's user ID:runAsUser: 100for the client, server and Business Intelligence,999for the AI EngineseccompProfile: RuntimeDefaultallowPrivilegeEscalation: falseand all Linux capabilities dropped
The client must use a rootless image tag (for example 1.26.2.1-rootless), which listens on port 4000. To remove a security context, set it to null. An empty {} is merged with the defaults and has no effect:
Optional features
What changes when you turn each feature on or off:
Configuration reference
Ingress
ingress.enabled
true
Create the Ingress and related GKE resources.
ingress.className
gce
gce for the external load balancer, gce-internal for the internal one.
ingress.hosts.client
""
Client hostname. Required when the Ingress is enabled.
ingress.hosts.server
""
API hostname. Required when the Ingress is enabled.
ingress.staticIpName
""
Name of a reserved static IP address. Empty means an ephemeral IP.
ingress.tls.managedCertificate.enabled
true
Google-managed certificate for both hostnames. gce only.
ingress.tls.secretName
""
Kubernetes TLS Secret with your own certificate.
ingress.tls.preSharedCerts
""
Comma-separated names of Google Cloud SSL certificates.
ingress.tls.redirectToHttps
true
Redirect HTTP to HTTPS. gce only, applied only when a certificate is configured.
ingress.tls.sslPolicy
""
Google Cloud SSL policy name, for example one enforcing TLS 1.2+. gce only.
ingress.backendConfig.timeoutSec
30
Load balancer backend timeout in seconds.
ingress.backendConfig.securityPolicy
""
Cloud Armor security policy name. gce only.
ingress.annotations
{}
Extra Ingress annotations, for example kubernetes.io/ingress.allow-http: "false".
Client
client.enabled
true
Deploy the client.
client.replicaCount
2
Number of client pods.
client.image.repository / tag
decisionrules/client / latest-rootless
Use a rootless tag, for example 1.26.2.1-rootless.
client.port
4000
Port the rootless image listens on.
client.apiUrl
""
Overrides API_URL for the client only.
client.resources
250m / 128Mi requests, 500m / 256Mi limits
CPU and memory.
client.podSecurityContext, client.securityContext
see Security context
Pod and container security context.
Server
server.enabled
true
Deploy the server.
server.replicaCount
2
Number of server pods when autoscaling is disabled.
server.image.repository / tag
decisionrules/server / latest
Pin a version in production, for example 1.26.2.1.
server.port
8080
Server port.
server.solverProfiles.aero, server.solverProfiles.gaia
see Server sizing
Server resources, minReplicas and maxReplicas of each profile.
server.resources
From the server.solver profile
CPU and memory of the server. Overrides the profile when set.
server.existingSecret
decisionrules-config
Name of the connection Secret. Required.
server.apiUrl
""
Overrides API_URL. Required when the Ingress is disabled.
server.clientUrl
""
Overrides CLIENT_URL. Must end with /#. Required when the Ingress is disabled.
server.aiEngineUrl
""
Overrides AI_ENGINE_URL.
server.inMemoryRuleCount
40
IN_MEMORY_RULE_COUNT, number of rules cached in memory.
server.flushRedisOnStartup
false
FLUSH_REDIS_ON_STARTUP.
server.extraEnv
[]
Additional environment variables.
server.autoscaling.enabled
true
Create the HorizontalPodAutoscaler.
server.autoscaling.minReplicas / maxReplicas
From the server.solver profile
Autoscaling range (2–5 for aero, 2–10 for gaia). Overrides the profile when set.
server.autoscaling.targetCPUUtilizationPercentage
60
CPU target.
server.podSecurityContext, server.securityContext
see Security context
Pod and container security context.
server.startupProbe, livenessProbe, readinessProbe
HTTP /health-check on port 8080
Probe definitions. The startup probe gives the server up to 65 seconds to start.
AI Engine
aiEngine.enabled
true
Deploy the AI Engine.
aiEngine.replicaCount
1
Number of pods.
aiEngine.image.repository / tag
decisionrules/ai-engine / latest
Image.
aiEngine.port
8084
Service port.
aiEngine.provider, family, model
""
AI provider, model family and model.
aiEngine.additionalDataJson
""
Provider-specific settings as a JSON string.
aiEngine.existingSecret
decisionrules-config
Name of the Secret with AIA_SECRET.
aiEngine.resources
250m / 256Mi requests, 500m / 512Mi limits
CPU and memory.
aiEngine.podSecurityContext, aiEngine.securityContext
see Security context
Pod and container security context.
Business Intelligence
businessIntelligence.enabled
true
Deploy Business Intelligence.
businessIntelligence.replicaCount
1
Number of pods.
businessIntelligence.image.repository / tag
decisionrules/business-intelligence / latest
Image.
businessIntelligence.resources
250m / 256Mi requests, 500m / 512Mi limits
CPU and memory.
businessIntelligence.podSecurityContext, businessIntelligence.securityContext
see Security context
Pod and container security context.
Proxy
proxy.enabled
false
Inject proxy settings into the Server and the AI Engine.
proxy.httpProxy, httpsProxy, noProxy
""
Proxy URLs and exclusions.
proxy.caBundle.enabled
false
Mount the proxy CA certificate.
proxy.caBundle.configMapName
""
ConfigMap with the CA certificate. Required when caBundle.enabled=true.
proxy.caBundle.mountPath
/etc/ssl/custom
Mount directory.
proxy.caBundle.fileName
mitmproxy-ca.pem
Key in the ConfigMap / file name.
Example values
Install
Create the namespace and the Secrets first (see Secrets), then install the chart:
To apply changed values or a new chart version later:
Verify
The post-install notes printed by Helm list the exact commands for your release. For the expected timeline and common issues, see Last checks & Troubleshooting in the GKE deployment guide.
MongoDB Atlas
MongoDB Atlas is a common choice for the database on GKE. Connect it privately with VPC network peering, use the private connection string (with -pri in the hostname), and add the cluster's Pod IP range to the Atlas IP access list. GKE Pods keep their own IP addresses when they talk to a peered network, so the Pod range, not only the node range, is what Atlas sees. See the Google Cloud section of MongoDB Atlas Network Peering for step-by-step instructions.
Last updated
Was this helpful?

