Installing and managing Apigee hybrid with Helm charts Stay organized with collections Save and categorize content based on your preferences.
Preview — Installing Apigee hybrid with Helm charts
This feature is subject to the "Pre-GA Offerings Terms" in the General Service Terms section of theService Specific Terms. Pre-GA features are available "as is" and might have limited support. For more information, see thelaunch stage descriptions.
Note: This preview document is applicable for Apigee hybrid v1.10.x.This document guides you through the step-by-step process of installing Apigee hybrid v1.10 using Helm charts.
Version
Apigee hybrid Helm charts is for use with Apigee hybrid v1.10.x. See Apigee hybrid release history for the list of hybrid releases.
Prerequisites
- Apigee hybrid 1.10.5
- Helm v3.10+
- Access to the Apigee hybrid Helm chart repository at:
oci://us-docker.pkg.dev/apigee-release/apigee-hybrid-helm-charts - gcloud CLI
- A Google Cloud project for your Apigee hybrid installation. See Creating and managing projects
- A Kubernetes cluster for your Apigee hybrid installation. See:
Scope
- This release supports only Apigee hybrid version 1.10.5.
- This release supports:
- New Apigee hybrid installations.
- Existing Apigee hybrid installations upgraded to version 1.10.5 and migrated to Helm management using theApigee hybrid Helm migration tool.
- This release supports:
apigeectl, see Apigee hybrid Helm migration tool.Supported Kubernetes platforms and versions
| Platform | Versions |
|---|---|
| GKE | 1.24, 1.25, 1.26 |
| AKS | 1.24, 1.25, 1.26 |
| EKS | 1.24, 1.25, 1.26 |
| OpenShift | 4.11, 4.12 |
Limitations
- Helm charts do not fully support CRDs; therefore, we will be using the
kubectl-kcommand for installing and upgrading them. We aim to follow community and Google best practices around Kubernetes management. CRD deployments through Helm have not yet reached a community state where we see broad support, or requests for such a model. Therefore, management of Apigee CRDs should be done usingkubectlas mentioned in this document. - In
apigeectl, we have used files throughoutoverrides.yamlfor service accounts and certs; however, Helm does not support referencing files outside of the chart directory. Pick one of the following options for service account and cert files:- Place copies of relevant files within each chart directory
- Create symbolic links within each chart directory for each file, or a folder. Helm will follow symbolic links out of the chart directory, but will output a warning like the following:
apigee-operator/gsa -> ../gsa - Use Kubernetes secrets. For example, for service accounts:
kubectl create secret genericSECRET_NAME \ --from-file="client_secret.json=CLOUD_IAM_FILE_NAME.json" \ -n apigee
- Replace the following:
- SECRET_NAME with the name of the Kubernetes secret you created.
- CLOUD_IAM_FILE_NAME.json with the name of the downloaded JSON file.
Supported Kubernetes Platform and versions
For a list of supported platforms, see the v1.10 column in the Apigee hybrid supported platforms table.
Permissions required
This table lists the resources and permissions required for Kubernetes and Apigee.
To filter this table, do one or more of the following: select a category, type a search term, or click a column heading to sort.
| Category | Resource | Resource type | Kubernetes RBAC permissions |
|---|---|---|---|
| Datastore | apigeedatastores.apigee.cloud.google.com | Apigee | create delete patch update |
| Datastore | certificates.cert-manager.io | Kubernetes | create delete patch update |
| Datastore | cronjobs.batch | Kubernetes | create delete patch update |
| Datastore | jobs.batch | Kubernetes | create delete patch update |
| Datastore | secrets | Kubernetes | create delete patch update |
| Env | apigeeenvironments.apigee.cloud.google.com | Apigee | create delete patch update |
| Env | secrets | Kubernetes | create delete patch update |
| Env | serviceaccounts | Kubernetes | create delete patch update |
| Ingress manager | certificates.cert-manager.io | Kubernetes | create delete patch update |
| Ingress manager | configmaps | Kubernetes | create delete patch update |
| Ingress manager | deployments.apps | Kubernetes | create get delete patch update |
| Ingress manager | horizontalpodautoscalers.autoscaling | Kubernetes | create delete patch update |
| Ingress manager | issuers.cert-manager.io | Kubernetes | create delete patch update |
| Ingress manager | serviceaccounts | Kubernetes | create delete patch update |
| Ingress manager | services | Kubernetes | create delete patch update |
| Operator | apigeedatastores.apigee.cloud.google.com | Apigee | create delete get list patch update watch |
| Operator | apigeedatastores.apigee.cloud.google.com/finalizers | Apigee | get patch update |
| Operator | apigeedatastores.apigee.cloud.google.com/status | Apigee | get patch update |
| Operator | apigeedeployments.apigee.cloud.google.com | Apigee | create delete get list patch update watch |
| Operator | apigeedeployments.apigee.cloud.google.com/finalizers | Apigee | get patch update |
| Operator | apigeedeployments.apigee.cloud.google.com/status | Apigee | get patch update |
| Operator | apigeeenvironments.apigee.cloud.google.com | Apigee | create delete get list patch update watch |
| Operator | apigeeenvironments.apigee.cloud.google.com/finalizers | Apigee | get patch update |
| Operator | apigeeenvironments.apigee.cloud.google.com/status | Apigee | get patch update |
| Operator | apigeeissues.apigee.cloud.google.com | Apigee | create delete get list watch |
| Operator | apigeeorganizations.apigee.cloud.google.com | Apigee | create delete get list patch update watch |
| Operator | apigeeorganizations.apigee.cloud.google.com/finalizers | Apigee | get patch update |
| Operator | apigeeorganizations.apigee.cloud.google.com/status | Apigee | get patch update |
| Operator | apigeeredis.apigee.cloud.google.com | Apigee | create delete get list patch update watch |
| Operator | apigeeredis.apigee.cloud.google.com/finalizers | Apigee | get patch update |
| Operator | apigeeredis.apigee.cloud.google.com/status | Apigee | get patch update |
| Operator | apigeerouteconfigs.apigee.cloud.google.com | Apigee | get list |
| Operator | apigeeroutes.apigee.cloud.google.com | Apigee | create delete get list patch update watch |
| Operator | apigeeroutes.apigee.cloud.google.com/finalizers | Apigee | get patch update |
| Operator | apigeeroutes.apigee.cloud.google.com/status | Apigee | get patch update |
| Operator | apigeetelemetries.apigee.cloud.google.com | Apigee | create delete get list patch update watch |
| Operator | apigeetelemetries.apigee.cloud.google.com/finalizers | Apigee | get patch update |
| Operator | apigeetelemetries.apigee.cloud.google.com/status | Apigee | get list patch update |
| Operator | cassandradatareplications.apigee.cloud.google.com | Apigee | get list patch update watch |
| Operator | cassandradatareplications.apigee.cloud.google.com/finalizers | Apigee | get patch update |
| Operator | cassandradatareplications.apigee.cloud.google.com/status | Apigee | get patch update |
| Operator | *.networking.x.k8s.io | Kubernetes | get list watch |
| Operator | apiservices.apiregistration.k8s.io | Kubernetes | create delete get list patch update watch |
| Operator | certificates.cert-manager.io | Kubernetes | create delete get list patch update watch |
| Operator | certificates.cert-manager.io/finalizers | Kubernetes | create delete get list patch update watch |
| Operator | certificatesigningrequests.certificates.k8s.io | Kubernetes | create delete get update watch |
| Operator | certificatesigningrequests.certificates.k8s.io/approval | Kubernetes | create delete get update watch |
| Operator | certificatesigningrequests.certificates.k8s.io/status | Kubernetes | create delete get update watch |
| Operator | clusterissuers.cert-manager.io | Kubernetes | create get watch |
| Operator | clusterrolebindings.rbac.authorization.k8s.io | Kubernetes | create delete get list patch update watch |
| Operator | clusterroles.rbac.authorization.k8s.io | Kubernetes | create delete get list patch update watch |
| Operator | configmaps | Kubernetes | create delete get list patch update watch |
| Operator | configmaps/status | Kubernetes | get patch update |
| Operator | cronjobs.batch | Kubernetes | create delete get list patch update watch |
| Operator | customresourcedefinitions.apiextensions.k8s.io | Kubernetes | get list watch |
| Operator | daemonsets.apps | Kubernetes | create delete get list patch update watch |
| Operator | deployments.apps | Kubernetes | get list watch |
| Operator | deployments.extensions | Kubernetes | get list watch |
| Operator | destinationrules.networking.istio.io | Kubernetes | create delete get list patch update watch |
| Operator | endpoints | Kubernetes | get list watch |
| Operator | endpointslices.discovery.k8s.io | Kubernetes | get list watch |
| Operator | events | Kubernetes | create delete get list patch update watch |
| Operator | gateways.networking.istio.io | Kubernetes | create delete get list patch update watch |
| Operator | horizontalpodautoscalers.autoscaling | Kubernetes | create delete get list patch update watch |
| Operator | ingressclasses.networking.k8s.io | Kubernetes | get list watch |
| Operator | ingresses.networking.k8s.io/status | Kubernetes | all verbs |
| Operator | issuers.cert-manager.io | Kubernetes | create delete get list patch update watch |
| Operator | jobs.batch | Kubernetes | create delete get list patch update watch |
| Operator | leases.coordination.k8s.io | Kubernetes | create get list update |
| Operator | namespaces | Kubernetes | create get list watch |
| Operator | nodes | Kubernetes | get list watch |
| Operator | peerauthentications.security.istio.io | Kubernetes | create delete get list patch update watch |
| Operator | persistentvolumeclaims | Kubernetes | create delete get list patch update watch |
| Operator | persistentvolumes | Kubernetes | get list watch |
| Operator | poddisruptionbudgets.policy | Kubernetes | create delete get list patch update watch |
| Operator | pods | Kubernetes | create delete get list patch update watch |
| Operator | pods/exec | Kubernetes | create |
| Operator | replicasets.apps | Kubernetes | create delete get list patch update watch |
| Operator | replicasets.extensions | Kubernetes | get list watch |
| Operator | resourcequotas | Kubernetes | create delete get list patch update watch |
| Operator | rolebindings.rbac.authorization.k8s.io | Kubernetes | create delete get list patch update watch |
| Operator | roles.rbac.authorization.k8s.io | Kubernetes | create delete get list patch update watch |
| Operator | secrets | Kubernetes | batch create delete get list patch update watch |
| Operator | securitycontextconstraints.security.openshift.io | Kubernetes | create get list |
| Operator | serviceaccounts | Kubernetes | create delete get list patch update watch |
| Operator | services | Kubernetes | batch create delete get list patch update watch |
| Operator | signers.certificates.k8s.io | Kubernetes | approve |
| Operator | statefulsets.apps | Kubernetes | create delete get list patch update watch |
| Operator | subjectaccessreviews.authorization.k8s.io | Kubernetes | create get list |
| Operator | tokenreviews.authentication.k8s.io | Kubernetes | create |
| Operator | virtualservices.networking.istio.io | Kubernetes | create delete get list patch update watch |
| Org | apigeeorganizations.apigee.cloud.google.com | Apigee | create delete patch update |
| Org | secrets | Kubernetes | create delete patch update |
| Org | serviceaccounts | Kubernetes | create delete patch update |
| Redis | apigeeredis.apigee.cloud.google.com | Apigee | create delete patch update |
| Redis | secrets | Kubernetes | create delete patch update |
| Telemetry | apigeetelemetry.apigee.cloud.google.com | Apigee | create delete patch update |
| Telemetry | secrets | Kubernetes | create delete patch update |
| Telemetry | serviceaccounts | Kubernetes | create delete patch update |
| Virtual host | apigeerouteconfigs.apigee.cloud.google.com | Apigee | create delete patch update |
| Virtual host | secrets | Kubernetes | create delete patch update |
See also:
Prepare for installation
Apigee hybrid charts are hosted inGoogle Artifact Registry:
oci://us-docker.pkg.dev/apigee-release/apigee-hybrid-helm-charts
Pull Apigee Helm charts
Using thepull command, copy all of the Apigee hybrid Helm charts to your local storage with the following command:
exportCHART_REPO=oci://us-docker.pkg.dev/apigee-release/apigee-hybrid-helm-chartsexportCHART_VERSION=1.10.5helm pull$CHART_REPO/apigee-operator --version$CHART_VERSION --untarhelm pull$CHART_REPO/apigee-datastore --version$CHART_VERSION --untarhelm pull$CHART_REPO/apigee-env --version$CHART_VERSION --untarhelm pull$CHART_REPO/apigee-ingress-manager --version$CHART_VERSION --untarhelm pull$CHART_REPO/apigee-org --version$CHART_VERSION --untarhelm pull$CHART_REPO/apigee-redis --version$CHART_VERSION --untarhelm pull$CHART_REPO/apigee-telemetry --version$CHART_VERSION --untarhelm pull$CHART_REPO/apigee-virtualhost --version$CHART_VERSION --untar
Install Apigee hybrid
Installation sequence overview
Installation of components is done from left to right in sequence as shown in the following figure. Components that are stacked vertically in the figure can be installed together and in any order. Once you have installed any component, you can update that component individually and at any point; for example, replica, memory, CPU, and so on.
Prepare to install Apigee hybrid with Helm charts
- Create the namespace that will be used for
apigeeresources. This should match the namespace field in theoverrides.yamlfile. If this is not present inoverrides.yaml, then the default isapigee.Check if the namespace already exists:
kubectl get namespace apigee
If the namespace exists, your output includes:
NAME STATUS AGE apigee Active 1d
If the namespace does not already exist, create it:
kubectl create namespace apigee
- Create the
apigee-systemnamespace used by the Apigee operator resources.Check if the namespace already exists:
kubectl get namespace apigee-system
If the namespace does not already exist, create it:
kubectl create namespace apigee-system
Create the service accounts and assign the appropriate IAM roles to them. Apigee hybrid uses the following service accounts:
Service account IAM roles apigee-cassandraStorage Object Admin apigee-loggerLogs Writer apigee-martApigee Connect Agent apigee-metricsMonitoring Metric Writer apigee-runtimeNo role required apigee-synchronizerApigee Synchronizer Manager apigee-udcaApigee Analytics Agent apigee-watcherApigee Runtime Agent Apigee provides a tool,
create-service-account, in theapigee-operator/etc/toolsdirectory:APIGEE_HELM_CHARTS_HOME/└── apigee-operator/ └── etc/ └── tools/ └── create-service-account
This tool creates the service accounts, assigns the IAM roles to each account, and downloads the certificate files in JSON format for each account.
- Create the directory where you want to download the service account cert files. You will specify this in the following command in the place ofSERVICE_ACCOUNTS_PATH.
- You can create all the service accounts with a single command with the following options:
APIGEE_HELM_CHARTS_HOME/apigee-operator/etc/tools/create-service-account --env prod --dirSERVICE_ACCOUNTS_PATH
- List the names of your service accounts for your overrides file:
ls service-accounts
my_project-apigee-cassandra.json my_project-apigee-runtime.jsonmy_project-apigee-logger.json my_project-apigee-synchronizer.jsonmy_project-apigee-mart.json my_project-apigee-udca.jsonmy_project-apigee-metrics.json my_project-apigee-watcher.json
For more information see:
- Before installing, look at the
overrides.yamlfile to verify the settings:Important: Apigee hybrid v1.10.5 has been updated with a critical hotfix release. If you wish, you can apply the required configuration settings for the hotfix directly in the configuration overrides file described in this step. If you add the upgrade configurations now, you do not have to perform any further hotfix upgrades later. The configuration settings for the hotfix (v1.10.5-hotfix.1) are listed in theupgrade guide. See also the release note for the hotfix release:instanceID:UNIQUE_ID_TO_IDENTIFY_THIS_CLUSTERnamespace:apigee#requiredforHelmchartsinstallation#Bydefault,loggerandmetricsareenabledandrequiresbelowdetails#GoogleCloudprojectandclustergcp:projectID:PROJECT_IDregion:REGIONk8sCluster:name:CLUSTER_NAMEregion:REGIONorg:ORG_NAMEenvs:-name:"ENV_NAME"serviceAccountPaths:runtime:"PATH_TO_RUNTIME_SVC_ACCOUNT"synchronizer:"PATH_TO_SYNCHRONIZER_SVC_ACCOUNT"udca:"PATH_TO_UDCA_SVC_ACCOUNT"ingressGateways:-name:GATEWAY_NAME#maximum17characters,eg:"ingress-1".SeeKnownissue243167389.replicaCountMin:1replicaCountMax:2svcType:LoadBalancervirtualhosts:-name:ENV_GROUP_NAMEselector:app:apigee-ingressgatewayingress_name:GATEWAY_NAMEsslSecret:SECRET_NAMEmart:serviceAccountPath:"PATH_TO_MART_SVC_ACCOUNT"logger:enabled:TRUE_FALSE#lowercasewithoutquotes,eg:trueserviceAccountPath:"PATH_TO_LOGGER_SVC_ACCOUNT"metrics:enabled:TRUE_FALSE#lowercasewithoutquotes,eg:trueserviceAccountPath:"PATH_TO_METRICS_SVC_ACCOUNT"udca:serviceAccountPath:"PATH_TO_UDCA_SVC_ACCOUNT"connectAgent:serviceAccountPath:"PATH_TO_MART_SVC_ACCOUNT"watcher:serviceAccountPath:"PATH_TO_WATCHER_SVC_ACCOUNT"
This is the same overrides config you will use for this Helm installation. For more settings see theConfiguration property reference.
For more examples of overrides files, seeStep 6: Configure the hybrid runtime.
- Enable synchronizer access. This is a prerequisite for installing Apigee hybrid.
Check to see if synchronizer access is already enabled with the following commands:
export TOKEN=$(gcloud auth print-access-token)
curl -X POST -H "Authorization: Bearer$TOKEN" \ -H "Content-Type:application/json" \ "https://apigee.googleapis.com/v1/organizations/ORG_NAME:getSyncAuthorization" \ -d ''
Your output should look something like the following:
{ "identities":[ "serviceAccount:SYNCHRONIZER_SERVICE_ACCOUNT_ID" ], "etag":"BwWJgyS8I4w="}If the output does not include the service account ID, enable synchronizer access. Your account must have the Apigee Organization Admin IAM role (
roles/apigee.admin) to perform this task.curl -X POST -H "Authorization: Bearer$TOKEN" \ -H "Content-Type:application/json" \ "https://apigee.googleapis.com/v1/organizations/ORG_NAME:setSyncAuthorization" \ -d '{"identities":["'"serviceAccount:SYNCHRONIZER_SERVICE_ACCOUNT_ID"'"]}'See Step 7: Enable Synchronizer access in the Apigee hybrid installation documentation for more detailed information.
- Install Cert Manager with the following command:
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.11.1/cert-manager.yaml
Install the Apigee CRDs:
Note: From this step onwards, all commands should be run under the chart repo root.Note: This is the only supported method for installing Apigee CRDs. Do not usekubectl applywithout-k, do not omit--server-side.Note: This step requires elevated cluster permissions.Use the
kubectldry-run feature by running the following command:kubectl apply -k apigee-operator/etc/crds/default/ --server-side --force-conflicts --validate=false --dry-run=server
After validating with the dry-run command, run the following command:
kubectl apply -k apigee-operator/etc/crds/default/ --server-side --force-conflicts --validate=false
- Validate the installation with the
kubectl get crdscommand:kubectl get crds | grep apigee
Your output should look something like the following:
apigeedatastores.apigee.cloud.google.com 2023-10-09T14:48:30Zapigeedeployments.apigee.cloud.google.com 2023-10-09T14:48:30Zapigeeenvironments.apigee.cloud.google.com 2023-10-09T14:48:31Zapigeeissues.apigee.cloud.google.com 2023-10-09T14:48:31Zapigeeorganizations.apigee.cloud.google.com 2023-10-09T14:48:32Zapigeeredis.apigee.cloud.google.com 2023-10-09T14:48:33Zapigeerouteconfigs.apigee.cloud.google.com 2023-10-09T14:48:33Zapigeeroutes.apigee.cloud.google.com 2023-10-09T14:48:33Zapigeetelemetries.apigee.cloud.google.com 2023-10-09T14:48:34Zcassandradatareplications.apigee.cloud.google.com 2023-10-09T14:48:35Z
Check the existing labels on the cluster nodes. By default, Apigee schedules data pods on nodes with the label
cloud.google.com/gke-nodepool=apigee-dataand runtime pods are scheduled on nodes with the labelcloud.google.com/gke-nodepool=apigee-runtime. You can customize your node pool labels in theoverrides.yamlfile.For more information, see Configuring dedicated node pools.
Install the Apigee hybrid Helm charts
Note: Before executing any of the Helm upgrade/install commands, use the Helm dry-run feature by adding--dry-run at the end of the command. Seehelm -h to list supported commands, options, and usage.ImportantMigration tool:If you migrated your cluster to Helm management with theApigee hybrid Helm migration tool, you have existing resources in your migrated cluster. To avoid accidentally deleting resources if thehelm upgrade command fails, do not use the‑‑atomic flag.For example, in the first step, the command will be:
helm upgrade operator apigee-operator/ \ --install \ --namespace apigee-system \ -f overrides.yaml
Install Apigee Operator/Controller:
Note: This step requires elevated cluster permissions. Runhelm -horhelm install -hfor details Important:Omit thehelm upgrade operator apigee-operator/ \ --install \ --namespace apigee-system \ --atomic \ -f overrides.yaml
‑‑atomicflag formigrated clusters.Verify Apigee Operator installation:
helm ls -n apigee-system
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSIONoperator apigee-system 3 2023-06-26 00:42:44.492009 -0800 PST deployed apigee-operator-1.10.5 1.10.5
Verify it is up and running by checking its availability:
kubectl -n apigee-system get deploy apigee-controller-manager
NAME READY UP-TO-DATE AVAILABLE AGEapigee-controller-manager 1/1 1 1 7d20h
Install Apigee datastore:
Important:Omit thehelm upgrade datastore apigee-datastore/ \ --install \ --namespace apigee \ --atomic \ -f overrides.yaml
‑‑atomicflag formigrated clusters.Verify
apigeedatastoreis up and running by checking its state:kubectl -n apigee get apigeedatastore default
NAME STATE AGEdefault running 2d
Install Apigee telemetry:
Important:Omit thehelm upgrade telemetry apigee-telemetry/ \ --install \ --namespace apigee \ --atomic \ -f overrides.yaml
‑‑atomicflag formigrated clusters.Verify it is up and running by checking its state:
kubectl -n apigee get apigeetelemetry apigee-telemetry
NAME STATE AGEapigee-telemetry running 2d
Install Apigee Redis:
Important:Omit thehelm upgrade redis apigee-redis/ \ --install \ --namespace apigee \ --atomic \ -f overrides.yaml
‑‑atomicflag formigrated clusters.Verify it is up and running by checking its state:
kubectl -n apigee get apigeeredis default
NAME STATE AGEdefault running 2d
Install Apigee ingress manager:
Important:Omit thehelm upgrade ingress-manager apigee-ingress-manager/ \ --install \ --namespace apigee \ --atomic \ -f overrides.yaml
‑‑atomicflag formigrated clusters.Verify it is up and running by checking its availability:
kubectl -n apigee get deployment apigee-ingressgateway-manager
NAME READY UP-TO-DATE AVAILABLE AGEapigee-ingressgateway-manager 2/2 2 2 2d
Install Apigee organization:
Important:Omit thehelm upgradeORG_NAME apigee-org/ \ --install \ --namespace apigee \ --atomic \ -f overrides.yaml
‑‑atomicflag formigrated clusters.Verify it is up and running by checking the state of the respective org:
kubectl -n apigee get apigeeorg
NAME STATE AGEapigee-org1-xxxxx running 2d
Install the environment.
You must install one environment at a time. Specify the environment with
--set env=ENV_NAME: Important:Omit thehelm upgrade apigee-env-ENV_NAME apigee-env/ \ --install \ --namespace apigee \ --atomic \ --set env=ENV_NAME \ -f overrides.yaml
‑‑atomicflag formigrated clusters.Verify it is up and running by checking the state of the respective env:
kubectl -n apigee get apigeeenv
NAME STATE AGE GATEWAYTYPEapigee-org1-dev-xxx running 2d
- Create the TLS certificates. You are required to provide TLS certificates for the runtime ingress gateway in your Apigee hybrid configuration.
Create the certificates. In a production environment, you will need to use signed certificates. You can use either a certificate and key pair or a Kubernetes secret.
For demonstration and testing installation, the runtime gateway can accept self-signed credentials. In the following example,openssl is used to generate the self-signed credentials:
openssl req -nodes -new -x509 \ -keyoutPATH_TO_CERTS_DIRECTORY/keystore_ENV_GROUP_NAME.key \ -outPATH_TO_CERTS_DIRECTORY/keystore_ENV_GROUP_NAME.pem \ -subj '/CN='YOUR_DOMAIN'' -days 3650
For more information, seeStep 5: Create TLS certificates.
Create the Kubernetes secret to reference the certs:
kubectl create secret genericNAME \ --from-file="cert=PATH_TO_CRT_FILE" \ --from-file="key=PATH_TO_KEY_FILE" \ -n apigee
Install virtual host.
You must install one environment group (virtualhost) at a time. Specify the environment group with
--set envgroup=ENV_GROUP_NAME: Important:Omit the# repeat the following command for each env group mentioned in the overrides.yaml filehelm upgrade apigee-virtualhost-ENV_GROUP_NAME apigee-virtualhost/ \ --install \ --namespace apigee \ --atomic \ --set envgroup=ENV_GROUP_NAME \ -f overrides.yaml
‑‑atomicflag formigrated clusters.Note:ENV_GROUP_NAME must be unique within theapigeenamespace. For example, if you have aprodenv and envgroup, you should set this name toprod-envgroup. The later env group name should still beprod.This creates ApigeeRouteConfig (ARC) which internally creates ApigeeRoute (AR) once the Apigee watcher pulls env group related details from the control plane. Therefore, check that the corresponding AR's state is running:
kubectl -n apigee get arc
NAME STATE AGEapigee-org1-dev-egroup 2d
kubectl -n apigee get ar
NAME STATE AGEapigee-org1-dev-egroup-xxxxxx running 2d
Additional use cases for Helm charts with Apigee hybrid
Cassandra backup and restore
- To enable backup:
Update the Cassandra backup details in the
overrides.yamlfile: Note: When using a Cloud Storage bucket, a Google Cloud service accountcassandra:backup:enabled:trueserviceAccountPath:PATH_TO_GSA_FILEdbStorageBucket:BUCKET_LINKschedule:"45 23 * * 6"
apigee-cassandra-backneeds to be created and have proper roles and/or permissions to write to the bucket specified indbStorageBucket.Run the Helm upgrade on
apigee-datastorechart: Important:Omit thehelm upgrade datastore apigee-datastore/ \ --namespace apigee \ --atomic \ -f overrides.yaml
‑‑atomicflag formigrated clusters.
- Similarly, to enable restore:
Update the Cassandra restore details in the
overrides.yamlfile:cassandra:restore:enabled:truesnapshotTimestamp:TIMESTAMPserviceAccountPath:PATH_TO_GSA_FILEcloudProvider:"CSI"
Run the Helm upgrade on
apigee-datastorechart: Important:Omit thehelm upgrade datastore apigee-datastore/ \ --namespace apigee \ --atomic \ -f overrides.yaml
‑‑atomicflag formigrated clusters.
SeeCassandra backup overview for more details on Cassandra backup and restore.
Multi-region expansion
Multi-region setup with Helm charts requires the same prerequisites as the currentapigeectl procedures. For details, see Prerequisites for multi-region deployments.
The procedure to configure hybrid for multi-region is the same as the existing procedure up through the process of configuring the multi-region seed host and setting up the Kubernetes cluster and context.
Configure the first region
Use the following steps to configure the first region and prepare for configuring the second region:
- Follow the steps in Configure Apigee hybrid for multi-region to Configure the multi-region seed host on your platform.
For the first region created, get the pods in the apigee namespace:
kubectl get pods -o wide -n apigee
- Identify the multi-region seed host address for Cassandra in this region, for example
10.0.0.11. Prepare the
overrides.yamlfile for the second region and add in the seed host IP address as follows:cassandra:multiRegionSeedHost:"SEED_HOST_IP_ADDRESS"datacenter:"DATACENTER_NAME"rack:"RACK_NAME"clusterName:CLUSTER_NAMEhostNetwork:false
Replace the following:
- SEED_HOST_IP_ADDRESS with the seed host IP address, for example
10.0.0.11. - DATACENTER_NAME with the datacenter name, for example
dc-2. - RACK_NAME with the rack name, for example
ra-1. - CLUSTER_NAME with the name of your Apigee cluster. By default the value is
apigeecluster. If you use a different cluster name, you must specify a value forcassandra.clusterName. This value must be the same in all regions.
- SEED_HOST_IP_ADDRESS with the seed host IP address, for example
Configure the second region
To set up the new region:
Install
cert-managerin region 2:kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.11.1/cert-manager.yaml
- Copy your certificate from the existing cluster to the new cluster. The new CA root is used by Cassandra and other hybrid components for mTLS. Therefore, it is essential to have consistent certificates across the cluster.
Set the context to the original namespace:
kubectl config use-contextORIGINAL_CLUSTER_NAME
Export the current namespace configuration to a file:
kubectl get namespace apigee -o yaml > apigee-namespace.yaml
Export the
apigee-casecret to a file:kubectl -n cert-manager get secret apigee-ca -o yaml > apigee-ca.yaml
Set the context to the new region's cluster name:
kubectl config use-contextNEW_CLUSTER_NAME
Import the namespace configuration to the new cluster. Be sure to update the namespace in the file if you're using a different namespace in the new region:
kubectl apply -f apigee-namespace.yaml
Import the secret to the new cluster:
kubectl -n cert-manager apply -f apigee-ca.yaml
Now use Helm charts to install Apigee hybrid in the new region with the following Helm Chart commands (as done in region 1):
Note: You can use the same CRDs for consistency by using the same folder where you have the charts downloaded, you can also keep your overrides file unique between region 1 and 2 by naming your overrides something unique such asoverrides2.yaml, etc. Important:Omit thehelm upgrade operator apigee-operator \ --install \ --namespace apigee-system \ --atomic -f overrides-DATACENTER_NAME.yaml
helm upgrade datastore apigee-datastore \ --install \ --namespace apigee \ --atomic \ -f overrides-DATACENTER_NAME.yamlhelm upgrade telemetry apigee-telemetry \ --install \ --namespace apigee \ --atomic \ -f overrides-DATACENTER_NAME.yamlhelm upgrade redis apigee-redis \ --install \ --namespace apigee \ --atomic \ -f overrides-DATACENTER_NAME.yamlhelm upgrade ingress-manager apigee-ingress-manager \ --install \ --namespace apigee \ --atomic \ -f overrides-DATACENTER_NAME.yamlhelm upgradeORG_NAME apigee-org \ --install \ --namespace apigee \ --atomic \ -f overrides-DATACENTER_NAME.yaml# repeat the below command for each env mentioned on the overrideshelm upgrade apigee-env-ENV_NAME apigee-env/ \ --install \ --namespace apigee \ --atomic \ --set env=ENV_NAME \ -f overrides-DATACENTER_NAME.yaml# repeat the below command for each env group mentioned on the overrideshelm upgrade apigee-virtualhost-ENV_GROUP_NAME apigee-virtualhost/ \ --install \ --namespace apigee \ --atomic \ --set envgroup=ENV_GROUP_NAME \ -f overrides-DATACENTER_NAME.yaml‑‑atomicflag formigrated clusters.- Once all the components are installed, set up Cassandra on all the pods in the new data centers. For instructions, see Configure Apigee hybrid for multi-region, select your platform, scroll toSet up the new region, and then locate step 5.
- Once the data replication is complete and verified, update the seed hosts:
- Remove
multiRegionSeedHost: 10.0.0.11fromoverrides-DATACENTER_NAME.yaml.The
multiRegionSeedHostentry is no longer needed after data replication is established, and pod IPs are expected to change over time. Reapply the change to update the apigee datastore CR:
Important:Omit thehelm upgrade datastore apigee-datastore/ \ --install \ --namespace apigee \ --atomic \ -f overrides-DATACENTER_NAME.yaml
‑‑atomicflag formigrated clusters.
- Remove
Hosting images privately
Instead of relying on the public Google Cloud repository, you may optionally want to host the images privately. Instead of overriding each component, you can add hub details on the overrides:
hub:PRIVATE_REPO
For example, if the following hub is provided, it will automatically resolve the image path:
hub:private-docker-host.com
as:
## an example of internal component vs 3rd partycontainers:- name: apigee-udca image: private-docker-host.com/apigee-udca:1.10.5 imagePullPolicy: IfNotPresentcontainers:- name: apigee-ingressgateway image: private-docker-host.com/apigee-asm-ingress:1.17.2-asm.8-distroless imagePullPolicy: IfNotPresent
Click to expand a list of Apigee images
apigee:gcr.io/apigee-release/hybrid/apigee-mart-server:1.10.3gcr.io/apigee-release/hybrid/apigee-synchronizer:1.10.3gcr.io/apigee-release/hybrid/apigee-runtime:1.10.3gcr.io/apigee-release/hybrid/apigee-hybrid-cassandra-client:1.10.3gcr.io/apigee-release/hybrid/apigee-hybrid-cassandra:1.10.3gcr.io/apigee-release/hybrid/apigee-cassandra-backup-utility:1.10.3gcr.io/apigee-release/hybrid/apigee-udca:1.10.3gcr.io/apigee-release/hybrid/apigee-connect-agent:1.10.3gcr.io/apigee-release/hybrid/apigee-watcher:1.10.3gcr.io/apigee-release/hybrid/apigee-operators:1.10.3gcr.io/apigee-release/hybrid/apigee-redis:1.10.3gcr.io/apigee-release/hybrid/apigee-mint-task-scheduler:1.10.3thirdparty:gcr.io/apigee-release/hybrid/apigee-stackdriver-logging-agent:1.9.12-2gcr.io/apigee-release/hybrid/apigee-prom-prometheus:v2.45.0gcr.io/apigee-release/hybrid/apigee-stackdriver-prometheus-sidecar:0.9.0gcr.io/apigee-release/hybrid/apigee-kube-rbac-proxy:v0.14.2gcr.io/apigee-release/hybrid/apigee-envoy:v1.27.0gcr.io/apigee-release/hybrid/apigee-prometheus-adapter:v0.11.0gcr.io/apigee-release/hybrid/apigee-asm-ingress:1.17.2-asm.8-distrolessgcr.io/apigee-release/hybrid/apigee-asm-istiod:1.17.2-asm.8-distrolessgcr.io/apigee-release/hybrid/apigee-fluent-bit:2.1.8
To display a list of the Apigee images hosted in the Google Cloud repository on the command line:
./apigee-operator/etc/tools/apigee-pull-push.sh --list
Tolerations
To use the Taints and Tolerations feature of Kubernetes, you must define thetolerations override property for each Apigee hybrid component. The following components support defining tolerations:
aoapigeeIngressGatewaycassandracassandraSchemaSetupcassandraSchemaValidationcassandraUserSetupconnectAgentistiodloggermartmetricsmintTaskSchedulerredisruntimesynchronizerudcaWatcher
See Configuration property reference for more information about these components.
For example, to apply the tolerations to the Apigee operator deployment:
ao:tolerations:-key:"key1"operator:"Equal"value:"value1"effect:"NoExecute"tolerationSeconds:3600
To apply the tolerations to the Cassandra StatefulSet:
cassandra:tolerations:-key:"key1"operator:"Equal"value:"value1"effect:"NoExecute"tolerationSeconds:3600
Uninstall Apigee hybrid with Helm
To uninstall a specific update orrelease, you can use thehelm [uninstall/delete]RELEASE-NAME -nNAMESPACE command.
Use the following steps to completely uninstall Apigee Hybrid from the cluster:
- Delete the virtualhosts. Run this command for each virtualhost:
helm -napigee deleteVIRTUALHOST_RELEASE-NAME
- Delete the environments. Run this command for each env:
helm -napigee deleteENV_RELEASE-NAME
- delete the Apigee org:
helm -napigee deleteORG_RELEASE-NAME
- delete telemetry:
helm -napigee deleteTELEMETRY_RELEASE-NAME
- Delete redis:
helm -napigee deleteREDIS_RELEASE-NAME
- Delete the ingress manager:
helm -napigee deleteINGRESS_MANAGER_RELEASE-NAME
- Delete the datastore:
Tip: If the state of the apigeeds/default remainshelm -napigee deleteDATASTORE_RELEASE-NAME
deletingbut never ends, check the pods to see if a cleanup job failed. - Delete operator.
- Make sure all the CRs are deleted before:
kubectl -n apigee get apigeeds, apigeetelemetry, apigeeorg, apigreeenv, arc, apigeeredis
- Delete the Apigee Operator:
helm -n apigee-system deleteOPERATOR_RELEASE-NAME
- Make sure all the CRs are deleted before:
- Delete the Apigee hybrid CRDs:
kubectl delete -k apigee-operator/etc/crds/default/
Except as otherwise noted, the content of this page is licensed under theCreative Commons Attribution 4.0 License, and code samples are licensed under theApache 2.0 License. For details, see theGoogle Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.
Last updated 2026-02-19 UTC.