Deploy HugeGraph with Helm
This guide follows the chart in the HugeGraph development branch. Image tags remain latest until release images are published;
pin images for your installation. The chart requires Helm 3 and Kubernetes 1.23 or later.
Start with the chart README for common commands and settings.
Advanced lifecycle procedures are in the operations reference.
1 Install
Default Topology & Storage Prerequisites
- Components: Deploys 3 PD + 3 Store + 3 Server and Hubble by default, with authentication and persistent storage enabled.
- Volume Requirements: Requires a default dynamic StorageClass or matching pre-created static PVs, totaling 7 persistent volumes (3 × 10 GiB PD volumes, 3 × 50 GiB Store volumes, and 1 × 1 GiB Hubble volume).
- Memory Sizing: Retains container JVM memory auto-calculation; configure resource requests/limits to allocate sufficient physical memory for the 9 JVMs and Hubble.
2 Modes and entry points
HugeGraph Helm Chart Layout
helm/hugegraph/
- Chart.yamlChart metadata and version definitions
- values.yamlDefault values (easy mode: 3 PD + 3 Store + 3 Server + 1 Hubble, NodePort)
- values-single.yamlSingle-node preset (local Minikube/Kind testing with 1 replica and no anti-affinity)
- values-cluster.yamlMulti-node cluster preset (required anti-affinity, Store OnDelete rollout)
- values-strict.yamlHardened security preset (strict mode: ClusterIP only, strict NetworkPolicies)
- values.schema.jsonSchema validation for values configuration
templates/Kubernetes workload templates
- pd-statefulset.yamlPD StatefulSet (metadata and scheduling)
- store-statefulset.yamlStore StatefulSet (storage engine)
- server-deployment.yamlServer Deployment (injects serviceId and graphSpace)
- hubble-deployment.yamlHubble UI Deployment
- tests/Smoke validation hook (helm test, supports custom testGraphAlias)
- examples/Seven complete production scenario examples (local PVs, GitOps secrets, Ingress)
- docs/operations.mdLifecycle operations and recovery guide
mode: easy is the default. Server and Hubble use automatic NodePorts; PD stays ClusterIP. HTTP works without a domain, certificate or acknowledgement.
mode: strict defaults Server/Hubble to ClusterIP and enables NetworkPolicy. Both modes keep authentication and persistence.
Explicit component parameters take priority over global parameters, which take priority over mode defaults; explicit false remains an override.
The global parameters are persistence.enabled and global.imageRegistry. Strict mode is also available through values-strict.yaml.
| Entry | Access | Requirements |
|---|---|---|
| NodePort | http://<reachable-node-ip>:<assigned-node-port> | Node connectivity and firewall access; no additional controller |
| ClusterIP | Internal Service IP/DNS, for example hugegraph-server.hugegraph.svc:8080 | External clients use port-forward or an existing gateway |
| LoadBalancer | Infrastructure-assigned address | Compatible load balancer controller |
| Ingress | HTTP routing through a controller | Installed controller; hostname and TLS optional |
Open Hubble on its assigned NodePort and log in as admin with this password. A node need not host the Pod with default externalTrafficPolicy: Cluster.
The internal ClusterIP is a virtual Service address, not a node IP; a laptop normally cannot reach it directly.
Use kubectl -n hugegraph port-forward svc/hugegraph-hubble 8088:8088 for a local browser at http://127.0.0.1:8088.
Each client Service supports externalTrafficPolicy, loadBalancerClass, loadBalancerIP, loadBalancerSourceRanges, externalIPs
and allocateLoadBalancerNodePorts, subject to the cluster/controller’s capabilities. Use LoadBalancer fields with that Service type.
NodePort omission or 0 means automatic allocation. Fixed ports are validated against the cluster’s configured range by Kubernetes;
the chart does not force 30000–32767. Legacy HTTP acknowledgement fields remain accepted but no longer gate rendering.
Server service identity and graph space
Both server.serviceId and server.graphSpace default to DEFAULT. To register the Server with a specific service name or graph space in PD:
A non-default graph space must be created through the PD API before starting its assigned Server. server.testGraphAlias specifies the Gremlin binding checked
by helm test (case-sensitive) and does not auto-infer from graphSpace. Do not re-declare service ID or graph space in server.extraEnv.
3 Internal images and storage
Complete examples cover private registries, dynamic storage, seven local PVs, GitOps credentials, API-only deployment and a hostless HTTP Ingress.
Set global.imageRegistry to prefix unqualified image repositories; an explicit registry in a component repository takes precedence.
The default mirror inventory is only hugegraph/pd, hugegraph/store, hugegraph/server and hugegraph/hubble, at the configured tags/digests.
Store’s PD wait init container and the Helm test reuse Store and Server images respectively, which already contain curl.
No separate curl image or runtime package installation is required. Explicit store.waitImage / server.waitImage overrides remain supported.
For storage, empty storageClassName inherits the cluster default, while "-" explicitly selects no StorageClass.
Local PVs require prepared host directories, matching capacities, nodeAffinity and a kubernetes.io/no-provisioner StorageClass;
WaitForFirstConsumer binds with the Pod’s scheduling constraints. See the complete seven-volume example before creating resources.
For a new temporary installation, set persistence.enabled=false to use emptyDir; component storage flags override it.
The chart never replaces a failed PVC with temporary storage and rejects PD/Store storage-mode changes on initialized releases.
4 Authentication and secrets
Normal Helm installations generate and reuse three credentials: <release>-admin (password), <release>-auth-token (token_secret)
and <release>-pd-auth (secret-key). PD REST requires the shared PD secret, supplied to the PD container as HG_PD_AUTH_SECRET_KEY;
Server’s storage wait and Hubble read the same credential. It is not a separate user password that must be invented for each Pod.
For GitOps, use fixed encrypted values or pre-created Secrets through pd.auth.existingSecret, server.auth.admin.existingSecret
and server.auth.token.existingSecret. existingSecret wins over inline values and is not managed by the chart.
The admin password must be printable ASCII without spaces, colons or backslashes; the PD secret must be printable ASCII without surrounding whitespace
or backslashes; the JWT signing key must be at least 32 bytes. Offline renderers cannot reuse live generated Secrets through lookup.
The admin Secret is an initial credential. Updating it does not rotate an existing account.
Change the password through PUT /graphspaces/DEFAULT/auth/users/admin with {"user_password":"<new-password>"} using the existing credential,
update the Secret/source to that same password, then restart the Server Deployment to clear every replica’s auth cache.
Hubble is enabled by default and its current login requires Server authentication. Set hubble.enabled=false for API-only access;
optionally also set server.auth.enabled=false for an unauthenticated API. Inactive credential settings may remain in your values file.
5 Upgrade and verification
Use native Helm value reuse to preserve an old release’s UI, entry, storage and credentials:
Older explicit helper images also remain under --reuse-values; add --set-string store.waitImage= --set-string server.waitImage= to reuse component images.
Adopt new defaults deliberately with --reset-values and a reviewed file retaining your image, credential, storage and topology settings.
Do not treat PD membership, storage or credential changes as ordinary independent overrides; consult the lifecycle reference.
server.storageWaitTimeoutSeconds defaults to 300 and is passed as WAIT_STORAGE_TIMEOUT_S. An unspecified startup probe threshold is derived
from that wait plus 150 seconds; an explicit threshold is preserved and must cover the storage wait plus at least 120 seconds of Server startup.
A contradictory budget fails rendering with the relevant parameter names. Storage wait timeout is not a JVM memory setting.
Kubernetes readiness and helm test do not prove fresh UI login. Test login and graph queries after install/recovery.
For scheduling, NetworkPolicy, rolling updates and recovery, see Kubernetes operations.