Cloud-Provider Managed Services :: Kloudfuse Docs

Cloud-Provider Managed Services

Overview

By default, Kloudfuse bundles PostgreSQL, Redis, and Kafka within the Helm chart. For production deployments — particularly those requiring compliance, high availability, or multi-zone availability — you can replace these with cloud-provider managed equivalents:

Service Bundled (default) Managed alternative
PostgreSQL 14+ (18+ for FIPS) kfuse-configdb StatefulSet AWS RDS, GCP Cloud SQL, Azure Database for PostgreSQL
Redis kfuse-redis StatefulSet (Sentinel mode) AWS ElastiCache, GCP Memorystore, Azure Cache for Redis
Kafka kafka-kraft StatefulSet (KRaft mode) AWS MSK, Confluent Cloud, Azure Event Hubs for Kafka

Common reasons to use managed services:

Managed Database (PostgreSQL)

Kloudfuse uses PostgreSQL for storing configuration, alert rules, RBAC policies, and other platform state across multiple databases (configdb, alertsdb, beffedb, logsconfigdb, and others).

The bundled deployment runs a kfuse-configdb StatefulSet inside the cluster. When switching to a managed PostgreSQL service, you point Kloudfuse at the external endpoint and disable the bundled StatefulSet.

For full details, see Cloud Provider Backend Database.

Requirements

Cloud Providers

Provider Service
AWS Amazon RDS for PostgreSQL
GCP Google Cloud SQL for PostgreSQL
Azure Azure Database for PostgreSQL

Credentials

Create a Kubernetes secret containing the database password:

export PG_CREDENTIAL="YOUR_PASSWORD"
kubectl create secret generic kfuse-pg-credentials \
  --from-literal=postgres-password="$PG_CREDENTIAL" \
  --from-literal=postgresql-password="$PG_CREDENTIAL" \
  --from-literal=postgresql-replication-password="$PG_CREDENTIAL"
unset PG_CREDENTIAL
Replace YOUR_PASSWORD with the actual password. Be aware of how your shell handles special characters. For FIPS environments, use a non-default username (not postgres) — see FIPS Installation Guide for details.

Helm Configuration

Update your custom-values.yaml with the following parameters:

installKfusePgCredentials: false  (1)

global:
  configDB:
    host: "your-rds-endpoint.rds.amazonaws.com"  (2)
    username: "<your-db-username>"  (3)
  orchestratorDB:
    host: "your-rds-endpoint.rds.amazonaws.com"  (2)
    username: "<your-db-username>"  (3)

kfuse-configdb:
  enabled: false  (4)

ingester:
  postgresql:
    enabled: false  (5)
1 Disable auto-creation of the PostgreSQL credentials secret (you created it manually above).
2 DNS endpoint of your managed PostgreSQL instance.
3 The database username. For FIPS environments this must be a non-default user — see FIPS Installation Guide for the full list of per-service username overrides.
4 Disable the bundled kfuse-configdb StatefulSet.
5 Disable the bundled orchestrator PostgreSQL.

TLS Configuration

To enable SSL/TLS for PostgreSQL connections, create a Kubernetes secret containing the CA certificate used to verify the server’s identity.

For AWS RDS, download the global CA bundle:

curl -o rds-ca-bundle.pem https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem
kubectl create secret generic pg-tls-ca-cert \
  --from-file=ca.crt=rds-ca-bundle.pem

For Google Cloud SQL or Azure Database for PostgreSQL, download the CA certificate from the cloud console and substitute it above.

Then update your custom-values.yaml to enable TLS:

global:
  configDB:
    tls:
      enabled: true
      sslmode: "verify-full"   (1)
      existingSecret: "pg-tls-ca-cert"  (2)
      certSecretKey: "ca.crt"           (3)
  orchestratorDB:
    tls:
      enabled: true
      sslmode: "verify-full"
      existingSecret: "pg-tls-ca-cert"
      certSecretKey: "ca.crt"
