PuppyGraph Helm Chart Installation Guide
This guide walks you through installing PuppyGraph using Helm Charts. Before you start, check the System Requirements. For the cluster architecture the chart provisions, the configuration knobs it exposes, scaling, and upgrades, see Cluster Deployment.
Install Helm
Helm is a package manager for Kubernetes that simplifies deployment and management of applications. Install Helm by following the instructions for your operating system:
# macOS (Homebrew)
brew install helm
# Linux (via script)
curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# Windows (Chocolatey)
choco install kubernetes-helm
For more installation details, refer to the official guide: Installing Helm
Verify Helm installation:
Run:
If the command executes successfully and outputs version information such asversion.BuildInfo, Helm is installed correctly.
Add the PuppyGraph Helm Repository
Add the PuppyGraph Helm repository to access the latest charts:
# Add PuppyGraph Helm repository
helm repo add puppygraph https://puppygraph.github.io/puppygraph-helm-chart/
# Update local Helm chart repository cache
helm repo update
Custom Deployment Guide
Deploy PuppyGraph on any Kubernetes cluster by customizing configuration values.
Deploying a specific version?
If you want to deploy a specific version of PuppyGraph, please refer to the Customize Configuration section.
Generate Default Values
A sample of the key components of the default values file is shown below:
nameOverride: ""
image:
repository: docker.io/puppygraph/puppygraph
pullPolicy: Always
# PuppyGraph image tag to deploy; leave empty to use Chart.appVersion.
# In production, pin a specific version (e.g. "1.0.0").
# Available tags: https://hub.docker.com/r/puppygraph/puppygraph/tags
tag: "latest"
imagePullSecret: ""
rootless: false
serviceAccount:
create: false
automount: true
annotations: {}
name: "default"
# additional node selectors
nodeSelectors:
# cloud.google.com/machine-family: "c3d"
# service customizations
service:
controlplane:
# Set to LoadBalancer to expose the web UI externally (may incur cloud costs).
type: ClusterIP
# Optional LoadBalancer class, for example "service.k8s.aws/nlb" for AWS Load Balancer Controller.
# Only used when type is LoadBalancer.
loadBalancerClass: ""
annotations: {}
query:
# Set to LoadBalancer to expose the query service externally (may incur cloud costs).
type: ClusterIP
# Optional LoadBalancer class, for example "service.k8s.aws/nlb" for AWS Load Balancer Controller.
# Only used when type is LoadBalancer.
loadBalancerClass: ""
annotations: {}
leader:
annotations: {}
compute:
annotations: {}
# Please refer to "System Requirements" in PuppyGraph docs. https://docs.puppygraph.com/installation/
# resource for controlplane node (web UI and registry)
controlplane:
replicas: 1
# Controlplane readiness probe tuning.
# Increase initialDelaySeconds/timeoutSeconds/failureThreshold when startup
# phases are heavy and may briefly fail health checks.
# readinessProbe:
# # Set to false to disable rendering readinessProbe for controlplane pods.
# enabled: true
# # Wait time before the first probe after container starts.
# initialDelaySeconds: 30
# # Maximum time for one probe request before it is treated as failed.
# timeoutSeconds: 3
# # Probe interval.
# periodSeconds: 10
# # Consecutive failures required to mark the pod Unready.
# failureThreshold: 5
# inject extra Kubernetes PodSpec fields into spec.template.spec
extraPodSpec: {}
# inject extra fields into the controlplane container spec
# examples: securityContext, lifecycle, livenessProbe, startupProbe
# NOTE: these fields are rendered after chart defaults and may override resources,
# readinessProbe, lifecycle, and securityContext.
extraContainerSpec: {}
# workload-targeted pod annotations rendered into spec.template.metadata.annotations
# (not on the StatefulSet metadata). Use for things that must live on the pod
# template, e.g. Datadog Agent Kubernetes autodiscovery (ad.datadoghq.com/...).
podAnnotations: {}
# override controlplane image; inherit from global image when empty
image:
repository: ""
pullPolicy: ""
tag: ""
resources:
requests:
cpu: "2"
memory: "4Gi"
limits:
memory: "4Gi"
storage:
size: "10Gi"
# resource for leader nodes
leader:
replicas: 3
# Leader readiness probe tuning.
# Increase initialDelaySeconds/timeoutSeconds/failureThreshold when startup,
# scaling, or indexing phases are heavy and may briefly fail health checks.
# readinessProbe:
# # Set to false to disable rendering readinessProbe for leader pods.
# enabled: true
# # Wait time before the first probe after container starts.
# initialDelaySeconds: 30
# # Maximum time for one probe request before it is treated as failed.
# timeoutSeconds: 3
# # Probe interval.
# periodSeconds: 10
# # Consecutive failures required to mark the pod Unready.
# failureThreshold: 5
# inject extra Kubernetes PodSpec fields into spec.template.spec
# examples: affinity, tolerations, topologySpreadConstraints, hostAliases, priorityClassName
# NOTE: these fields are rendered after chart defaults and may override securityContext,
# serviceAccountName, imagePullSecrets, and nodeSelector.
extraPodSpec: {}
# inject extra fields into the leader container spec
# examples: securityContext, lifecycle, livenessProbe, startupProbe
# NOTE: these fields are rendered after chart defaults and may override resources,
# readinessProbe, lifecycle, and securityContext.
extraContainerSpec: {}
# workload-targeted pod annotations rendered into spec.template.metadata.annotations
# (not on the StatefulSet metadata). Use for things that must live on the pod
# template, e.g. Datadog Agent Kubernetes autodiscovery (ad.datadoghq.com/...).
podAnnotations: {}
# override leader image; inherit from global image when empty
image:
repository: ""
pullPolicy: ""
tag: ""
resources:
requests:
cpu: "8"
memory: "32Gi"
ephemeral-storage: "10Gi"
limits:
memory: "32Gi"
# resource for compute nodes
compute:
replicas: 3
# Compute readiness probe tuning.
# Increase initialDelaySeconds/timeoutSeconds/failureThreshold when startup
# phases are heavy and may briefly fail health checks.
# readinessProbe:
# # Set to false to disable rendering readinessProbe for compute pods.
# enabled: true
# # Wait time before the first probe after container starts.
# initialDelaySeconds: 30
# # Maximum time for one probe request before it is treated as failed.
# timeoutSeconds: 3
# # Probe interval.
# periodSeconds: 10
# # Consecutive failures required to mark the pod Unready.
# failureThreshold: 5
# inject extra Kubernetes PodSpec fields into spec.template.spec
# examples: affinity, tolerations, topologySpreadConstraints, hostAliases, priorityClassName
# NOTE: these fields are rendered after chart defaults and may override securityContext,
# serviceAccountName, imagePullSecrets, and nodeSelector.
extraPodSpec: {}
# inject extra fields into the compute container spec
# examples: securityContext, lifecycle, livenessProbe, startupProbe
# NOTE: these fields are rendered after chart defaults and may override resources,
# readinessProbe, lifecycle, and securityContext.
extraContainerSpec: {}
# workload-targeted pod annotations rendered into spec.template.metadata.annotations
# (not on the StatefulSet metadata). Use for things that must live on the pod
# template, e.g. Datadog Agent Kubernetes autodiscovery (ad.datadoghq.com/...).
podAnnotations: {}
# override compute image; inherit from global image when empty
image:
repository: ""
pullPolicy: ""
tag: ""
resources:
requests:
cpu: "8"
memory: "64Gi"
ephemeral-storage: "10Gi"
limits:
memory: "64Gi"
# define data storage
# if provisioner is not provided, will use preset storage class by name
# other key value pairs are parameters compatible with the provisioner
storage:
name: ""
size: "200Gi"
provisioner: ""
type: ""
env:
# applied to both leader and compute pods
common:
PRIORITY_IP_CIDR: ""
# applied to controlplane pods only
controlplane: {}
# applied to leader pods only
leader:
# This is the number of data replicas for PuppyGraph metadata and local storage (default: 3).
# Set to 1 if running a single compute node (non-HA) deployment.
# DATAACCESS_DATA_REPLICATIONNUM: "3"
CLUSTER_ID: "1000"
# these files will be mounted to /etc/config/puppygraph/
config:
# Built-in schema content. Set via --set-file config.presetSchema=/path/to/puppygraph-schema.json
# This will be mounted as /etc/config/puppygraph/schema.json
presetSchema: ""
# additional files to mount: map of filename -> file content
# can be set via --set-file config.files.key\\.json=/path/to/key.json
files: {}
# If existingSecretName is set, use that Secret and skip creating a new one.
# If `create` is true and existingSecretName is empty, create a Secret from values below.
# `PUPPYGRAPH_USERNAME` and `PUPPYGRAPH_PASSWORD` are for login puppygraph.
# `AUTHENTICATION_JWT_SECRETKEY` is for JWT token signing between controlplane and other nodes.
# More secrets may be needed by schema as environment variables and we can set them here.
secrets:
existingSecretName: ""
create: true
PUPPYGRAPH_USERNAME: "puppygraph"
PUPPYGRAPH_PASSWORD: "puppygraph123"
AUTHENTICATION_JWT_SECRETKEY: ""
# SOME_OTHER_KEY:
Customize Configuration
Edit values.yaml to match your environment. Key configurations include:
-
Image Version: To deploy a specific version of PuppyGraph, update the
image.tagfield in your values.yaml.Example for specifying PuppyGraph version
To find out the latest versions, please check released PuppyGraph versions.To install a specific chart version, pass an explicit version:
-
Network CIDR: Set
env.common.PRIORITY_IP_CIDRto match your cluster node IP range. -
Storage Size: Adjust
storage.sizebased on data requirements (default: 50Gi).Storage Auto-Detection
If you don't specify
storage.provisionerandstorage.type, the chart will automatically use the default storage class configured in your Kubernetes cluster. -
Resources: Adjust CPU and memory requests/limits based on cluster capacity.
- Replicas: Set appropriate replica counts for leader and compute pods.
- Environment Variables: Configure PuppyGraph-specific settings under
env.*.
Deploy with Custom Configuration
# Set environment variables
export RELEASE_NAME=puppygraph-test
export NAMESPACE=default
# Deploy with custom configuration
helm upgrade --install $RELEASE_NAME puppygraph/puppygraph \
--namespace $NAMESPACE \
--create-namespace \
-f values.yaml
Override Specific Values
You can also override specific values without editing the file using --set flags:
Verify Deployment
# Check pod status
kubectl get pods -n $NAMESPACE
# Check persistent volumes
kubectl get pvc -n $NAMESPACE
# Check services
kubectl get svc -n $NAMESPACE
Access PuppyGraph
The chart deploys four services:
$RELEASE_NAME-controlplane-serviceexposes the Web UI (port8081) and the controlplane gRPC endpoint (port8082). Configurable viaservice.controlplane.type(defaultClusterIP).$RELEASE_NAME-query-serviceexposes the openCypher Bolt endpoint (port7687). Configurable viaservice.query.type(defaultClusterIP).$RELEASE_NAME-leader-serviceis a headless service used for inter-leader communication; it also exposes the Gremlin port (8182) for direct Gremlin access.$RELEASE_NAME-compute-serviceis a headless service used for inter-cluster communication.
To access the Web UI locally, port-forward the controlplane service:
kubectl -n $NAMESPACE port-forward --address 0.0.0.0 svc/$RELEASE_NAME-controlplane-service 8081:8081
Then open http://localhost:8081 in your browser. See PuppyGraph Web UI for a tour of the pages, and Monitoring for the health-check and metrics endpoints to wire into your monitoring system.
For Bolt access, port-forward the query service:
For Gremlin access, port-forward the leader service:
Access Method
LoadBalancer services are supported on cloud platforms (AWS EKS, GCP GKE, Azure AKS). Set service.controlplane.type=LoadBalancer (or service.query.type=LoadBalancer) in values.yaml to expose externally. For local development with Docker Desktop, use the port-forward method.
Uninstall and Clean Up
Data Loss Warning
These steps will permanently delete all PuppyGraph data.