Supported versions:
Unsupported versions:
This step explains how to create the cluster in which you will run Apigee hybrid. The instructions vary depending on the platform in which you are running hybrid.
You can create a new, dedicated cluster for Apigee hybrid, as explained in this step, or you can install it in a cluster that is running other workloads.
Using a dedicated cluster is recommended. Shared cluster configuration is an advanced use case and is not discussed further in the installation steps.
Follow the steps for your selected platform:
These steps explain how to configure and create a GKE cluster in your Google Cloud project.
Apigee recommends you create a regional cluster
rather than a zonal cluster. If you are unfamiliar with the distinction between regions and zones, see
Regions and zones.
The available regions are listed in
Available regions and
zones. Just be aware that, for example, us-west1 is a valid region
name, while us-west1-a is a zone in the region.
You do not need to add this rule if you are creating a standard or public cluster.
Go to the next step only after the cluster creation completes successfully.
Minimum node pool requirements
Be sure to satisfy these minimum requirements when creating the node pools. If using the Cloud console, be sure to configure both the Node pool details and Nodes sections.
| Node pool name | Description | Minimum nodes | Minimum machine type |
|---|---|---|---|
apigee-data |
A stateful node pool used for the Cassandra database. | 1 per zone (3 per region) |
e2-standard-4 (4 vCPU, 16 GB memory) |
apigee-runtime |
A stateless node pool used by the runtime message processor. | 1 per zone (3 per region) |
e2-standard-4 (4 vCPU, 16 GB memory) |
For more details about node pool configuration see Configure dedicated node pools.
default node pool. See
Delete a node pool.kubectl. See
Set a default cluster for kubectl commands.
Configure persistent solid state disk (SSD) storage for Cassandra. We do not support using local SSDs. For more information, see Change the default storage class in the Kubernetes documentation.
kubectl get sc
For example:
kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
premium-rwo pd.csi.storage.gke.io Delete WaitForFirstConsumer true 15h
standard kubernetes.io/gce-pd Delete Immediate true 15h
standard-rwo (default) pd.csi.storage.gke.io Delete WaitForFirstConsumer true 15hstandard-rwo. Note that its
type is pd-balanced:
kubectl describe sc standard-rwo
For example:
kubectl describe sc standard-rwo
Name: standard-rwo IsDefaultClass: Yes Annotations: components.gke.io/layer=addon,storageclass.kubernetes.io/is-default-class=false Provisioner: pd.csi.storage.gke.io Parameters: type=pd-balanced AllowVolumeExpansion: True MountOptions: <none> ReclaimPolicy: Delete VolumeBindingMode: WaitForFirstConsumer Events: <none>
storageclass.yaml.apigee-sc. You can use any name you like. Also, note that
the storage type is pd-ssd:
--- kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: "apigee-sc" provisioner: kubernetes.io/gce-pd parameters: type: pd-ssd replication-type: none volumeBindingMode: WaitForFirstConsumer allowVolumeExpansion: true
kubectl apply -f storageclass.yaml
kubectl patch storageclass standard-rwo \
-p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'kubectl patch storageclass apigee-sc \
-p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'apigee-sc:
kubectl get sc
For example:
kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
apigee-sc (default) kubernetes.io/gce-pd Delete WaitForFirstConsumer true 14h
premium-rwo pd.csi.storage.gke.io Delete WaitForFirstConsumer true 15h
standard kubernetes.io/gce-pd Delete Immediate true 15h
standard-rwo pd.csi.storage.gke.io Delete WaitForFirstConsumer true 15hexport CLUSTER_NAME="YOUR_CLUSTER_NAME"export CLUSTER_LOCATION="YOUR_CLUSTER_LOCATION"
set CLUSTER_NAME="YOUR_CLUSTER_NAME"set CLUSTER_LOCATION=YOUR_CLUSTER_LOCATIONset PROJECT_ID=YOUR_PROJECT_ID
Where:
CLUSTER_NAME: The name of your cluster.
CLUSTER_LOCATION: The region in which you created your cluster.
gcloud container node-pools list \
--cluster=${CLUSTER_NAME} \
--region=${CLUSTER_LOCATION} \
--project=${PROJECT_ID}gcloud container node-pools list \
--cluster=${CLUSTER_NAME} \
--zone=${CLUSTER_LOCATION} \
--project=${PROJECT_ID}
gcloud container clusters update ${CLUSTER_NAME} \
--workload-pool=${PROJECT_ID}.svc.id.goog \
--project ${PROJECT_ID} \
--region ${CLUSTER_LOCATION}
gcloud container clusters update ${CLUSTER_NAME} \
--workload-pool=${PROJECT_ID}.svc.id.goog \
--zone ${CLUSTER_LOCATION} \
--project ${PROJECT_ID}For more information, see Enable Workload Identity.
gcloud credentials of the cluster you just created with the following
command:
gcloud container clusters get-credentials ${CLUSTER_NAME} \
--region ${CLUSTER_LOCATION} \
--project ${PROJECT_ID}
gcloud container clusters get-credentials ${CLUSTER_NAME} \
--zone ${CLUSTER_LOCATION} \
--project ${PROJECT_ID}Optional: Enable Workload Identity for each node pool using the following commands. This operation can take up to 30 minutes per node pool.
gcloud container node-pools update apigee-data \ --cluster=$CLUSTER_NAME \ --region $CLUSTER_LOCATION \ --project $PROJECT_ID \ --workload-metadata=GKE_METADATA
gcloud container node-pools update apigee-runtime \ --cluster=$CLUSTER_NAME \ --region $CLUSTER_LOCATION \ --project $PROJECT_ID \ --workload-metadata=GKE_METADATA
gcloud container node-pools update apigee-data \ --cluster=$CLUSTER_NAME \ --zone $CLUSTER_LOCATION \ --project $PROJECT_ID \ --workload-metadata=GKE_METADATA
gcloud container node-pools update apigee-runtime \ --cluster=$CLUSTER_NAME \ --zone $CLUSTER_LOCATION \ --project $PROJECT_ID \ --workload-metadata=GKE_METADATA
When you have a cluster installed and running, go to the next step.
These steps explain how to configure and create a GKE on-prem cluster for Apigee hybrid.
Go to the next step only after the cluster creation completes successfully.
Minimum node pool requirements
Be sure to satisfy these minimum requirements when creating the node pools.
| Node pool name | Description | Minimum nodes | Minimum machine type |
|---|---|---|---|
apigee-data |
A stateful node pool used for the Cassandra database. | 1 per zone (3 per region) |
e2-standard-4 (4 vCPU, 16 GB memory) |
apigee-runtime |
A stateless node pool used by the runtime message processor. | 1 per zone (3 per region) |
e2-standard-4 (4 vCPU, 16 GB memory) |
For more details about node pool configuration see Configure dedicated node pools.
default node pool. See
Delete a node pool.Configure persistent solid state disk (SSD) storage for Cassandra. We do not support using local SSDs. For more information, see Change the default storage class in the Kubernetes documentation.
kubectl get sc
For example:
kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
premium-rwo pd.csi.storage.gke.io Delete WaitForFirstConsumer true 15h
standard kubernetes.io/gce-pd Delete Immediate true 15h
standard-rwo (default) pd.csi.storage.gke.io Delete WaitForFirstConsumer true 15hstandard-rwo. Note that its
type is pd-balanced:
kubectl describe sc standard-rwo
For example:
kubectl describe sc standard-rwo
Name: standard-rwo IsDefaultClass: Yes Annotations: components.gke.io/layer=addon,storageclass.kubernetes.io/is-default-class=false Provisioner: pd.csi.storage.gke.io Parameters: type=pd-balanced AllowVolumeExpansion: True MountOptions: <none> ReclaimPolicy: Delete VolumeBindingMode: WaitForFirstConsumer Events: <none>
storageclass.yaml.apigee-sc. You can use any name you like. Also, note that
the storage type is pd-ssd:
--- kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: "apigee-sc" provisioner: kubernetes.io/gce-pd parameters: type: pd-ssd replication-type: none volumeBindingMode: WaitForFirstConsumer allowVolumeExpansion: true
kubectl apply -f storageclass.yaml
kubectl patch storageclass standard-rwo \
-p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'kubectl patch storageclass apigee-sc \
-p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'apigee-sc:
kubectl get sc
For example:
kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
apigee-sc (default) kubernetes.io/gce-pd Delete WaitForFirstConsumer true 14h
premium-rwo pd.csi.storage.gke.io Delete WaitForFirstConsumer true 15h
standard kubernetes.io/gce-pd Delete Immediate true 15h
standard-rwo pd.csi.storage.gke.io Delete WaitForFirstConsumer true 15hWhen you have a cluster installed and running, go to the next step.
These steps explain how to configure and create a cluster for Apigee hybrid on Anthos on bare metal. Anthos on bare metal lets you run Kubernetes clusters directly on your own machine resources.
The minimum configurations for your cluster are:
| Configuration | Stateful node pool | Stateless node pool |
|---|---|---|
| Purpose | A stateful node pool used for the Cassandra database. | A stateless node pool used by the runtime message processor. |
| Label name | apigee-data | apigee-runtime |
| Number of nodes | 1 per zone (3 per region) | 1 per zone (3 per region) |
| CPU | 4 | 4 |
| RAM | 15 | 15 |
| Storage | dynamic | Managed with the ApigeeDeployment CRD |
| Minimum disk IOPS | 2000 IOPS with SAN or directly attached storage. NFS is not recommended even if it can support the required IOPS. | 2000 IOPS with SAN or directly attached storage. NFS is not recommended even if it can support the required IOPS. |
For more details on minimum cluster configuration see: Minimum cluster configurations
When you have a cluster installed and running, go to the next step.
These steps explain how to configure and create a cluster for Apigee hybrid on AKS.
The minimum configurations for your cluster are:
| Configuration | Stateful node pool | Stateless node pool |
|---|---|---|
| Purpose | A stateful node pool used for the Cassandra database. | A stateless node pool used by the runtime message processor. |
| Label name | apigee-data | apigee-runtime |
| Number of nodes | 1 per zone (3 per region) | 1 per zone (3 per region) |
| CPU | 4 | 4 |
| RAM | 15 | 15 |
| Storage | dynamic | Managed with the ApigeeDeployment CRD |
| Minimum disk IOPS | 2000 IOPS with SAN or directly attached storage. NFS is not recommended even if it can support the required IOPS. | 2000 IOPS with SAN or directly attached storage. NFS is not recommended even if it can support the required IOPS. |
For more details on minimum cluster configuration see: Minimum cluster configurations
When you have a cluster installed and running, go to the next step.
These steps explain how to configure and create a cluster for Apigee hybrid on EKS.
The minimum configurations for your cluster are:
| Configuration | Stateful node pool | Stateless node pool |
|---|---|---|
| Purpose | A stateful node pool used for the Cassandra database. | A stateless node pool used by the runtime message processor. |
| Label name | apigee-data | apigee-runtime |
| Number of nodes | 1 per zone (3 per region) | 1 per zone (3 per region) |
| CPU | 4 | 4 |
| RAM | 15 | 15 |
| Storage | dynamic | Managed with the ApigeeDeployment CRD |
| Minimum disk IOPS | 2000 IOPS with SAN or directly attached storage. NFS is not recommended even if it can support the required IOPS. | 2000 IOPS with SAN or directly attached storage. NFS is not recommended even if it can support the required IOPS. |
For more details on minimum cluster configuration see: Minimum cluster configurations
When you have a cluster installed and running, go to the next step.
These steps explain how to configure and create a cluster for Apigee hybrid on GKE on AWS.
The minimum configurations for your cluster are:
| Configuration | Stateful node pool | Stateless node pool |
|---|---|---|
| Purpose | A stateful node pool used for the Cassandra database. | A stateless node pool used by the runtime message processor. |
| Label name | apigee-data | apigee-runtime |
| Number of nodes | 1 per zone (3 per region) | 1 per zone (3 per region) |
| CPU | 4 | 4 |
| RAM | 15 | 15 |
| Storage | dynamic | Managed with the ApigeeDeployment CRD |
| Minimum disk IOPS | 2000 IOPS with SAN or directly attached storage. NFS is not recommended even if it can support the required IOPS. | 2000 IOPS with SAN or directly attached storage. NFS is not recommended even if it can support the required IOPS. |
For more details on minimum cluster configuration see: Minimum cluster configurations
When you have a cluster installed and running, go to the next step.
These steps explain how to configure and create a cluster for Apigee hybrid on OpenShift.
As part of the OpenShift install, install and configure the oc
CLI tool. See Getting
started with the OpenShift CLI in the OpenShift documentation.
The minimum configurations for your cluster are:
| Configuration | Stateful node pool | Stateless node pool |
|---|---|---|
| Purpose | A stateful node pool used for the Cassandra database. | A stateless node pool used by the runtime message processor. |
| Label name | apigee-data | apigee-runtime |
| Number of nodes | 1 per zone (3 per region) | 1 per zone (3 per region) |
| CPU | 4 | 4 |
| RAM | 15 | 15 |
| Storage | dynamic | Managed with the ApigeeDeployment CRD |
| Minimum disk IOPS | 2000 IOPS with SAN or directly attached storage. NFS is not recommended even if it can support the required IOPS. | 2000 IOPS with SAN or directly attached storage. NFS is not recommended even if it can support the required IOPS. |
For more details on minimum cluster configuration see: Minimum cluster configurations
When you have installed a cluster, go to the next step.
1 (NEXT) Step 2: Install cert-manager 3 4 5 6 7 8 9 10
Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License. For details, see the Google Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.
Last updated 2026-06-09 UTC.