Deploy on Google Kubernetes Engine
Use this path when you run migrations on Google Cloud Platform (GCP). You receive the same Migration Assistant engine, workflow model, and console experience as every other path. Google Kubernetes Engine (GKE) is the recommended production path on GCP because a Terraform module prepares the GCP platform pieces that a real migration needs: the cluster, networking, snapshot storage, and workload identity.
GKE makes the migration easier to deploy, easier to secure, and easier to operate without changing how migrations run.
GKE deployment components
The Terraform module prepares GCP infrastructure around the workflow engine, including:
- A GKE Standard cluster deployed into a new or existing virtual private cloud (VPC).
- Private nodes with Cloud NAT for outbound access.
- Workload Identity so migration pods can authenticate to GCP services without long-lived keys.
- A Cloud Storage bucket for snapshots, with the node service account granted access to it.
- Secondary IP ranges for GKE pods and services, and configurable control-plane access.
Prerequisites
Before you begin, make sure you have the following:
- A GCP project with billing enabled.
- Terraform 1.6 or later, or OpenTofu 1.6 or later.
- The gcloud CLI, authenticated with
gcloud auth application-default login. kubectland Helm 3 installed.- The required GCP APIs enabled:
gcloud services enable container.googleapis.com storage.googleapis.com
Step 1: Provision the cluster with Terraform
The Terraform module is published in the opensearch-migrations repository under deployment/terraform/gcp. Clone the release tag you want to deploy.
The most common variables are described in the following table. Check the module’s variables.tf for the complete list.
| Variable | Default | Purpose |
|---|---|---|
project | (required) | GCP project ID |
region | us-central1 | GCP region |
node_machine_type | e2-standard-4 | Machine type for the cluster nodes |
create_vpc | true | Create a new VPC, or reuse an existing one (false) |
master_authorized_cidrs | ["0.0.0.0/0"] | Ranges authorized to reach the control plane |
Optional: Keep migration traffic private
If your migration must not traverse the public internet, configure private networking before you apply, because the connectivity options are set through the same Terraform variables used in this step. You can make the source, target, snapshot, and control-plane legs private independently. Go to Private networking on GKE, add the connectivity variables you need, and then return here to apply.
Apply the configuration
Provision the cluster by planning and applying the module:
terraform apply \
-var="project=<your-gcp-project>" \
-var="region=<your-gcp-region>"
The module provisions a GKE Standard cluster.
Step 2: Get cluster credentials
The cluster name is generated by Terraform. Fetch credentials with the following command:
gcloud container clusters get-credentials $(terraform output -raw cluster_name) \
--region $(terraform output -raw cluster_location) \
--project <your-gcp-project>
Step 3: Install the Migration Assistant Helm chart
Install the chart using the GKE values file, which sets cloudProvider: gcp and wires the GCP-specific snapshot storage and identity settings:
helm install migration-assistant \
charts/aggregates/migrationAssistantWithArgo \
--values charts/aggregates/migrationAssistantWithArgo/valuesGke.yaml \
--set gcp.project=<your-gcp-project>
Step 4: Verify the deployment
Verify that the platform pods are running:
kubectl get pods -n ma
You should see the Migration Console, the Argo workflow controller, and the Argo server in Running state.
Step 5: Access the Migration Console
Access the Migration Console:
kubectl exec -it migration-console-0 -n ma -- /bin/bash
After you access the console, the migration flow is the same as any other deployment: verify the version, load the sample configuration, run a pilot migration, validate it, and then run the full migration.
GCP helpers the deployment created for you
The GKE path provisions a Cloud Storage bucket and configures identity so you do not have to build them manually.
Snapshot bucket
Terraform creates a Cloud Storage bucket for migration snapshots and generates a unique name for it. The Helm chart exposes the bucket to workflows through the migrations-default-gcs-config config map. By default, the migration workflow creates a fresh snapshot in this bucket as its first step.
If you already have a snapshot in the bucket, you can configure the workflow to reuse it instead of creating a new one. For the workflow configuration, see Using an existing snapshot. For best performance, keep the bucket in the same region as the GKE cluster; cross-region reads work but are slower and incur egress charges.
Workload Identity
The module binds the Kubernetes service accounts that run migrations (the Migration Console and the Argo workflow executor) to a GCP service account through Workload Identity. This means the console and the migration jobs can reach Cloud Storage and other GCP services without you distributing long-lived credentials. This is one of the main reasons GKE is the recommended GCP production path.
Authentication on GKE
Migration Assistant supports the following authentication methods on GKE.
Basic authentication
Basic authentication works the same way as every other path: create Kubernetes secrets and reference them in authConfig.basic.secretName.
Workload Identity for GCP services
For access to GCP services such as Cloud Storage, the GKE path uses Workload Identity to assign a GCP identity to the Migration Console pod and the Argo workflow executor pods. The Terraform module configures these bindings for you.
Removal
Once you no longer need Migration Assistant for rollback, replay, or comparison, remove it. Do not remove it immediately after cutover. For the readiness checklist, see Removing migration infrastructure.
To remove Migration Assistant from GKE, uninstall the Helm release and then destroy the Terraform-managed infrastructure:
helm uninstall migration-assistant -n ma
kubectl -n ma delete pvc --all
terraform destroy \
-var="project=<your-gcp-project>" \
-var="region=<your-gcp-region>"
Next steps
- Open the Migration Console and run
console --version. - Load the sample workflow with
workflow configure sample --load. - Run
console clusters connection-check. - Continue with Using the Workflow CLI.