From ad6e853b013394a1c5ed45db4d9c3b44a060eed0 Mon Sep 17 00:00:00 2001 From: Angel Date: Mon, 26 Jun 2023 15:52:25 -0400 Subject: [PATCH 1/7] first commit --- app/_assets/images/docs/gateway/migration.png | Bin 0 -> 33267 bytes .../migrate-cassandra-to-postgres.md | 107 ++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 app/_assets/images/docs/gateway/migration.png create mode 100644 app/_src/gateway/production/running-kong/migrate-cassandra-to-postgres.md diff --git a/app/_assets/images/docs/gateway/migration.png b/app/_assets/images/docs/gateway/migration.png new file mode 100644 index 0000000000000000000000000000000000000000..b5e8c669f362c8faff774bd79a2d9b520b773a3f GIT binary patch literal 33267 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 Execute "deck dump --rbac-resources-only" against the blue environment for each workspace to build a YAML representation of any RBAC resources created
- If using the Kong Developer Portal, run the "portal fetch" command to build a representation of the Dev Portal Assets for a workspace | | +| 2 | Configuration sync | - Change decK to work with the green environment, and execute "deck sync" to push the configuration to the green environment
- Change Portal CLI to work against the green environment, and execute "portal deploy" to push the Dev Portal configuration against the new environment | | +| 3 | Regression Testing | Execute regression tests against the green environment backed by PostGres | | +| 4 | Go/No go checkpoint | If all tests pass proceed with traffic cutover | | + + +## Traffic cutover + +The purpose of this phase is to migrate traffic in a controlled manner, with a rapid fall back mechanism if a problem is detected. The wait times before increasing the canary split can be increased/decreased depending on risk appetite. + + +| Step | Name | Description | Completed | +|------|-------------------------|---------------------------------------|-----------| +| 1 | Canary 1% of traffic to the new green environment | Canary 1% of traffic to the new environment and monitor the traffic health. | | +| 2 | Canary 5% of traffic to the new green environment | Increase traffic split to 5% and monitor. | | +| 3 | Canary 10% of traffic to the new green environment | Increase traffic split to 10% and monitor. | | +| 4 | Canary 50% of traffic to the new green environment | Increase traffic split to 50% and monitor. | | +| 5 | Switch 100% of traffic to the new green environment | Perform a full DNS switch over to point to the new green environment. | | +| 6 | Demise old platform | After 24 hours when confidence is high, demise of the old platform. | | + + + + +## Limitations + + +* If basic auth plugin is used, the passwords are hashed and encrypted in the database which a decK dump will not export and it is impossible to get the passwords out of the database in the cleartext. Migrating these credentials will have to be performed using admin api or Kong Manager. + +* Admin users on the Kong management plane are not propagated using DecK, and will have to be done using the Kong Admin API + + + + +Going forward, the basic authentication credentials can be managed through the Kong deck. See below document to integrate with GCP secrets and secrets management with deck. + +Gateway secret management GCP +https://docs.konghq.com/gateway/latest/kong-enterprise/secrets-management/backends/gcp-sm/#main +Secrets management with deck +https://docs.konghq.com/deck/latest/guides/vaults/#configure-a-secret-vault From ac64ae6bd4ea66c056668b7e4252d595baf8ed5b Mon Sep 17 00:00:00 2001 From: Angel Date: Tue, 27 Jun 2023 15:16:06 -0400 Subject: [PATCH 2/7] add more info --- .../running-kong/migrate-cassandra-to-postgres.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/_src/gateway/production/running-kong/migrate-cassandra-to-postgres.md b/app/_src/gateway/production/running-kong/migrate-cassandra-to-postgres.md index d383610bb7c4..1b20e3384693 100644 --- a/app/_src/gateway/production/running-kong/migrate-cassandra-to-postgres.md +++ b/app/_src/gateway/production/running-kong/migrate-cassandra-to-postgres.md @@ -101,7 +101,5 @@ The purpose of this phase is to migrate traffic in a controlled manner, with a r Going forward, the basic authentication credentials can be managed through the Kong deck. See below document to integrate with GCP secrets and secrets management with deck. -Gateway secret management GCP -https://docs.konghq.com/gateway/latest/kong-enterprise/secrets-management/backends/gcp-sm/#main -Secrets management with deck -https://docs.konghq.com/deck/latest/guides/vaults/#configure-a-secret-vault +[Gateway secret management GCP](/gateway/latest/kong-enterprise/secrets-management/backends/gcp-sm/#main) +[Secrets Management with Deck](/deck/latest/guides/vaults/#configure-a-secret-vault) \ No newline at end of file From b98dc13853bb13c68c6f626504af85de63692cea Mon Sep 17 00:00:00 2001 From: Angel Date: Thu, 3 Aug 2023 14:59:43 -0400 Subject: [PATCH 3/7] Apply suggestions from code review Co-authored-by: lena-larionova <54370747+lena-larionova@users.noreply.github.com> --- .../migrate-cassandra-to-postgres.md | 85 ++++++++++--------- 1 file changed, 44 insertions(+), 41 deletions(-) diff --git a/app/_src/gateway/production/running-kong/migrate-cassandra-to-postgres.md b/app/_src/gateway/production/running-kong/migrate-cassandra-to-postgres.md index 1b20e3384693..e86745d09afa 100644 --- a/app/_src/gateway/production/running-kong/migrate-cassandra-to-postgres.md +++ b/app/_src/gateway/production/running-kong/migrate-cassandra-to-postgres.md @@ -2,79 +2,83 @@ title: Migration guidelines: Cassandra to Postgres --- -The purpose of this document is to provide an approach aimed at migrating Cassandra db backed Kong deployment to Postgresql backed Kong deployment. This document will guide migration from traditional Kong deployment topology to hybrid. +This guide walks you through migrating {{site.base_gateway}} from a Cassandra DB-backed +[traditional](/gateway/{{page.kong_version}}/production/deployment-topologies/traditional/) deployment to a PostgreSQL-backed +[hybrid](/gateway/{{page.kong_version}}/production/deployment-topologies/hybrid-mode/) deployment. -A Blue/Green migration approach is proposed in this document. To achieve the easiest possible migration, declarative tools Kong [DecK](https://docs.konghq.com/deck/latest/) will be utilized. DNS switching will be used to cut traffic over from a Blue environment to a Green environment. This will provide the ability to rollback faster if an issue is detected. +This guide uses a blue-green migration approach. In this approach, DNS switching helps cut traffic over from a Blue environment to a Green environment. This provides the ability to roll back faster if an issue is detected. -The steps to migrate, at a high level are: +We recommend using [decK](/deck/), Kong's declarative configuration management tool. -* New target Kong environment will be built as a blank canvas with Postgresql db with hybrid deployment. -* Kong deck is used to take export (dump) from old traditional cassandra backed Kong deployment. -* Kong deck is used to import (sync) to new hybrid postgresql backed Kong deployment. -* Basic auth credentials and local rbac users will need to be created separately either using admin api or manually(Kong Manager). -* When the Kong configuration has been migrated over to the green environment, traffic can be slowly canaried into the green environment to de-risk the release with a fast rollback mechanism in place. +Migration steps: +1. Build a target {{site.base_gateway}} hybrid environment with PostgreSQL. This acts as your blank canvas. +1. Use decK to export (`dump`) configuration from the old traditional Cassandra-backed deployment. +1. Use decK to import (`sync`) the configuration to the new hybrid PostgreSQL-backed deployment. +1. Create basic auth credentials and local RBAC users using either the Admin Api or Kong Manager. +1. When the {{site.base_gateway}} configuration has been migrated over to the green environment, slowly redirect traffic via canary into the green environment. This lowers the risk of the release with a fast rollback mechanism in place. -### Considerations + +## Considerations While the document provides high level guidelines, actual migration steps may differ based on the following factors: -* complexity of the Kong deployment environment -* Kong plugins used -* Usage of custom plugins -* External touchpoints to the Gateway (e.g. OIDC) -* number of configuration entities - e.g. services and routes -* If running an older version of Kong it is recommended to do a Kong version upgrade before the database migration (To reduce the moving parts in the upgrade procedure) -* Using cassandra means may not be using the Kong Hybrid Mode deployment and might be deployed in the traditional mode, we recommend taking this opportunity to review the architecture to leverage the latest features of Kong Enterprise. +* Complexity of the Kong deployment environment +* Kong plugins +* Custom plugins +* External touchpoints to the Gateway (for example, OIDC with external IdPs) +* Number of configuration entities, for example services and routes +* If running an older version of {{site.base_gateway}}, we recommend doing a {{site.base_gateway}} version upgrade before the database migration. This reduces the moving parts in the upgrade procedure. +* If you're using Cassandra, you likely have a traditional deployment. We recommend taking this opportunity to review the [deployment topology options](gateway/{{page.kong_version}}/production/deployment-topologies/) for {{site.base_gateway}} and converting to a hybrid mode deployment, if possible. -While the diagram shows the split between the Kong control and Data planes, the same approach can be followed for Kong instances deployed in Classic Mode. +The following diagram shows the architecture of a hybrid mode deployment, which means there is a split between the {{site.base_gateway}} control and data planes. You can follow the same database migration approach for {{site.base_gateway}} instances deployed in traditional mode. -![migration image](_assets/images/docs/gateway/migration.png) +![migration image](/assets/images/docs/gateway/migration.png) -### Assumptions -The Kong blue environment (Using Cassandra) and green environment (using Postgres) are running the same Kong Enterprise version -Blue is deployed in traditional mode and green environment is running with Kong deployed in a hybrid deployment mode. +## Prerequisites +* The {{site.base_gateway}} blue environment (using Cassandra) and green environment (using PostgreSQL) are running the same Gateway version. +* In the following examples, blue is deployed in traditional mode and green is deployed in hybrid mode. If you prefer to migrate to a traditional deployment, you can still follow the steps, but you don't need to worry about performing separate control plane and data plane tasks. -## Migration Approach +## Migration approach The following steps should be tested in a non-production environment. Any gaps in the target state should be identified and remediated before running it in production. | Step | Name | Description | Completed | |------|--------------------|-------------------------------------------------------------------------------------------------------|-----------| -| 1 | Platform build | The Green environment is built with Kong Enterprise setup using the same version as the Blue environment | | -| 2 | Database setup | A new Postgres DB is built and connected to the green environment | | -| 3 | Regression Testing | A deployment is made into the new system and regression tested. The deployment is cleaned up when testing is completed | | +| 1 | Platform build | Build the green environment with {{site.base_gateway}} using the same version as the blue environment | | +| 2 | Database setup | Build a new Postgres DB and connect it to the green environment | | +| 3 | Regression testing | Deploy your setup into the new system and regression test it. Clean up the deployment when testing is completed . | | -## Preperation +## Preparation | Step | Name | Description | Completed | |------|-------------------------------|-------------------------------------------------------------------------------------------------------------|-----------| -| 1 | Change embargo | A change embargo is placed on the environment preventing new deployments or configuration changes | | -| 2 | Blue environment backup | A backup is taken on the blue environment's Cassandra database and placed into redundant storage | | -| 3 | Observability setup | Dashboards are created to track the health of the new environment | | -| 4 | Go/No go checkpoint | Go/No go decision point for the migration execution | | +| 1 | Change embargo | Place a change embargo on the old environment preventing new deployments or configuration changes | | +| 2 | Blue environment backup | Make a backup of the blue environment's Cassandra database and place it into redundant storage | | +| 3 | Observability setup | Create dashboards to track the health of the new environment | | +| 4 | Go/No Go checkpoint | Go/No Go decision point for the migration execution | | ## Execution -The goal of this phase is to reproduce the Kong configuration in the blue environment and perform regression/smoke testing ahead of live traffic cut-over. +The goal of this phase is to reproduce the {{site.base_gateway}} configuration in the blue environment and perform regression and smoke testing ahead of live traffic cut-over. | Step | Name | Description | Completed | |------|-----------------------|-----------------------------------------------------------------------------------------------------------------------|-----------| -| 1 | Configuration dump | - Execute the "deck dump" command against the blue environment, for each workspace to build a YAML representation of the Kong estate
- Execute "deck dump --rbac-resources-only" against the blue environment for each workspace to build a YAML representation of any RBAC resources created
- If using the Kong Developer Portal, run the "portal fetch" command to build a representation of the Dev Portal Assets for a workspace | | -| 2 | Configuration sync | - Change decK to work with the green environment, and execute "deck sync" to push the configuration to the green environment
- Change Portal CLI to work against the green environment, and execute "portal deploy" to push the Dev Portal configuration against the new environment | | -| 3 | Regression Testing | Execute regression tests against the green environment backed by PostGres | | -| 4 | Go/No go checkpoint | If all tests pass proceed with traffic cutover | | +| 1 | Configuration dump | - Execute the `deck dump` command against the blue environment for each workspace to build a YAML representation of the Kong estate
- Execute `deck dump --rbac-resources-only` against the blue environment for each workspace to build a YAML representation of any RBAC resources created
- If using the Kong Dev Portal, run the `portal fetch` command via the Portal CLI to build a representation of the Dev Portal assets for a workspace | | +| 2 | Configuration sync | - Change decK to work with the green environment, and execute `deck sync` to push the configuration to the green environment
- Change the Portal CLI to work against the green environment, and execute `portal deploy` to push the Dev Portal configuration against the new environment | | +| 3 | Regression testing | Execute regression tests against the green environment backed by PostgreSQL | | +| 4 | Go/No Go checkpoint | If all tests pass, proceed with traffic cutover | | ## Traffic cutover -The purpose of this phase is to migrate traffic in a controlled manner, with a rapid fall back mechanism if a problem is detected. The wait times before increasing the canary split can be increased/decreased depending on risk appetite. +The purpose of this phase is to migrate traffic in a controlled manner, with a rapid fallback mechanism if a problem is detected. You can increase or decrease the wait times before increasing the canary split depending on the risk tolerance. | Step | Name | Description | Completed | @@ -84,22 +88,21 @@ The purpose of this phase is to migrate traffic in a controlled manner, with a r | 3 | Canary 10% of traffic to the new green environment | Increase traffic split to 10% and monitor. | | | 4 | Canary 50% of traffic to the new green environment | Increase traffic split to 50% and monitor. | | | 5 | Switch 100% of traffic to the new green environment | Perform a full DNS switch over to point to the new green environment. | | -| 6 | Demise old platform | After 24 hours when confidence is high, demise of the old platform. | | +| 6 | Take down old platform | After 24 hours when confidence is high, take down the old platform. | | ## Limitations +* If using the Basic Authentication plugin, the passwords are hashed and encrypted in the database. A decK dump doesn't export these credentials, so it is impossible to get the passwords out of the database in the cleartext. You must migrate these credentials using the Admin Api or Kong Manager. -* If basic auth plugin is used, the passwords are hashed and encrypted in the database which a decK dump will not export and it is impossible to get the passwords out of the database in the cleartext. Migrating these credentials will have to be performed using admin api or Kong Manager. - -* Admin users on the Kong management plane are not propagated using DecK, and will have to be done using the Kong Admin API +* Admin users on the {{site.base_gateway}} control plane are not propagated using decK. Migrate them using the Kong Admin API. -Going forward, the basic authentication credentials can be managed through the Kong deck. See below document to integrate with GCP secrets and secrets management with deck. +After migration, basic authentication credentials can be managed by decK. See the following topics to learn how to manage secrets with deck: [Gateway secret management GCP](/gateway/latest/kong-enterprise/secrets-management/backends/gcp-sm/#main) [Secrets Management with Deck](/deck/latest/guides/vaults/#configure-a-secret-vault) \ No newline at end of file From 68018416b1125511c49279fe4dec96363f535f50 Mon Sep 17 00:00:00 2001 From: Angel Date: Thu, 3 Aug 2023 15:09:05 -0400 Subject: [PATCH 4/7] more feedback --- .../migrate-cassandra-to-postgres.md | 56 +++++++++---------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/app/_src/gateway/production/running-kong/migrate-cassandra-to-postgres.md b/app/_src/gateway/production/running-kong/migrate-cassandra-to-postgres.md index e86745d09afa..6fcf6d5ba23c 100644 --- a/app/_src/gateway/production/running-kong/migrate-cassandra-to-postgres.md +++ b/app/_src/gateway/production/running-kong/migrate-cassandra-to-postgres.md @@ -1,5 +1,5 @@ --- -title: Migration guidelines: Cassandra to Postgres +title: Cassandra to Postgres Migration Guidelines --- This guide walks you through migrating {{site.base_gateway}} from a Cassandra DB-backed @@ -25,7 +25,7 @@ While the document provides high level guidelines, actual migration steps may di * Complexity of the Kong deployment environment * Kong plugins * Custom plugins -* External touchpoints to the Gateway (for example, OIDC with external IdPs) +* External touch points to the Gateway (for example, OIDC with external IdPs) * Number of configuration entities, for example services and routes * If running an older version of {{site.base_gateway}}, we recommend doing a {{site.base_gateway}} version upgrade before the database migration. This reduces the moving parts in the upgrade procedure. * If you're using Cassandra, you likely have a traditional deployment. We recommend taking this opportunity to review the [deployment topology options](gateway/{{page.kong_version}}/production/deployment-topologies/) for {{site.base_gateway}} and converting to a hybrid mode deployment, if possible. @@ -43,23 +43,23 @@ The following diagram shows the architecture of a hybrid mode deployment, which ## Migration approach The following steps should be tested in a non-production environment. Any gaps in the target state should be identified and remediated before running it in production. -| Step | Name | Description | Completed | -|------|--------------------|-------------------------------------------------------------------------------------------------------|-----------| -| 1 | Platform build | Build the green environment with {{site.base_gateway}} using the same version as the blue environment | | -| 2 | Database setup | Build a new Postgres DB and connect it to the green environment | | -| 3 | Regression testing | Deploy your setup into the new system and regression test it. Clean up the deployment when testing is completed . | | +| Step | Name | Description | +|------|--------------------|-------------------------------------------------------------------------------------------------------| +| 1 | Platform build | Build the green environment with {{site.base_gateway}} using the same version as the blue environment | +| 2 | Database setup | Build a new Postgres DB and connect it to the green environment | +| 3 | Regression testing | Deploy your setup into the new system and regression test it. Clean up the deployment when testing is completed . | ## Preparation -| Step | Name | Description | Completed | -|------|-------------------------------|-------------------------------------------------------------------------------------------------------------|-----------| -| 1 | Change embargo | Place a change embargo on the old environment preventing new deployments or configuration changes | | -| 2 | Blue environment backup | Make a backup of the blue environment's Cassandra database and place it into redundant storage | | -| 3 | Observability setup | Create dashboards to track the health of the new environment | | -| 4 | Go/No Go checkpoint | Go/No Go decision point for the migration execution | | +| Step | Name | Description | +|------|-------------------------------|-------------------------------------------------------------------------------------------------------------| +| 1 | Change embargo | Place a change embargo on the old environment preventing new deployments or configuration changes | +| 2 | Blue environment backup | Make a backup of the blue environment's Cassandra database and place it into redundant storage | +| 3 | Observability setup | Create dashboards to track the health of the new environment | +| 4 | Go/No Go checkpoint | Go/No Go decision point for the migration execution | @@ -68,32 +68,32 @@ The following steps should be tested in a non-production environment. Any gaps i The goal of this phase is to reproduce the {{site.base_gateway}} configuration in the blue environment and perform regression and smoke testing ahead of live traffic cut-over. -| Step | Name | Description | Completed | -|------|-----------------------|-----------------------------------------------------------------------------------------------------------------------|-----------| -| 1 | Configuration dump | - Execute the `deck dump` command against the blue environment for each workspace to build a YAML representation of the Kong estate
- Execute `deck dump --rbac-resources-only` against the blue environment for each workspace to build a YAML representation of any RBAC resources created
- If using the Kong Dev Portal, run the `portal fetch` command via the Portal CLI to build a representation of the Dev Portal assets for a workspace | | -| 2 | Configuration sync | - Change decK to work with the green environment, and execute `deck sync` to push the configuration to the green environment
- Change the Portal CLI to work against the green environment, and execute `portal deploy` to push the Dev Portal configuration against the new environment | | -| 3 | Regression testing | Execute regression tests against the green environment backed by PostgreSQL | | -| 4 | Go/No Go checkpoint | If all tests pass, proceed with traffic cutover | | +| Step | Name | Description | +|------|-----------------------|-----------------------------------------------------------------------------------------------------------------------| +| 1 | Configuration dump | - Execute the `deck dump` command against the blue environment for each workspace to build a YAML representation of the Kong estate
- Execute `deck dump --rbac-resources-only` against the blue environment for each workspace to build a YAML representation of any RBAC resources created
- If using the Kong Dev Portal, run the `portal fetch` command via the Portal CLI to build a representation of the Dev Portal assets for a workspace | +| 2 | Configuration sync | - Change decK to work with the green environment, and execute `deck sync` to push the configuration to the green environment
- Change the Portal CLI to work against the green environment, and execute `portal deploy` to push the Dev Portal configuration against the new environment | +| 3 | Regression testing | Execute regression tests against the green environment backed by PostgreSQL | +| 4 | Go/No Go checkpoint | If all tests pass, proceed with traffic cut over | -## Traffic cutover +## Traffic cut over The purpose of this phase is to migrate traffic in a controlled manner, with a rapid fallback mechanism if a problem is detected. You can increase or decrease the wait times before increasing the canary split depending on the risk tolerance. -| Step | Name | Description | Completed | +| Step | Name | Description| |------|-------------------------|---------------------------------------|-----------| -| 1 | Canary 1% of traffic to the new green environment | Canary 1% of traffic to the new environment and monitor the traffic health. | | -| 2 | Canary 5% of traffic to the new green environment | Increase traffic split to 5% and monitor. | | -| 3 | Canary 10% of traffic to the new green environment | Increase traffic split to 10% and monitor. | | -| 4 | Canary 50% of traffic to the new green environment | Increase traffic split to 50% and monitor. | | -| 5 | Switch 100% of traffic to the new green environment | Perform a full DNS switch over to point to the new green environment. | | -| 6 | Take down old platform | After 24 hours when confidence is high, take down the old platform. | | +| 1 | Canary 1% of traffic to the new green environment | Canary 1% of traffic to the new environment and monitor the traffic health. | +| 2 | Canary 5% of traffic to the new green environment | Increase traffic split to 5% and monitor. | +| 3 | Canary 10% of traffic to the new green environment | Increase traffic split to 10% and monitor. | +| 4 | Canary 50% of traffic to the new green environment | Increase traffic split to 50% and monitor.| +| 5 | Switch 100% of traffic to the new green environment | Perform a full DNS switch over to point to the new green environment.| +| 6 | Take down old platform | After 24 hours when confidence is high, take down the old platform. | -## Limitations +## Next steps * If using the Basic Authentication plugin, the passwords are hashed and encrypted in the database. A decK dump doesn't export these credentials, so it is impossible to get the passwords out of the database in the cleartext. You must migrate these credentials using the Admin Api or Kong Manager. From eed18d2fe21083da0e75846b900e6cfe9ba09b7e Mon Sep 17 00:00:00 2001 From: Angel Date: Thu, 3 Aug 2023 15:14:31 -0400 Subject: [PATCH 5/7] navbar changes, rename --- app/_data/docs_nav_gateway_3.0.x.yml | 2 ++ app/_data/docs_nav_gateway_3.1.x.yml | 2 ++ app/_data/docs_nav_gateway_3.2.x.yml | 2 ++ app/_data/docs_nav_gateway_3.3.x.yml | 2 ++ app/_data/docs_nav_gateway_3.4.x.yml | 2 ++ .../running-kong => }/migrate-cassandra-to-postgres.md | 0 6 files changed, 10 insertions(+) rename app/_src/gateway/{production/running-kong => }/migrate-cassandra-to-postgres.md (100%) diff --git a/app/_data/docs_nav_gateway_3.0.x.yml b/app/_data/docs_nav_gateway_3.0.x.yml index 6df0f8674206..b879b17e5482 100644 --- a/app/_data/docs_nav_gateway_3.0.x.yml +++ b/app/_data/docs_nav_gateway_3.0.x.yml @@ -198,6 +198,8 @@ items: url: /upgrade/ - text: Migrate from OSS to Enterprise url: /migrate-ce-to-ke/ + - text: Migration Guidelines Cassandra to PostgresSQL + url: /migrate-cassandra-to-postgres - title: Kong Enterprise icon: /assets/images/icons/documentation/icn-enterprise-blue.svg items: diff --git a/app/_data/docs_nav_gateway_3.1.x.yml b/app/_data/docs_nav_gateway_3.1.x.yml index eec3a50b7ffc..097ac2ab3aff 100644 --- a/app/_data/docs_nav_gateway_3.1.x.yml +++ b/app/_data/docs_nav_gateway_3.1.x.yml @@ -204,6 +204,8 @@ items: src: /gateway/upgrade-v2 - text: Migrate from OSS to Enterprise url: /migrate-ce-to-ke/ + - text: Migration Guidelines Cassandra to PostgresSQL + url: /migrate-cassandra-to-postgres - title: Kong Enterprise icon: /assets/images/icons/documentation/icn-enterprise-blue.svg items: diff --git a/app/_data/docs_nav_gateway_3.2.x.yml b/app/_data/docs_nav_gateway_3.2.x.yml index 369125620fca..212d4f5261e6 100644 --- a/app/_data/docs_nav_gateway_3.2.x.yml +++ b/app/_data/docs_nav_gateway_3.2.x.yml @@ -210,6 +210,8 @@ items: src: /gateway/upgrade-v2 - text: Migrate from OSS to Enterprise url: /migrate-ce-to-ke/ + - text: Migration Guidelines Cassandra to PostgresSQL + url: /migrate-cassandra-to-postgres - title: Kong Enterprise icon: /assets/images/icons/documentation/icn-enterprise-blue.svg items: diff --git a/app/_data/docs_nav_gateway_3.3.x.yml b/app/_data/docs_nav_gateway_3.3.x.yml index f5fc6b6abf3f..b990f06e7877 100644 --- a/app/_data/docs_nav_gateway_3.3.x.yml +++ b/app/_data/docs_nav_gateway_3.3.x.yml @@ -214,6 +214,8 @@ items: src: /gateway/upgrade-v2 - text: Migrate from OSS to Enterprise url: /migrate-ce-to-ke/ + - text: Migration Guidelines Cassandra to PostgresSQL + url: /migrate-cassandra-to-postgres - title: Kong Enterprise icon: /assets/images/icons/documentation/icn-enterprise-blue.svg items: diff --git a/app/_data/docs_nav_gateway_3.4.x.yml b/app/_data/docs_nav_gateway_3.4.x.yml index ab706f229dc9..34b88da163ec 100644 --- a/app/_data/docs_nav_gateway_3.4.x.yml +++ b/app/_data/docs_nav_gateway_3.4.x.yml @@ -214,6 +214,8 @@ items: src: /gateway/upgrade-v2 - text: Migrate from OSS to Enterprise url: /migrate-ce-to-ke/ + - text: Migration Guidelines Cassandra to PostgresSQL + url: /migrate-cassandra-to-postgres - title: Kong Enterprise icon: /assets/images/icons/documentation/icn-enterprise-blue.svg items: diff --git a/app/_src/gateway/production/running-kong/migrate-cassandra-to-postgres.md b/app/_src/gateway/migrate-cassandra-to-postgres.md similarity index 100% rename from app/_src/gateway/production/running-kong/migrate-cassandra-to-postgres.md rename to app/_src/gateway/migrate-cassandra-to-postgres.md From 130937fd77af9ea2616665fe02c91385c0f8974f Mon Sep 17 00:00:00 2001 From: Angel Date: Thu, 3 Aug 2023 16:19:17 -0400 Subject: [PATCH 6/7] image move --- app/_src/gateway/migrate-cassandra-to-postgres.md | 2 +- .../images/docs/gateway/migration.png | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename app/{_assets => assets}/images/docs/gateway/migration.png (100%) diff --git a/app/_src/gateway/migrate-cassandra-to-postgres.md b/app/_src/gateway/migrate-cassandra-to-postgres.md index 6fcf6d5ba23c..0dd841b7390d 100644 --- a/app/_src/gateway/migrate-cassandra-to-postgres.md +++ b/app/_src/gateway/migrate-cassandra-to-postgres.md @@ -28,7 +28,7 @@ While the document provides high level guidelines, actual migration steps may di * External touch points to the Gateway (for example, OIDC with external IdPs) * Number of configuration entities, for example services and routes * If running an older version of {{site.base_gateway}}, we recommend doing a {{site.base_gateway}} version upgrade before the database migration. This reduces the moving parts in the upgrade procedure. -* If you're using Cassandra, you likely have a traditional deployment. We recommend taking this opportunity to review the [deployment topology options](gateway/{{page.kong_version}}/production/deployment-topologies/) for {{site.base_gateway}} and converting to a hybrid mode deployment, if possible. +* If you're using Cassandra, you likely have a traditional deployment. We recommend taking this opportunity to review the [deployment topology options](/gateway/{{page.kong_version}}/production/deployment-topologies/) for {{site.base_gateway}} and converting to a hybrid mode deployment, if possible. The following diagram shows the architecture of a hybrid mode deployment, which means there is a split between the {{site.base_gateway}} control and data planes. You can follow the same database migration approach for {{site.base_gateway}} instances deployed in traditional mode. diff --git a/app/_assets/images/docs/gateway/migration.png b/app/assets/images/docs/gateway/migration.png similarity index 100% rename from app/_assets/images/docs/gateway/migration.png rename to app/assets/images/docs/gateway/migration.png From a941adfb11668d846513bc341bf6bf95b3d72be4 Mon Sep 17 00:00:00 2001 From: Angel Date: Fri, 4 Aug 2023 10:01:08 -0400 Subject: [PATCH 7/7] Update app/_src/gateway/migrate-cassandra-to-postgres.md Co-authored-by: lena-larionova <54370747+lena-larionova@users.noreply.github.com> --- app/_src/gateway/migrate-cassandra-to-postgres.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/_src/gateway/migrate-cassandra-to-postgres.md b/app/_src/gateway/migrate-cassandra-to-postgres.md index 0dd841b7390d..c01c4f2a4912 100644 --- a/app/_src/gateway/migrate-cassandra-to-postgres.md +++ b/app/_src/gateway/migrate-cassandra-to-postgres.md @@ -104,5 +104,5 @@ The purpose of this phase is to migrate traffic in a controlled manner, with a r After migration, basic authentication credentials can be managed by decK. See the following topics to learn how to manage secrets with deck: -[Gateway secret management GCP](/gateway/latest/kong-enterprise/secrets-management/backends/gcp-sm/#main) -[Secrets Management with Deck](/deck/latest/guides/vaults/#configure-a-secret-vault) \ No newline at end of file +* [Gateway secret management GCP](/gateway/{{page.kong_version}}/kong-enterprise/secrets-management/backends/gcp-sm/) +* [Secrets management with decK](/deck/latest/guides/vaults/#configure-a-secret-vault) \ No newline at end of file