Skip to content

Google Cloud Marketplace (Click to Deploy)

This guide walks you through deploying QMigrator on Google Cloud using Marketplace and command-line tools.


Marketplace Deployment Overview

Google Cloud Marketplace offers a streamlined way to launch applications on Kubernetes.
To deploy QMigrator, visit the Marketplace page and follow the prompts to install on your GKE cluster.


Manual Deployment Using Command-Line

Required Tools

Ensure your environment has the following utilities installed.
If you use Google Cloud Shell, these are pre-installed:

Set up Docker authentication for Google Container Registry:

gcloud auth configure-docker

Provision a GKE Cluster

Set environment variables for your cluster:

export CLUSTER_NAME=qmigrator-cluster
export REGION=us-central1
export PROJECT_ID=gcp-project-id

Create the cluster with the necessary add-ons:

gcloud container clusters create "$CLUSTER_NAME" \
  --location "$REGION" \
  --addons GcsFuseCsiDriver \
  --workload-pool "$PROJECT_ID.svc.id.goog"

Configure kubectl to use the new cluster:

gcloud container clusters get-credentials "$CLUSTER_NAME" --location "$REGION"

Clone the QMigrator Repository

git clone --recursive https://github.com/qmigrator/qmigrator.git
cd qmigrator

Enable Application CRD

Register the Application resource definition in your cluster:

kubectl apply -f "https://raw.githubusercontent.com/GoogleCloudPlatform/marketplace-k8s-app-tools/master/crd/app-crd.yaml"

Configure Deployment Variables

Choose an instance name and namespace for the app. In most cases, you can use the default namespace.

export APP_INSTANCE_NAME=qmigrator
export NAMESPACE=default

Tip

Get information of QMigrator from License & Project and use them to set variables

Set project-name and project-id :

export PROJECT_NAME="project-name"
export PROJECT_ID="project-id"

Set user password for postgres, redis and airflow:

export POSTGRES_PASSWORD="pg-password"
export AIRFLOW_PASSWORD="airflow-password"
export REDIS_PASSWORD="redis-password"

Create Storage bucket

Note

Create bucket and assign the readwrite permission on workload identity more info

Set bucket name:

export BUCKET="bucket-name"

Set up the image tag:

export QMIGRATOR_VERSION=4.0

Prepare Container Images

Set image references for the deployment:

export IMAGE_QUI=us-docker.pkg.dev/quadranttechnologies-public/qmig-orcl-pg/qui
export IMAGE_QAPI=us-docker.pkg.dev/quadranttechnologies-public/qmig-orcl-pg/qapi
export IMAGE_PG=us-docker.pkg.dev/quadranttechnologies-public/qmig-orcl-pg/postgres
export IMAGE_QDB=us-docker.pkg.dev/quadranttechnologies-public/qmig-orcl-pg/qpdb
export IMAGE_BUSYBOX=us-docker.pkg.dev/quadranttechnologies-public/qmig-orcl-pg/busybox
export IMAGE_KEY=us-docker.pkg.dev/quadranttechnologies-public/qmig-orcl-pg/eqalpha/keydb
export IMAGE_QASMT=us-docker.pkg.dev/quadranttechnologies-public/qmig-orcl-pg/qasmt
export IMAGE_QCONV=us-docker.pkg.dev/quadranttechnologies-public/qmig-orcl-pg/qconv
export IMAGE_QDMGR=us-docker.pkg.dev/quadranttechnologies-public/qmig-orcl-pg/qdmgr
export IMAGE_QAIR=us-docker.pkg.dev/quadranttechnologies-public/qmig-orcl-pg/qair

Generate and Apply the Manifest

Render the Helm chart to a manifest file:

helm template "$APP_INSTANCE_NAME" chart/qmigrator \
  --namespace "$NAMESPACE" \
  --set images.app.repository="$IMAGE_QUI" \
  --set images.app.tag="$QMIGRATOR_VERSION" \
  --set images.eng.repository="$IMAGE_QAPI" \
  --set images.eng.tag="$QMIGRATOR_VERSION" \
  --set images.db.repository="$IMAGE_PG" \
  --set images.db.tag="$QMIGRATOR_VERSION" \
  --set images.dbJob.repository="$IMAGE_QDB" \
  --set images.dbJob.tag="$QMIGRATOR_VERSION" \
  --set images.waitForProjectDB.repository="$IMAGE_BUSYBOX" \
  --set images.waitForProjectDB.tag="$QMIGRATOR_VERSION" \
  --set images.msg.repository="$IMAGE_KEY" \
  --set images.msg.tag="$QMIGRATOR_VERSION" \
  --set images.asses.repository="$IMAGE_QASMT" \
  --set images.asses.tag="$QMIGRATOR_VERSION" \
  --set images.convs.repository="$IMAGE_QCONV" \
  --set images.convs.tag="$QMIGRATOR_VERSION" \
  --set images.migrt.repository="$IMAGE_QDMGR" \
  --set images.migrt.tag="$QMIGRATOR_VERSION" \
  --set images.airflow.repository="$IMAGE_QAIR" \
  --set images.airflow.tag="$QMIGRATOR_VERSION" \
  --set secret.data.PROJECT_NAME="${PROJECT_NAME}" \
  --set secret.data.PROJECT_ID="${PROJECT_ID}" \
  --set secret.data.POSTGRES_PASSWORD="${POSTGRES_PASSWORD}" \
  --set airflow.secret.data.airflow_password="${AIRFLOW_PASSWORD}" \
  --set secret.data.REDIS_PASSWORD="${REDIS_PASSWORD}" \
  --set global.gcs.bucket="$BUCKET" \
  > "${APP_INSTANCE_NAME}_manifest.yaml"

Apply the manifest to your cluster:

kubectl apply -f "${APP_INSTANCE_NAME}_manifest.yaml" --namespace "$NAMESPACE"

Expose QMigrator

To make QMigrator accessible externally, follow the Gateway Controller for gateway setup.


Uninstalling QMigrator

To remove the deployment, delete the resources using your manifest:

kubectl delete -f "${APP_INSTANCE_NAME}_manifest.yaml" --namespace "$NAMESPACE"

Remove persistent volumes and claims:

for pv in $(kubectl get pvc --namespace $NAMESPACE \
  --selector app.kubernetes.io/name=$APP_INSTANCE_NAME \
  --output jsonpath='{.items[*].spec.volumeName}'); do
  kubectl delete pv/$pv --namespace $NAMESPACE
done

kubectl delete persistentvolumeclaims \
  --namespace $NAMESPACE \
  --selector app.kubernetes.io/name=$APP_INSTANCE_NAME

Delete the GKE cluster if no longer needed:

gcloud container clusters delete "$CLUSTER_NAME" --location "$REGION"