1 verify-full validates the server’s hostname against the CA certificate. Use require to encrypt without certificate validation.
2 Name of the Kubernetes secret containing the CA certificate (created above).
3 Key within the secret that holds the CA certificate.

Create Databases

Kloudfuse requires the following databases to be created on your managed PostgreSQL instance before deployment (as of version 3.5.3):

PostgreSQL host Databases
global.configDB.host configdb, alertsdb, beffedb, logsconfigdb, slodb, apmconfigdb, rbacdb, samldb, kfusesamldb, hydrationdb, logs_metadata, rumdb, deletiondb
global.orchestratorDB.host orchestratordb, apmservicesdb

The Helm chart automatically creates all required databases during installation via an init job. The databases are created with OWNER set to the configured username, so the application user has full privileges within each database.

Verify

After applying the Helm changes:

kubectl logs -l app=ingester --tail=50 | grep -i "postgres\|database\|connection"
kubectl logs -l app=az-service --tail=50 | grep -i "postgres\|database\|connection"

Managed Redis

Kloudfuse uses Redis for caching and session state across multiple services (ingester, query-service, logs-query-service, logs-parser, kfuse-auth, and others).

The bundled Redis deployment uses Sentinel for high availability (clients connect on port 26379). When switching to a managed Redis service, clients connect directly to the managed endpoint on port 6379 — no Sentinel is involved.

Requirements

Cloud Providers

Provider Service
AWS Amazon ElastiCache for Redis
GCP Google Cloud Memorystore for Redis
Azure Azure Cache for Redis

Credentials

If your managed Redis instance requires authentication, create a Kubernetes secret containing the Redis password:

kubectl create secret generic kfuse-redis-credentials \
  --from-literal=redis-password="YOUR_REDIS_PASSWORD"

Replace YOUR_REDIS_PASSWORD with the actual password for your managed Redis instance.

Helm Configuration

Update your custom-values.yaml with the following parameters:

global:
  redis:
    enabled: false  (1)
    external:
      enabled: true  (2)
      host: "your-redis-endpoint.cache.amazonaws.com"  (3)
      port: 6379  (4)
1 Set to false to disable the bundled Redis StatefulSet (Sentinel).
2 Enable external Redis mode.
3 The DNS endpoint of your managed Redis instance.
4 Port of the external Redis (default: 6379).

When global.redis.external.enabled is true, all Kloudfuse services connect directly to the external endpoint instead of using Sentinel.

With Authentication

If your managed Redis requires a password, add the auth configuration:

global:
  redis:
    enabled: false
    external:
      enabled: true
      host: "your-redis-endpoint.cache.amazonaws.com"
      port: 6379
      auth:
        enabled: true  (1)
        existingSecret: "kfuse-redis-credentials"  (2)
1 Enable Redis authentication.
2 Name of the Kubernetes secret containing the Redis password (key: redis-password).

With TLS (In-Transit Encryption)

If your managed Redis has in-transit encryption enabled (required for AWS ElastiCache with TransitEncryptionEnabled: true), add the TLS configuration:

global:
  redis:
    enabled: false
    external:
      enabled: true
      host: "your-redis-endpoint.cache.amazonaws.com"
      port: 6379
      auth:
        enabled: true
        existingSecret: "kfuse-redis-credentials"
      tls:
        enabled: true  (1)
        skipVerify: false  (2)
1 Enable TLS for all Redis connections. All Kloudfuse services will connect using TLS.
2 Set to true to skip certificate verification (not recommended for production).

Verify

After applying the Helm changes:

kubectl get pods | grep kfuse-redis
kubectl logs -l app=ingester --tail=50 | grep -i redis
kubectl logs -l app=kfuse-auth --tail=50 | grep -i redis

Managed Kafka

Kloudfuse uses Kafka as the central streaming backbone. Approximately 13 services connect to Kafka for ingestion, transformation, querying, and storage.

