Skip to main content

Quickstart: Migrate from Dapr OSS to Catalyst

In this quickstart, you run a Go application on Dapr open source in a local Kubernetes cluster, then move it to Catalyst with the Catalyst Kubernetes operator. You will learn how to:

  • Check a Dapr OSS namespace for Catalyst compatibility.
  • Install the Catalyst Kubernetes operator and migrate the namespace with one command.
  • Confirm that service invocation, pub/sub, state, jobs, actors and workflows keep working on Catalyst.
  • Cut over and remove Dapr OSS from the cluster.

The application has two roles built from one image. checkout saves an order to state, invokes inventory, publishes the order, schedules a job and starts a workflow. inventory serves the invocation and hosts the StockActor actor.

The same workload before and after the migrationkind clusterCatalystdapr-oss-demoDapr OSS sidecarscatalyst-democheckout, inventoryDapr serversmigration-quickstartRedismigrateremote
The same workload before and after the migrationThe migration copies dapr-oss-demo to catalyst-demo. The copy runs without a Dapr sidecar and reaches the Dapr servers in Catalyst, which uses the same Redis.

1. Prerequisites​

After the migration the Dapr server runs in Catalyst, and Catalyst cannot resolve an address that exists only inside your cluster. See Reachable backing services.

2. Log in to Catalyst​

diagrid login
diagrid whoami

diagrid whoami prints your user and organization.

3. Clone the quickstart​

git clone https://github.com/diagridio/catalyst-quickstarts.git
cd catalyst-quickstarts/migration

4. Run the application on Dapr OSS​

Create the cluster and install Dapr:

kind create cluster --name migration-quickstart
dapr init -k --wait

Apply the Dapr resources with your Redis address and password. The state store has actorStateStore set, so it also holds actor and workflow state.

export REDIS_HOST="<host>:<port>"
export REDIS_PASSWORD="<password>"
envsubst < k8s/components.yaml.tmpl | kubectl apply -f -

Build the image, load it into kind and deploy the two apps:

docker build -t migration-quickstart:local app
kind load docker-image migration-quickstart:local --name migration-quickstart
kubectl apply -f k8s/apps.yaml
kubectl -n dapr-oss-demo rollout status deploy/checkout deploy/inventory

In a second terminal, forward the checkout port:

kubectl -n dapr-oss-demo port-forward deploy/checkout 8080:8080

Back in the first terminal, send one order through the app and read the logs:

curl -s localhost:8080/start
kubectl -n dapr-oss-demo logs deploy/checkout -c checkout
kubectl -n dapr-oss-demo logs deploy/inventory -c inventory

curl returns {"started":"order-<timestamp>"}. The checkout log shows one line per building block:

STATE saved order-1792587324
INVOKE inventory/reserve -> {"reserved":2,"sku":"widget"}
PUBSUB published order-1792587324
PUBSUB received on /orders: {"data":"{\"id\":\"order-1792587324\",...
JOB scheduled restock
ACTIVITY charged order-1792587324 qty=2
WORKFLOW started 5e0090fd-9371-4bbe-9ee3-733b1b3337eb

JOB fired restock follows a few seconds later. The inventory log shows INVOKE reserve widget qty=2 and ACTOR StockActor/widget reserved=2.

5. Check compatibility​

diagrid k8s-operator compatibility dapr-oss-demo

The report lists the five resources that migrate, and none needs changes. It says that the managed workflow store stays off, because statestore already holds workflow state, and it asks for cert-manager, which you install in the next step.

6. Install the operator​

The operator's webhook needs cert-manager to issue its certificate. Install cert-manager, then the operator:

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/latest/download/cert-manager.yaml
kubectl wait --for=condition=Available -n cert-manager deploy --all --timeout=120s
diagrid k8s-operator install --wait

The CLI finds the Dapr CRDs that Dapr OSS installed and leaves them alone.

7. Migrate​

Copy the namespace to catalyst-demo and register it in a new Catalyst project:

diagrid k8s-operator migrate dapr-oss-demo \
--new-namespace catalyst-demo \
--project migration-quickstart

Let migrate create the project. Do not create migration-quickstart beforehand.

If your organization has more than one region, migrate asks for one. Run diagrid region list and add --region <region> to the command.

8. Verify on Catalyst​

Scale down the original Dapr OSS apps so only the migrated apps consume from Redis, then wait for the migrated apps:

kubectl -n dapr-oss-demo scale deploy --all --replicas=0
kubectl -n catalyst-demo rollout status deploy/checkout deploy/inventory

checkout can restart once or twice while Catalyst accepts the state store. It runs once the store is ready.

In the second terminal, stop the port-forward from step 4 with Ctrl+C and forward the migrated checkout instead:

kubectl -n catalyst-demo port-forward deploy/checkout 8080:8080

Back in the first terminal, send another order and read the logs:

curl -s localhost:8080/start
kubectl -n catalyst-demo logs deploy/checkout -c checkout
kubectl -n catalyst-demo logs deploy/inventory -c inventory

You see the same lines as in step 4. Every call now goes to the Dapr server in Catalyst.

Open the migration-quickstart project in the Catalyst web console. The Apps page lists checkout and inventory as ready, and the Workflows page shows the order workflow run.

The Apps page of the Catalyst web console listing checkout and inventory as ready

9. Cut over​

Remove Dapr OSS from the cluster:

dapr uninstall -k

Send another order as in step 8. The migrated apps no longer depend on Dapr OSS, so you see the same lines.

10. Clean up​

Stop the port-forward with Ctrl+C, then delete the cluster and the project:

kind delete cluster --name migration-quickstart
diagrid project delete migration-quickstart
note

While the operator runs, deleting the catalyst-demo namespace also deletes the migration-quickstart project. Delete the namespace only when you want the project gone.

Summary​

In this quickstart, you:

  • Ran a Dapr OSS application that uses service invocation, pub/sub, state, jobs, actors and workflows.
  • Checked the namespace with diagrid k8s-operator compatibility.
  • Migrated it to Catalyst with diagrid k8s-operator migrate, without changing the application code.
  • Removed Dapr OSS and confirmed the application kept working.

Next steps​