Configure Quiver
Quiver is a core component of GoodData.CN responsible for caching analytical data and managing durable storage for both cached datasets and raw exports.
You configure Quiver exclusively through Helm values during deployment; Helm generates all internal configuration files automatically. This article walks you through the basic process.
Prerequisites
Before configuring Quiver, ensure you have:
- A running Kubernetes cluster (EKS, AKS, or similar)
- Access to your object storage service (AWS S3 or Azure Blob Storage)
- IAM role, IRSA, or Managed Identity configured for authentication
- A prepared bucket or container for durable storage and raw exports
Quick Start
The following example shows a minimal Helm configuration for Quiver using AWS S3 as durable storage:
quiver:
durableStorageType: "S3"
s3DurableStorage:
s3Bucket: "my-quiver-bucket"
s3BucketPrefix: "quiver/"
s3Region: "us-east-1"
authType: "aws_default" # for IRSA or instance profile
For Azure Blob Storage:
quiver:
durableStorageType: "ABS"
absDurableStorage:
absAccountName: "myaccount"
absContainer: "my-quiver-container"
absContainerPrefix: "quiver/"
authType: "azure_default" # for Managed Identity
After applying the Helm chart, Helm will generate the corresponding internal configuration for Quiver.
Select Storage Type
Quiver supports the following durable storage backends:
| Storage Type | Value for durableStorageType |
Description |
|---|---|---|
| AWS S3 | S3 |
Stores cached and durable data in an S3 bucket. |
| Azure Blob Storage | ABS |
Stores cached and durable data in a Blob Storage container. |
| Filesystem | FS |
Stores durable data on a shared volume (for test or single-node deployments). |
Only one durable storage type is active at a time. Setting durableStorageType automatically determines which configuration block (s3DurableStorage, absDurableStorage, or fsDurableStorage) is used. Changing this value requires an ETCD wipe to refresh configuration.
AWS S3
When using S3 storage, configure the following Helm values:
quiver:
durableStorageType: "S3"
s3DurableStorage:
s3Bucket: "my-quiver-bucket"
s3BucketPrefix: "quiver/"
s3Region: "us-east-1"
authType: "aws_default" # or "aws_tokens"
s3AccessKey: "" # optional when using aws_default
s3SecretKey: "" # optional when using aws_default
Authentication Methods
-
aws_defaultUses the default AWS credentials chain (ideal for IRSA on EKS or EC2 instance profiles).
-
aws_tokensUses static access keys defined through
s3AccessKeyands3SecretKey.
You can also define them as environment variables:export AWS_ACCESS_KEY_ID=... export AWS_SECRET_ACCESS_KEY=...
An example using static credentials:
quiver:
durableStorageType: "S3"
s3DurableStorage:
s3Bucket: "gooddata-quiver"
s3BucketPrefix: "data/"
s3Region: "us-east-1"
authType: "aws_tokens"
s3AccessKey: "AKIA..."
s3SecretKey: "..."
Azure Blob Storage
When using Azure Blob Storage:
quiver:
durableStorageType: "ABS"
absDurableStorage:
absAccountName: "myaccount"
absContainer: "quiver-container"
absContainerPrefix: "data/"
authType: "azure_default" # or "azure_tokens"
absAccountKey: "" # required only for azure_tokens
absClientId: "" # optional for user-assigned managed identity
Authentication Methods
-
azure_defaultUses Kubernetes-provided Managed Identity (recommended).
-
azure_tokensUses static account keys. Store them in a Kubernetes secret and reference them via environment variables.
Prefixes
Quiver uses prefixes (for example s3BucketPrefix or absContainerPrefix) to organize data within your storage backend.
- Prefixes separate datasets stored in the same bucket or container.
- A missing prefix can lead to collisions between different environments.
- You can use subprefixes such as
"prod/quiver/","dev/raw/", or"exports/"to isolate workloads.
Best practice is to use a dedicated bucket or container for each environment (for example dev or prod) and consistent prefixes for Quiver and the export-controller.
Integration with Export Controller
Quiver and the export-controller share the same durable storage for raw exports.
In Helm values, this is configured under the exportController section:
exportController:
storageType: "s3"
exportS3Storage:
s3Bucket: "my-quiver-bucket"
s3BucketPrefix: "raw-exports/"
Ensure that:
- The export-controller and Quiver use the same bucket and prefix for raw exports.
- The bucket/container exists before deployment (neither component creates it automatically).
- The prefix defined under
rawExportsFs.prefix(default:raw-exports) matches the one inexportController.
If the prefixes do not match, exports may appear as successful but will not be accessible through Quiver.
Operational Parameters
You can fine-tune Quiver’s behavior with these optional Helm values:
| Parameter | Description | Default |
|---|---|---|
cacheCountLimit |
Maximum number of caches per shard. | 5000 |
limitFlightCount |
Total number of cached datasets (flights). | 50000 |
concurrentPutRequests |
Maximum number of concurrent uploads. | Auto (based on CPU) |
putThrottlingKeyLimit |
Limits concurrent uploads per organization. | None |
putQueueSize |
Queue size for uploads waiting for slots. | 256 |
serverCriticalRssGrace |
Grace period for high memory usage (seconds). | 15 |
serverMallocTrimInterval |
Frequency (seconds) for releasing unused memory. | 5 |
etcdRegistrationTtl |
TTL for Quiver’s ETCD registration. | 30 seconds (default) |
If you increase concurrency (for example concurrentPutRequests), also increase the memory resources for Quiver pods.
Common Deployment Patterns
S3 with IRSA (Recommended on EKS):
quiver:
durableStorageType: "S3"
s3DurableStorage:
s3Bucket: "gooddata-prod"
s3BucketPrefix: "quiver/"
s3Region: "us-east-1"
authType: "aws_default"
Azure Blob Storage with Managed Identity (recommended on AKS):
quiver:
durableStorageType: "ABS"
absDurableStorage:
absAccountName: "gdstorage"
absContainer: "gooddata-quiver"
absContainerPrefix: "quiver/"
authType: "azure_default"
Local Filesystem (for testing only):
quiver:
durableStorageType: "FS"
fsDurableStorage:
storageClassName: "nfs-rwx"
Secrets Management
Avoid storing credentials directly in Helm values. Instead, use:
- IRSA (AWS) or Managed Identity (Azure) for production
- Kubernetes Secrets referenced in environment variables for testing
Example (AWS keys in Kubernetes Secret):
env:
- name: AWS_ACCESS_KEY_ID
valueFrom:
secretKeyRef:
name: aws-credentials
key: accessKey
- name: AWS_SECRET_ACCESS_KEY
valueFrom:
secretKeyRef:
name: aws-credentials
key: secretKey
Troubleshooting
| Symptom | Possible Cause | Resolution |
|---|---|---|
| Quiver pods crashloop with ETCD errors | Changed durableStorageType without clearing ETCD |
Clean ETCD state and redeploy. |
| Raw exports missing | Mismatch between Quiver and export-controller prefixes | Align rawExportsFs.prefix and exportS3Storage.s3BucketPrefix. |
| Writes fail with “no matching storage class” | Missing or incorrect prefix configuration | Verify s3BucketPrefix or absContainerPrefix. |