The bundled Kafka deployment uses KRaft mode (no ZooKeeper) with plaintext connections on port 9092. Managed Kafka services typically require SASL authentication and TLS encryption.

Requirements

Cloud Providers

Provider Service Auth mechanism
AWS Amazon MSK SASL/SCRAM-SHA-512 (private: port 9096, public: port 9196)
Confluent Confluent Cloud SASL/PLAIN or SASL/OAUTHBEARER
Azure Azure Event Hubs for Kafka SASL/PLAIN

Credentials

Create a Kubernetes secret containing the SASL password:

kubectl create secret generic kfuse-kafka-sasl-credentials \
  --from-literal=kafka-sasl-password="YOUR_SASL_PASSWORD" \
  --from-literal=password="YOUR_SASL_PASSWORD"

Replace YOUR_SASL_PASSWORD with the actual password for your Kafka SASL user. Both keys are required — kafka-sasl-password is used by the init containers and password is used by the Pinot stream configs.

Helm Configuration

Update your custom-values.yaml with the following parameters:

global:
  kafka:
    deployLegacy: false  (1)
    deployKraft: false  (2)
    bootstrapServers: "broker-1:9096,broker-2:9096,broker-3:9096"  (3)
    sasl:
      enabled: true  (4)
      mechanism: "SCRAM-SHA-512"  (5)
      username: "your-kafka-username"  (6)
      existingSecret: "kfuse-kafka-sasl-credentials"  (7)
      passwordKey: "kafka-sasl-password"  (8)
    tls:
      enabled: true  (9)
      skipVerify: false  (10)
1 Disable the legacy Kafka subchart.
2 Disable the KRaft Kafka subchart.
3 Comma-separated list of broker endpoints with ports. Setting bootstrapServers enables external/managed Kafka mode.
4 Enable SASL authentication.
5 The SASL mechanism. Use SCRAM-SHA-512 for AWS MSK, PLAIN for Confluent Cloud.
6 The SASL username.
7 Name of the Kubernetes secret containing the SASL password (created above).
8 Key within the secret that holds the password.
9 Enable TLS encryption (required for SASL/SCRAM on AWS MSK).
10 Set to true only for testing — not recommended for production.

AWS MSK Example

For an AWS MSK cluster with 3 brokers in us-west-2:

global:
  kafka:
    deployLegacy: false
    deployKraft: false
    bootstrapServers: "b-1.mycluster.abc123.c14.kafka.us-west-2.amazonaws.com:9096,b-2.mycluster.abc123.c14.kafka.us-west-2.amazonaws.com:9096,b-3.mycluster.abc123.c14.kafka.us-west-2.amazonaws.com:9096"
    sasl:
      enabled: true
      mechanism: "SCRAM-SHA-512"
      username: "kfuse-admin"
      existingSecret: "kfuse-kafka-sasl-credentials"
      passwordKey: "kafka-sasl-password"
    tls:
      enabled: true

To find your MSK SASL bootstrap brokers:

# Private VPC endpoint (port 9096) — use when Kloudfuse is in the same VPC or connected via peering:
aws kafka get-bootstrap-brokers --cluster-arn <YOUR_MSK_CLUSTER_ARN> \
  --query 'BootstrapBrokerStringSaslScram' --output text

# Public endpoint (port 9196) — only if public access is enabled on the MSK cluster:
aws kafka get-bootstrap-brokers --cluster-arn <YOUR_MSK_CLUSTER_ARN> \
  --query 'BootstrapBrokerStringPublicSaslScram' --output text

Topic Creation

Kloudfuse requires a set of Kafka topics for each data stream (metrics, logs, traces, events, etc.). The required topics are defined in global.kafkaTopics in the Helm chart values.

When using managed Kafka, you have two options:

  1. Pre-create topics manually — Use kafka-topics.sh or your cloud provider’s console/CLI to create the required topics before deploying Kloudfuse. This is the recommended approach when your managed Kafka restricts topic creation via ACLs.

