# Cloud Topics on Kubernetes

> For the complete documentation index, see [llms.txt](https://docs.redpanda.com/llms.txt). Component-specific: [streaming-full.txt](https://docs.redpanda.com/streaming-full.txt)

---
title: Cloud Topics on Kubernetes
latest-redpanda-tag: v26.1.9
latest-console-tag: v3.7.3
latest-operator-version: v26.1.4
# EOL = End-of-Life (support lifecycle status)
page-is-nearing-eol: "false"
page-is-past-eol: "false"
page-eol-date: March 31, 2027
latest-connect-version: 4.93.0
docname: kubernetes/k-cloud-topics
page-component-name: streaming
page-version: "26.1"
page-component-version: "26.1"
page-component-title: Streaming
page-relative-src-path: kubernetes/k-cloud-topics.adoc
page-edit-url: https://github.com/redpanda-data/docs/edit/main/modules/manage/pages/kubernetes/k-cloud-topics.adoc
description: Configure Cloud Topics on Kubernetes to optimize for latency-tolerant, high-throughput workloads using object storage as the primary data tier.
page-topic-type: how-to
personas: platform_admin, streaming_developer
learning-objective-1: Configure object storage for Cloud Topics on Kubernetes
learning-objective-2: Enable and create Cloud Topics using the Redpanda Operator or Helm
learning-objective-3: Verify topic storage mode configuration
page-git-created-date: "2026-03-31"
page-git-modified-date: "2026-03-31"
support-status: supported
---

<!-- Source: https://docs.redpanda.com/streaming/current/manage/kubernetes/k-cloud-topics.md -->

Starting in v26.1, Redpanda provides [Cloud Topics](https://docs.redpanda.com/streaming/current/reference/glossary/#cloud-topic) to support multi-modal streaming workloads in the most cost-effective way possible: as a per-topic configuration running mixed latency workloads. While standard Redpanda [topics](https://docs.redpanda.com/streaming/current/develop/manage-topics/config-topics/) that use local storage or Tiered Storage are ideal for latency-sensitive workloads (for example, for audit logs or analytics), Cloud Topics are optimized for latency-tolerant, high-throughput workloads where cross-AZ networking charges are a major consideration that can become the dominant cost driver at high throughput. These workloads can include observability streams, offline analytics, AI/ML model training data feeds, or development environments that have flexible latency requirements.

Instead of replicating every byte across expensive network links, Cloud Topics leverage durable, inexpensive cloud storage (S3, ADLS, GCS, MinIO) as the primary mechanism to both replicate data and serve it to consumers. This eliminates over 90% of the cost of replicating data over network links in multi-AZ clusters.

After reading this page, you will be able to:

-   Configure object storage for Cloud Topics on Kubernetes

-   Enable and create Cloud Topics using the Redpanda Operator or Helm

-   Verify topic storage mode configuration


## [](#how-cloud-topics-work)How Cloud Topics work

With standard Redpanda topics, data is replicated across brokers using Raft consensus and stored locally on each replica. Cloud Topics change this model: data is acknowledged only after it is uploaded to object storage, making object storage the source of truth for both replication and consumption.

The end-to-end latency experienced when using Cloud Topics can range from 500 ms to as high as a few seconds with different object stores. Lower latencies may be achievable in certain environments, but Cloud Topics is optimized for throughput rather than low latency or tightly constrained tail latency. This latency profile is often acceptable for many streaming workloads, and can unlock new streaming use cases that previously were not cost effective.

With Cloud Topics, data from the client is not acknowledged until it is uploaded to object storage. This maintains durability in the face of infrastructure failures, but results in an increase in both produce latency and end-to-end latency, driven by both batching of produced data and the inherent latency of the underlying object store. You should generally expect end-to-end latencies of 1-2 seconds with public cloud stores.

### [](#storage-modes)Storage modes

Redpanda supports multiple storage modes that you can set at the cluster or topic level using the `redpanda.storage.mode` property:

| Mode | Behavior |
| --- | --- |
| unset | Follows legacy behavior. Topics inherit cluster-level remote read/write settings. |
| local | Data is stored only on local disk. No remote storage is used. |
| tiered | Data is written locally and offloaded to object storage asynchronously using Tiered Storage. |
| cloud | Data is managed primarily in object storage. Local storage acts as a cache. |

### [](#ideal-use-cases)Ideal use cases

Cloud Topics are best suited for latency-tolerant workloads, including:

-   Observability and logging streams

-   Offline analytics pipelines

-   AI/ML training data ingestion

-   Development and staging environments with flexible latency requirements


### [](#limitations)Limitations

-   Shadow links do not currently support Cloud Topics.

-   Once created, a Cloud Topic cannot be converted back to a standard Redpanda topic that uses local or Tiered Storage. Conversely, existing topics created as local or Tiered Storage topics cannot be converted to Cloud Topics.

-   Higher produce latency compared to standard topics (expect 1-2 seconds with public cloud stores).


## [](#prerequisites)Prerequisites

You must have the following:

-   **kubectl**: Ensure you have the [`kubectl`](https://kubernetes.io/docs/tasks/tools/#kubectl) command-line tool installed and configured to communicate with your cluster.

-   **Redpanda**: A [Redpanda Operator and a Redpanda resource deployed](https://docs.redpanda.com/streaming/current/deploy/redpanda/kubernetes/k-production-deployment/) in your Kubernetes cluster running Redpanda v26.1 or later.

-   **Object storage**: A configured object storage backend (Amazon S3, Google Cloud Storage, Azure Blob Storage, or an S3-compatible store such as MinIO).

-   **Enterprise license**: A valid Redpanda Enterprise license applied to the cluster.

    > 📝 **NOTE**
    >
    > This feature requires an [enterprise license](https://docs.redpanda.com/streaming/current/get-started/licensing/). To get a trial license key or extend your trial period, [generate a new trial license key](https://redpanda.com/try-enterprise). To purchase a license, contact [Redpanda Sales](https://redpanda.com/upgrade).
    >
    > If Redpanda has enterprise features enabled and it cannot find a valid license, [restrictions](https://docs.redpanda.com/streaming/current/get-started/licensing/#self-managed) apply.

    To check if you already have a license key applied to your cluster:


```bash
rpk cluster license info
```

## [](#configure-object-storage)Configure object storage

Cloud Topics use the same object storage configuration as Tiered Storage. If you have already configured object storage for Tiered Storage, you can skip this step and proceed to [Enable Cloud Topics](#enable-cloud-topics).

For detailed instructions including IAM role configuration, access key management, and encryption options, see [Configure object storage](https://docs.redpanda.com/streaming/current/manage/kubernetes/tiered-storage/k-tiered-storage/#configure-object-storage) in the Tiered Storage documentation.

The following examples show the minimum required configuration for each cloud provider.

### [](#amazon-s3)Amazon S3

#### Helm + Operator

`redpanda-cluster.yaml`

```yaml
apiVersion: cluster.redpanda.com/v1alpha2
kind: Redpanda
metadata:
  name: redpanda
spec:
  clusterSpec:
    storage:
      tiered:
        credentialsSecretRef:
          accessKey:
            name: storage-secrets
            key: access-key
          secretKey:
            name: storage-secrets
            key: secret-key
        config:
          cloud_storage_enabled: true
          cloud_storage_credentials_source: config_file (1)
          cloud_storage_region: <region>
          cloud_storage_bucket: <bucket-name>
```

| 1 | Use aws_instance_metadata instead if you are using an IAM role attached to your nodes. |
| --- | --- |

#### Helm

`cloud-storage.yaml`

```yaml
storage:
  tiered:
    credentialsSecretRef:
      accessKey:
        name: storage-secrets
        key: access-key
      secretKey:
        name: storage-secrets
        key: secret-key
    config:
      cloud_storage_enabled: true
      cloud_storage_credentials_source: config_file (1)
      cloud_storage_region: <region>
      cloud_storage_bucket: <bucket-name>
```

| 1 | Use aws_instance_metadata instead if you are using an IAM role attached to your nodes. |
| --- | --- |

For details on IAM roles, access keys, and AWS KMS encryption, see [Amazon S3](https://docs.redpanda.com/streaming/current/manage/kubernetes/tiered-storage/k-tiered-storage/#amazon-s3) in the Tiered Storage documentation.

### [](#google-cloud-storage-gcs)Google Cloud Storage (GCS)

#### Helm + Operator

`redpanda-cluster.yaml`

```yaml
apiVersion: cluster.redpanda.com/v1alpha2
kind: Redpanda
metadata:
  name: redpanda
spec:
  clusterSpec:
    storage:
      tiered:
        credentialsSecretRef:
          accessKey:
            name: storage-secrets
            key: access-key
          secretKey:
            name: storage-secrets
            key: secret-key
        config:
          cloud_storage_enabled: true
          cloud_storage_credentials_source: config_file (1)
          cloud_storage_api_endpoint: storage.googleapis.com
          cloud_storage_region: <region>
          cloud_storage_bucket: <bucket-name>
```

| 1 | Use gcp_instance_metadata instead if you are using a GCP service account attached to your nodes. |
| --- | --- |

#### Helm

`cloud-storage.yaml`

```yaml
storage:
  tiered:
    credentialsSecretRef:
      accessKey:
        name: storage-secrets
        key: access-key
      secretKey:
        name: storage-secrets
        key: secret-key
    config:
      cloud_storage_enabled: true
      cloud_storage_credentials_source: config_file (1)
      cloud_storage_api_endpoint: storage.googleapis.com
      cloud_storage_region: <region>
      cloud_storage_bucket: <bucket-name>
```

| 1 | Use gcp_instance_metadata instead if you are using a GCP service account attached to your nodes. |
| --- | --- |

For details on IAM roles, HMAC access keys, and customer-managed encryption keys, see [Google Cloud Storage](https://docs.redpanda.com/streaming/current/manage/kubernetes/tiered-storage/k-tiered-storage/#google-cloud-storage) in the Tiered Storage documentation.

### [](#azure-blob-storage)Azure Blob Storage

#### Helm + Operator

`redpanda-cluster.yaml`

```yaml
apiVersion: cluster.redpanda.com/v1alpha2
kind: Redpanda
metadata:
  name: redpanda
spec:
  clusterSpec:
    storage:
      tiered:
        credentialsSecretRef:
          accessKey:
            name: storage-secrets
            key: shared-key
        config:
          cloud_storage_enabled: true
          cloud_storage_credentials_source: config_file (1)
          cloud_storage_azure_storage_account: <account-name>
          cloud_storage_azure_container: <container-name>
```

| 1 | Use azure_aks_oidc_federation instead if you are using an Azure managed identity. When using managed identities, omit credentialsSecretRef and configure workload identity annotations on the service account. |
| --- | --- |

#### Helm

`cloud-storage.yaml`

```yaml
storage:
  tiered:
    credentialsSecretRef:
      accessKey:
        name: storage-secrets
        key: shared-key
    config:
      cloud_storage_enabled: true
      cloud_storage_credentials_source: config_file (1)
      cloud_storage_azure_storage_account: <account-name>
      cloud_storage_azure_container: <container-name>
```

| 1 | Use azure_aks_oidc_federation instead if you are using an Azure managed identity. When using managed identities, omit credentialsSecretRef and configure workload identity annotations on the service account. |
| --- | --- |

For details on managed identities and account access keys, see [Microsoft ABS/ADLS](https://docs.redpanda.com/streaming/current/manage/kubernetes/tiered-storage/k-tiered-storage/#microsoft-absadls) in the Tiered Storage documentation.

## [](#enable-cloud-topics)Enable Cloud Topics

To enable Cloud Topics, set the `cloud_topics_enabled` cluster property to `true` and set the default storage mode for all new topics to `cloud`.

### Helm + Operator

1.  Add the following to your Redpanda custom resource to enable Cloud Topics and set the default storage mode:

    `redpanda-cluster.yaml`

    ```yaml
    apiVersion: cluster.redpanda.com/v1alpha2
    kind: Redpanda
    metadata:
      name: redpanda
    spec:
      clusterSpec:
        storage:
          tiered:
            mountType: none
            credentialsSecretRef:
              accessKey:
                name: cloud-storage-creds
                key: access-key
              secretKey:
                name: cloud-storage-creds
                key: secret-key
            config:
              cloud_storage_enabled: true
              cloud_storage_region: <region>
              cloud_storage_bucket: <bucket-name>
        config:
          cluster:
            cloud_topics_enabled: true
            default_redpanda_storage_mode: cloud (1)
    ```

    | 1 | Optional. Set to cloud to make all new topics Cloud Topics by default. Omit this to create Cloud Topics individually. |
    | --- | --- |

2.  Apply the configuration:

    ```bash
    kubectl apply -f redpanda-cluster.yaml -n <namespace>
    ```

3.  The Redpanda Operator reconciles the configuration. Wait for the cluster to be ready:

    ```bash
    kubectl rollout status statefulset redpanda -n <namespace> --watch
    ```

4.  Verify that Cloud Topics are enabled:

    ```bash
    kubectl exec -n <namespace> redpanda-0 -c redpanda -- \
      rpk cluster config get cloud_topics_enabled
    ```

    Expected output: `true`

### Helm

1.  Add the following to your Helm values file:

    `cloud-topics-values.yaml`

    ```yaml
    storage:
      tiered:
        mountType: none
        credentialsSecretRef:
          accessKey:
            name: cloud-storage-creds
            key: access-key
          secretKey:
            name: cloud-storage-creds
            key: secret-key
        config:
          cloud_storage_enabled: true
          cloud_storage_region: <region>
          cloud_storage_bucket: <bucket-name>
    config:
      cluster:
        cloud_topics_enabled: true
        default_redpanda_storage_mode: cloud (1)
    ```

    | 1 | Optional. Set to cloud to make all new topics Cloud Topics by default. Omit this to create Cloud Topics individually. |
    | --- | --- |

2.  Deploy or upgrade the Helm chart:

    ```bash
    helm upgrade --install redpanda redpanda/redpanda \
      -n <namespace> --create-namespace \
      -f cloud-topics-values.yaml
    ```

3.  Wait for the cluster to be ready:

    ```bash
    kubectl rollout status statefulset redpanda -n <namespace> --watch
    ```

4.  Verify that Cloud Topics are enabled:

    ```bash
    kubectl exec -n <namespace> redpanda-0 -c redpanda -- \
      rpk cluster config get cloud_topics_enabled
    ```

    Expected output: `true`

## [](#create-a-cloud-topic)Create a Cloud Topic

You can create Cloud Topics either by setting the cluster default storage mode to `cloud`, or by configuring individual topics.

### [](#create-cloud-topics-by-default)Create Cloud Topics by default

If you set `default_redpanda_storage_mode` to `cloud` in the cluster configuration, all new topics inherit the `cloud` storage mode automatically.

Verify the cluster default:

```bash
kubectl exec -n <namespace> redpanda-0 -c redpanda -- \
  rpk cluster config get default_redpanda_storage_mode
```

Expected output: `cloud`

Any new topic created without an explicit storage mode inherits this default:

`cloud-topic.yaml`

```yaml
apiVersion: cluster.redpanda.com/v1alpha2
kind: Topic
metadata:
  name: my-cloud-topic
  namespace: <namespace>
spec:
  partitions: 3
  replicationFactor: 3
  cluster:
    clusterRef:
      name: redpanda
```

```bash
kubectl apply -f cloud-topic.yaml
```

### [](#create-individual-cloud-topics)Create individual Cloud Topics

If the cluster default storage mode is not set to `cloud`, you can create individual Cloud Topics by setting the `redpanda.storage.mode` property on the topic.

`cloud-topic.yaml`

```yaml
apiVersion: cluster.redpanda.com/v1alpha2
kind: Topic
metadata:
  name: my-cloud-topic
  namespace: <namespace>
spec:
  partitions: 3
  replicationFactor: 3
  additionalConfig:
    redpanda.storage.mode: "cloud"
  cluster:
    clusterRef:
      name: redpanda
```

```bash
kubectl apply -f cloud-topic.yaml
```

### [](#override-the-cluster-default)Override the cluster default

Topic-level storage mode settings override the cluster default. For example, if the cluster default is `cloud`, you can create a topic that uses Tiered Storage instead:

`tiered-topic.yaml`

```yaml
apiVersion: cluster.redpanda.com/v1alpha2
kind: Topic
metadata:
  name: my-tiered-topic
  namespace: <namespace>
spec:
  partitions: 3
  replicationFactor: 3
  additionalConfig:
    redpanda.storage.mode: "tiered"
  cluster:
    clusterRef:
      name: redpanda
```

## [](#verify-topic-storage-mode)Verify topic storage mode

To verify the storage mode of a topic, inspect its configuration through the Topic resource status:

```bash
kubectl get topic <topic-name> -n <namespace> -o jsonpath=\
  '{range .status.topicConfiguration[*]}{.name}={.value} ({.source}){"\n"}{end}' \
  | grep storage.mode
```

Expected output for a Cloud Topic:

storage.mode=cloud (DEFAULT\_CONFIG)

Or, if explicitly set on the topic:

storage.mode=cloud (DYNAMIC\_TOPIC\_CONFIG)

The `source` field indicates whether the value was inherited from the cluster default (`DEFAULT_CONFIG`) or explicitly set on the topic (`DYNAMIC_TOPIC_CONFIG`).

## [](#suggested-reading)Suggested reading

-   [Use Tiered Storage on Kubernetes](https://docs.redpanda.com/streaming/current/manage/kubernetes/tiered-storage/k-tiered-storage/)

-   [Manage Topics with the Redpanda Operator](https://docs.redpanda.com/streaming/current/manage/kubernetes/k-manage-topics/)