- Overview
- Requirements
- Installation
- Post-installation
- Migration and upgrade
- Upgrading Automation Suite on EKS/AKS
- Step 1: Moving the Identity organization data from standalone to Automation Suite
- Step 2: Restoring the standalone product database
- Step 3: Backing up the platform database in Automation Suite
- Step 4: Merging organizations in Automation Suite
- Step 5: Updating the migrated product connection strings
- Step 6: Migrating standalone Orchestrator
- Step 7: Migrating standalone Insights
- Step 8: Migrating standalone Test Manager
- Step 9: Deleting the default tenant
- Performing a single tenant migration
- Migrating from Automation Suite on Linux to Automation Suite on EKS/AKS
- Monitoring and alerting
- Cluster administration
- Product-specific configuration
- Troubleshooting
- The backup setup does not work due to a failure to connect to Azure Government
- Pods in the uipath namespace stuck when enabling custom node taints
- Unable to launch Automation Hub and Apps with proxy setup
- Pods cannot communicate with FQDN in a proxy environment
- Test Automation SQL connection string is ignored
- EKS backup failure due to Velero version
- Velero backup fails with FailedValidation error
- Accessing FQDN returns RBAC access denied error
- Manual ArgoCD NetworkPolicy mitigation (GHSA-47m3-95c7-g2g8)
You can migrate from Automation Suite deployed on a Linux machine to Automation Suite on EKS/AKS. To do that, you must move your data from one Automation Suite flavor to another using uipathctl.
One of the advantages of this migration process is that you can attempt to perform it multiple times with no impact on your existing cluster.
This migration option allows you to move from Automation Suite on Linux to a new installation of Automation Suite on EKS/AKS.
The following migration scenarios are not supported:
- Migrating from Automation Suite on Linux to an existing installation of Automation Suite on EKS/AKS is currently not supported.
- Migrating an Automation Suite on EKS/AKS cluster to another Automation Suite on EKS/AKS cluster is currently not supported.
Requirements
To migrate from Automation Suite on Linux to Automation Suite on EKS/AKS, you must meet the following requirements:
- You must establish connectivity between the two environments.
- You must have an external objectstore configured in your source cluster. If you use in-cluster storage, refer to Migrating in-cluster objectstore to external objectstore.
- You must grant the source cluster read/write permissions to the destination object store. When persistent volumes (PVs) are copied, the source cluster writes their data to the destination object store, and then the destination cluster pulls the data from the object store and creates the corresponding PVs.
- The version of your Automation Suite on Linux must be 2022.10 or newer.
- Offline-only requirements: You must hydrate the target cluster.
Process overview
| # | Migration step |
|---|---|
| 1. | Mandatory . Download uipathctl . For download instructions, see uipathctl . |
| 2. | Mandatory . Download versions.json . For download instructions, see versions.json . |
| 3. | Prepare the docker images for both source and target cluster. Optional. If your deployment is offline or if you use a private OCI registry, make sure the required images are available. |
| 4. | Prepare the target cluster:
|
| 5. | Run the migration and move the data. The migration executes pods on both the source and target clusters. The external object storage configured for the source cluster, specifically the Platform bucket, is used as an intermediate migration storage location. Source cluster:
Target cluster:
|
| 6. |
|
Data migration and responsibilities
| Data | Migration mechanism | |
|---|---|---|
| Status | Responsibility | |
| SQL | Retained You have two options:
| Customer |
| Docker registry | Not migrated registry.uipath.com for the target cluster, no further steps are needed.) | Customer |
| FQDN | Required You must choose a new FQDN for the new cluster. Optionally, you can revert to the previous FQDN if needed. | Customer |
| Certificates | Not migrated You must bring certificates as part of the new cluster installation. | Customer |
| Cluster configuration | Not migrated input.json applicable to the target cluster type (AKS or EKS). | Customer |
| Custom alerts and dashboards created by users | Not migrated Post-migration, you must reconfigure any custom alerts in Alert Manager and Grafana dashboards. | Customer |
| Application logs / Prometheus streaming configuration created by users | Not migrated You must reconfigure application log and Prometheus streaming. | Customer |
| Dynamic workloads | Depends on application AI Center training jobs are lost; Skills are retained. | Skills (script needed to be executed after upgrade): UiPath® Training jobs: Customer |
| Objectstore | External objectstore: Retained For external objectstore, you have two options:
Important : If you're using an in-cluster object store, you must perform a ceph-to-external migration before the upgrade. | Migrating from in-cluster to external objectstore: Customer External objectstore: UiPath® |
| Insights | Retained | UiPath® |
| MongoDB data | Retained MongoDB data is moved to the target SQL. | UiPath® |
| RabbitMQ | Not needed | UiPath® |
| Monitoring (data) | Not needed Monitoring data does not apply to the new cluster. | N/A |
Preparation
Preparing the cluster_config.json file
Do not modify the source cluster after starting the migration process.
To prepare the cluster_config.json file, take the following steps:
-
Download the targeted version of
uipathctlon the source cluster and generate theinput.jsonfile by runninguipathctl manifest get-revision. For details, see the following diagram: -
Based on the previously generated
input.jsonfile, modify theinput.jsonfile of the target cluster. For instructions, refer to Configuring input.json.You must transfer the Orchestrator-specific configuration that includes the encryption key per tenant and Azure/Amazon S3 storage buckets settings.
Note:Dedicated Microsoft SQL Server and PostgreSQL for Process Mining Airflow database is the recommended option for version 2023.10.9 or newer.
If you migrate from a version prior to 2023.10.9, the generated
input.jsonfile for the target cluster does not contain the connection string for the Airflow PostgreSQL database. To use the latest version of Airflow, which requires PostgreSQL, you will need to manually add thesqlalchemyconnection string template for PostgreSQL to theinput.jsonfile for the target cluster before migration.Postgresql_connection_string_template_sqlalchemy_pyodbcpostgresql+psycopg2://<user>:<password>@<postgresql host>:<postgresql port>/DB_NAME_PLACEHOLDERpostgresql+psycopg2://<user>:<password>@<postgresql host>:<postgresql port>/DB_NAME_PLACEHOLDER -
Validate the prerequisites in the target cluster by running the following command:
uipathctl prereq run input-target.json --kubeconfig kubeconfig.target --versions versions.jsonuipathctl prereq run input-target.json --kubeconfig kubeconfig.target --versions versions.json -
Clone the SQL databases from the source deployment to the target deployment.
Private registry without internet access requirements
The migration process requires the latest uipathcore Docker image tag to be available for both the source and target clusters. If your source cluster is offline, make the image available by taking the following steps:
- Follow the steps to hydrate the registry used by the target cluster with the offline bundle in Option B: Hydrating the registry with the offline bundle.
- Copy the
uipathctlbinary andversions.jsonfile on a VM with access to the source cluster. - Run the following command:
jq -r '.[][] | select(.name=="uipath/uipathcore") | .ref + ":" + .version' "/path/to/versions.json" > images.txtjq -r '.[][] | select(.name=="uipath/uipathcore") | .ref + ":" + .version' "/path/to/versions.json" > images.txt - Add the
uipathcoreimage to your private registry using theuipathctlbinary:./uipathctl registry seed --tag-file ./images.txt \ --source-registry "target.registry.fqdn.com" \ --source-password "target-registry-username" \ --source-username "target-registry-password" \ --dest-registry "<source.registry.fqdn.com>" \ --dest-username "<source-registry-username>" \ --dest-password "<source-registry-password>"./uipathctl registry seed --tag-file ./images.txt \ --source-registry "target.registry.fqdn.com" \ --source-password "target-registry-username" \ --source-username "target-registry-password" \ --dest-registry "<source.registry.fqdn.com>" \ --dest-username "<source-registry-username>" \ --dest-password "<source-registry-password>"Note:Make sure to replace
registry.fqdn,registry-username, andregistry-passwordwith the proper values for the private registry used by your source offline installation.
Private registry with internet access requirements
If you use a private registry, you must seed it. For instructions, seeConfiguring the OCI-compliant registry.
Execution
To migrate to Automation Suite on EKS/AKS, take the following steps:
- Execute the migration by running the following command:
uipathctl cluster migration run input-target.json --kubeconfig kubeconfig.source --target-kubeconfig kubeconfig.target --versions versions-target.jsonuipathctl cluster migration run input-target.json --kubeconfig kubeconfig.source --target-kubeconfig kubeconfig.target --versions versions-target.json - Complete the installation of Automation Suite on AKS/EKS on the target cluster by running the following command:
uipathctl manifest apply input-target.json --kubeconfig kubeconfig.target --versions versions-target.jsonuipathctl manifest apply input-target.json --kubeconfig kubeconfig.target --versions versions-target.json
AI Center skill migration
The steps in this section are applicable only if you enabled AI Center on both the source and target clusters. Note that the instructions assume that AI Center on the target cluster points to the database containing the skill data for running the skills.
After completing the migration, you must sync the AI Center skills so that you can use them again.
Checking the skill migration status
To retrieve the status of the skills on the target Automation Suite on EKS/AKS cluster, take the following steps:
- Set up the variables for executing the next commands.
aicJobsImage=$(kubectl -n uipath get configmap aic-jobs-config -o "jsonpath={.data['aicenter/aicenter-jobs:v23.10-10.15-rc02']}") podName="skillstatuspod"aicJobsImage=$(kubectl -n uipath get configmap aic-jobs-config -o "jsonpath={.data['aicenter/aicenter-jobs:v23.10-10.15-rc02']}") podName="skillstatuspod" - Clean up any
skillstatuspodthat might be running before retrieving the skill status again. The following command deletes the pod from the previous iteration, so use it carefully.kubectl -n uipath delete pod "$podName" --force.kubectl -n uipath delete pod "$podName" --force. - Create the
skillstatuspodto get the skill status. The pod may take some time to pull the image and run, typically less than 30 seconds.skill_arr="[]" kubectl -n uipath run "$podName" --image="$aicJobsImage" --restart=Never --labels="app.kubernetes.io/component=aicenter" --overrides='{ "metadata": { "annotations": {"sidecar.istio.io/inject": "false"}}}' --command -- /bin/bash -c "curl -sSL -XPOST -H 'Content-Type: application/json' 'ai-deployer-svc.uipath.svc.cluster.local/ai-deployer/v1/system/mlskills:restore-status' -d \"$skill_arr\" | jq -r '([\"SKILL_ID\",\"SKILL_NAME\", \"STATUS\"] | (., map(length*\"-\"))), (.data[] | [.skillId, .skillName, .syncStatus]) | @tsv' | column -ts $'\t'; exit"skill_arr="[]" kubectl -n uipath run "$podName" --image="$aicJobsImage" --restart=Never --labels="app.kubernetes.io/component=aicenter" --overrides='{ "metadata": { "annotations": {"sidecar.istio.io/inject": "false"}}}' --command -- /bin/bash -c "curl -sSL -XPOST -H 'Content-Type: application/json' 'ai-deployer-svc.uipath.svc.cluster.local/ai-deployer/v1/system/mlskills:restore-status' -d \"$skill_arr\" | jq -r '([\"SKILL_ID\",\"SKILL_NAME\", \"STATUS\"] | (., map(length*\"-\"))), (.data[] | [.skillId, .skillName, .syncStatus]) | @tsv' | column -ts $'\t'; exit"Note:- Replace
$skill_arrwith[]to run all skills, or['abcd', 'efgh']to run only the two skills mentioned. - The
skills idouput is needed for the next commands.
- Replace
- Check the output of the skill status.
kubectl -n uipath logs -f "$podName" -c "$podName"kubectl -n uipath logs -f "$podName" -c "$podName"
Running the skill migration
To run the skill migration, take the following steps:
-
Set up the variables for executing the next commands.
aicJobsImage=$(kubectl -n uipath get configmap aic-jobs-config -o "jsonpath={.data['AIC_JOBS_IMAGE']}") podName="skillsyncpod"aicJobsImage=$(kubectl -n uipath get configmap aic-jobs-config -o "jsonpath={.data['AIC_JOBS_IMAGE']}") podName="skillsyncpod" -
Clean up any
skillsyncpodthat might be running before retrieving the skill status again. The following command deletes the pod from the previous iteration, so use it carefully.kubectl -n uipath delete pod "$podName" --forcekubectl -n uipath delete pod "$podName" --force -
Initiate the skill sync. The pod may take some time to pull image and run, typically less than 30 seconds.
kubectl -n uipath run "$podName" --image="$aicJobsImage" --restart=Never --labels="app.kubernetes.io/component=aicenter" --overrides='{ "metadata": { "annotations": {"sidecar.istio.io/inject": "false"}}}' --command -- /bin/bash -c "curl -sSL -XPOST -H 'Content-Type: application/json' 'ai-deployer-svc.uipath.svc.cluster.local/ai-deployer/v1/system/mlskills:restore-all' -d \"[\"skill_id1\", \"skill_id2\", .... ]\"; exit"kubectl -n uipath run "$podName" --image="$aicJobsImage" --restart=Never --labels="app.kubernetes.io/component=aicenter" --overrides='{ "metadata": { "annotations": {"sidecar.istio.io/inject": "false"}}}' --command -- /bin/bash -c "curl -sSL -XPOST -H 'Content-Type: application/json' 'ai-deployer-svc.uipath.svc.cluster.local/ai-deployer/v1/system/mlskills:restore-all' -d \"[\"skill_id1\", \"skill_id2\", .... ]\"; exit"Note:Replace
skill idswith the values copied during the Checking the skill migration status procedure.Check the example below for declaring the
skill_arrvariable:skill_arr='[\"fb14154a-ce63-43ab-yyyy-xxxxxxxxxxxxxx\", \"ad58942d-e038-4d38-yyyy-xxxxxxxxxxxx\"]' # Replace them with ML skill ids in your environment kubectl -n uipath run "$podName" --image="$aicJobsImage" --restart=Never --labels="app.kubernetes.io/component=aicenter" --overrides='{ "metadata": { "annotations": {"sidecar.istio.io/inject": "false"}}}' --command -- /bin/bash -c -x "curl -sSL -XPOST -H 'Content-Type: application/json' '/ai-deployer/v1/system/mlskills:restore-all' -d \"$skill_arr\"; exit"skill_arr='[\"fb14154a-ce63-43ab-yyyy-xxxxxxxxxxxxxx\", \"ad58942d-e038-4d38-yyyy-xxxxxxxxxxxx\"]' # Replace them with ML skill ids in your environment kubectl -n uipath run "$podName" --image="$aicJobsImage" --restart=Never --labels="app.kubernetes.io/component=aicenter" --overrides='{ "metadata": { "annotations": {"sidecar.istio.io/inject": "false"}}}' --command -- /bin/bash -c -x "curl -sSL -XPOST -H 'Content-Type: application/json' '/ai-deployer/v1/system/mlskills:restore-all' -d \"$skill_arr\"; exit" -
Check the output of the skill sync status.
kubectl -n uipath logs -f "$podName" -c "$podName"kubectl -n uipath logs -f "$podName" -c "$podName" -
The operation may take a long time, depending on the number of skills to sync, so you can rely on the skill migration status to check it periodically until there is no skill in
IN_PROGRESSstate.Note:When checking the skill migration status or running the skill migration, you cover all skills at the same time. Alternatively, you can perform these operations only for select skills by passing
-d "[skill_id1, skill_id2, .... ]"as an extra argument tocurlin step 3.
- Requirements
- Process overview
- Data migration and responsibilities
- Preparation
- Preparing the cluster_config.json file
- Private registry without internet access requirements
- Private registry with internet access requirements
- Execution
- AI Center skill migration
- Checking the skill migration status
- Running the skill migration