First, create a client.properties file with your SASL/TLS credentials:

security.protocol=SASL_SSL
sasl.mechanism=SCRAM-SHA-512
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required \
     username="your-kafka-username" \
     password="your-kafka-password";

Then create topics:

kafka-topics.sh --bootstrap-server <YOUR_BOOTSTRAP_SERVERS> \
     --command-config /tmp/client.properties \
     --create --topic kf_metrics_topic --partitions 1 --replication-factor 3
  1. Automatic topic creation — The Helm chart includes a topic creator Job that attempts to create all required topics at install/upgrade time. Ensure the SASL user has the CREATE ACL permission on the cluster for this to succeed.

Verify

After applying the Helm changes:

kubectl get jobs | grep kafka-external-topic
kubectl logs job/kfuse-kafka-external-topic-creation
kubectl logs -l app=ingester --tail=50 | grep -i "kafka\|sasl\|bootstrap"
kubectl logs -l app=logs-transformer --tail=50 | grep -i "kafka\|sasl\|bootstrap"
kafka-topics.sh --bootstrap-server <YOUR_BOOTSTRAP_SERVERS> \
  --command-config /tmp/client.properties --list

Combined Configuration Example

To use managed PostgreSQL, Redis, and Kafka together (for example, in a multi-zone deployment):

installKfusePgCredentials: false

global:
  # --- Managed PostgreSQL ---
  configDB:
    host: "your-rds-endpoint.rds.amazonaws.com"
    username: "<your-db-username>"
  orchestratorDB:
    host: "your-rds-endpoint.rds.amazonaws.com"
    username: "<your-db-username>"
  # --- Managed Redis ---
  redis:
    enabled: false
    external:
      enabled: true
      host: "your-redis.cache.amazonaws.com"
      port: 6379
      auth:
        enabled: true
        existingSecret: "kfuse-redis-credentials"
  # --- Managed Kafka ---
  kafka:
    deployLegacy: false
    deployKraft: false
    bootstrapServers: "<YOUR_MSK_BOOTSTRAP_SERVERS>"  (1)
    sasl:
      enabled: true
      mechanism: "SCRAM-SHA-512"
      username: "kfuse-admin"
      existingSecret: "kfuse-kafka-sasl-credentials"
      passwordKey: "kafka-sasl-password"
    tls:
      enabled: true

kfuse-configdb:
  enabled: false

ingester:
  postgresql:
    enabled: false
1 Replace with your actual MSK bootstrap brokers.

Troubleshooting

Redis

Symptom Solution
Services fail with "connection refused" on port 26379 Verify global.redis.enabled: false and global.redis.external.enabled: true are set.
Services fail with "connection refused" on port 6379 Check that the managed Redis endpoint is reachable from the Kubernetes cluster (security groups, VPC peering, firewall rules).
"Connection timed out" on port 6379 Verify VPC peering, Transit Gateway, or PrivateLink is configured between your Kubernetes cluster network and the managed Redis VPC.
"NOAUTH Authentication required" Set global.redis.external.auth.enabled: true and global.redis.external.auth.existingSecret to the name of the secret containing the Redis password.

Kafka

Symptom Solution
"SASL authentication failed" Verify the username and password match the credentials configured on your managed Kafka cluster.
"TLS handshake failed" or "x509: certificate signed by unknown authority" Ensure TLS is enabled.
Topic creator job fails with "authorization failed" The SASL user needs the CREATE ACL permission on the Kafka cluster to create topics.
"Unable to determine Kafka cluster ID" Verify the bootstrap servers are correct and reachable.

General

If services fail to start after switching to managed services, check pod logs for connection errors:

kubectl get pods --field-selector=status.phase!=Running
kubectl describe pod <POD_NAME>
kubectl logs <POD_NAME> --tail=100

Ensure that network connectivity allows the Kubernetes cluster to reach the managed service endpoints.