HyperdiskHyperdisk をサポートするマシンタイプの詳細については、 Compute Engine のドキュメントをご覧ください。
このチュートリアルでは、移行を説明するために、Sakila database と World database を使用してサンプル データセットを提供します。 Sakila は、架空の DVD レンタルショップを表す MySQL が提供するサンプル データベースです。World データベースには、国と都市に関するデータが含まれています。このチュートリアルでは、複雑なマルチテナント環境をシミュレートするために、別々の Namespace にまたがる 2 つの異なるデータセットを使用します。
このチュートリアルは、ストレージの作成と割り当てを行い、データ セキュリティとデータアクセスを管理するストレージ スペシャリストとストレージ管理者を対象としています。 のコンテンツで使用されている一般的なロールとタスクの例の詳細については、GKE ユーザーの一般的なロールと タスクをご覧ください。 Google Cloud
デプロイ アーキテクチャ
次の図は、Backup for GKE を使用して、ステートフル MySQL ワークロードを N2 マシンタイプの Persistent Disk から N4 マシンタイプの Hyperdisk に移行するプロセスを示しています。
- 元のクラスタ: 2 つの MySQL Deployment が、N2 マシンシリーズ ノードプールの別々の Namespace(
namespace-aとnamespace-b)に存在します。これらの Deployment は、データ ストレージに SSD 永続ディスクを使用します。 - バックアップ戦略: クラスタで Backup for GKE エージェントを有効にし、Namespace、ボリュームデータ、シークレットをキャプチャするバックアップ プランを作成します。次に、手動バックアップを実行して、ポイントインタイム リカバリ ポイントを作成します。
- 変換と復元: 変換ルールを使用して復元プランを定義し、移行先の環境に合わせてリソースを調整します。これらのルールは次のことを行います。
StorageClassをpremium-rwo(PD)からbalanced-storageという名前の Hyperdisk ストレージ クラスに切り替えます。- 復元されたワークロードが新しい N4 ノードプールでスケジュールされるように、Pod アフィニティ ルールを変更します。
- 移行先の環境: N4 マシンタイプを使用して新しい GKE クラスタをプロビジョニングします。復元プロセスでは、バックアップからディスクを Hyperdisk ボリュームとして再作成し、互換性のある N4 ノードに MySQL インスタンスをデプロイします。
目標
このチュートリアルでは、次の方法について説明します。
- バックアップ用に GKE ステートフル アプリケーションを準備する。
- Backup for GKE アドオンを有効にする。
- バックアップ プランを作成し、ソースクラスタをバックアップする。
- 変換ルールを使用してストレージを Hyperdisk に移行する復元プランを作成する。
- ワークロードを新しいクラスタに復元し、データを確認する。
費用
このドキュメントでは、課金対象である次のコンポーネントを使用します。 Google Cloud
- GKE
- Compute Engine (Persistent Disk and Hyperdisk)
- Backup for GKE
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
- アカウントにログインします。 Google Cloud を初めて使用する場合は、 アカウントを作成して、実際のシナリオで Google プロダクトのパフォーマンスを評価してください。 Google Cloud新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Compute Engine, GKE, Backup for GKE, and IAM APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Compute Engine, GKE, Backup for GKE, and IAM APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
プロジェクトで次のロール(複数の場合あり)が割り当てられていることを確認します: roles/container.admin、roles/iam.serviceAccountAdmin、roles/compute.admin、roles/gkebackup.admin、roles/monitoring.viewer
ロールを確認する
-
コンソールで、[IAM] ページに移動します。 Google Cloud
IAM に移動 - プロジェクトを選択します。
-
[Principal] 列で、自分または自分が所属するグループの行をすべて確認します。所属するグループについては、管理者にお問い合わせください。
- 自分のメールアドレスを含む行の [**ロール**] 列で、ロールのリストに必要なロールが含まれているかどうか確認します。
ロールを付与する
-
コンソールで、[IAM] ページに移動します。 Google Cloud
IAM に移動 - プロジェクトを選択します。
- [Grant access] をクリックします。
-
[新しいプリンシパル] フィールドに、ユーザー ID を入力します。 これは通常、Google アカウントのメールアドレスです。
- [**ロールを選択**] をクリックし、ロールを検索します。
- 追加のロールを付与するには、 [Add another role] をクリックして各ロールを追加します。
- [保存] をクリックします。
-
Cloud Shell を設定する
-
コンソールで Cloud Shell をアクティブにします。 Google Cloud
Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。セッションが初期化されるまで数秒かかることがあります。
- デフォルト プロジェクトを設定します。
gcloud config set project PROJECT_IDPROJECT_IDは、実際のプロジェクト ID に置き換えます。
環境を設定する
このセクションでは、環境変数を準備し、サンプル リポジトリのクローンを作成します。
プロジェクト、クラスタ名、ゾーンの環境変数を設定します。
export PROJECT_ID=PROJECT_ID export KUBERNETES_CLUSTER_PREFIX=backup-gke-migration export TARGET_CLUSTER_PREFIX=restore-gke-migration export ZONE=us-central1-aPROJECT_IDは、実際の Google Cloud プロジェクト ID に置き換えます。サンプルコード リポジトリのクローンを作成し、ディレクトリに移動します。
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/databases/backup-migration
ソース GKE クラスタを作成する
N2 マシンタイプと接続された Persistent Disk ボリュームを使用するノードプールを使用して、ゾーンクラスタを作成します。
クラスタを作成します。
gcloud container clusters create ${KUBERNETES_CLUSTER_PREFIX}-cluster \ --location ${ZONE} \ --node-locations ${ZONE} \ --shielded-secure-boot \ --shielded-integrity-monitoring \ --machine-type "e2-micro" \ --num-nodes "1"ソース ワークロードに
n2-standard-4マシンタイプを使用してノードプールを作成します。gcloud container node-pools create regular-pool \ --cluster ${KUBERNETES_CLUSTER_PREFIX}-cluster \ --machine-type n2-standard-4 \ --zone ${ZONE} \ --num-nodes 1ソースクラスタで Backup for GKE アドオンを有効にします。
gcloud container clusters update ${KUBERNETES_CLUSTER_PREFIX}-cluster \ --project=${PROJECT_ID} \ --location=${ZONE} \ --update-addons=BackupRestore=ENABLEDクラスタの認証情報を取得します。
gcloud container clusters get-credentials ${KUBERNETES_CLUSTER_PREFIX}-cluster --zone ${ZONE}Backup for GKE エージェントが有効になっていることを確認します。
gcloud container clusters describe ${KUBERNETES_CLUSTER_PREFIX}-cluster \ --project=${PROJECT_ID} \ --location=${ZONE}出力は次のようになり、バックアップ エージェントが有効になっていることを確認できます。
addonsConfig: gkeBackupAgentConfig: enabled: true
サンプルデータを使用して MySQL をデプロイする
本番環境をシミュレートするために、別々の Namespace に 2 つの MySQL データベースをデプロイします。
namespace-aNamespace とnamespace-bNamespace を作成します。kubectl create namespace namespace-a kubectl create namespace namespace-bnamespace-aとnamespace-bに MySQL ワークロードをデプロイします。mysql-a-deployment.yamlファイルをデプロイします。kubectl apply -f manifests/02-mysql/mysql-a-deployment.yaml -n namespace-a次のマニフェストは、
regular-poolノードに動的にプロビジョニングされた Persistent Disk SSD ディスクを使用して、namespace-aに MySQL Pod を作成します。root パスワードはmigrationに設定されています。mysql-b-deployment.yamlファイルをデプロイします。kubectl apply -f manifests/02-mysql/mysql-b-deployment.yaml -n namespace-b次のマニフェストは、
regular-poolノードに動的にプロビジョニングされた Persistent Disk SSD ディスクを使用して、namespace-bに MySQL Pod を作成します。root パスワードはmigrationに設定されています。
MySQL クライアント Pod をデプロイして、サンプル データセットをアップロードします。
kubectl apply -f manifests/02-mysql/mysql-client.yaml kubectl wait pods mysql-client --for condition=Ready --timeout=300s次のマニフェストは、MySQL クライアント Pod をデプロイします。
クライアント Pod に接続します。
kubectl exec -it mysql-client -- bashPod 内で、Sakila と World のサンプル データセットをダウンロードします。
curl --output dataset.tgz "https://downloads.mysql.com/docs/sakila-db.tar.gz" tar -xvzf dataset.tgz -C ./ curl --output world-db.tar.gz "https://downloads.mysql.com/docs/world-db.tar.gz" tar xvzf world-db.tar.gz -C ./Sakila データセットを
mysql-aデータベースにインポートします。mysql -u root -h mysql-a.namespace-a -p # Enter password: migration SOURCE /sakila-db/sakila-schema.sql; SOURCE /sakila-db/sakila-data.sql;インポートした Sakila データを確認します。
USE sakila; SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'sakila';MySQL を終了します。
exitWorld データセットを
mysql-bデータベースにインポートします。mysql -u root -h mysql-b.namespace-b -p # Enter password: migration SOURCE /world-db/world.sql;インポートした World データを確認します。
USE world; SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'world';出力は次のようになります。
+-----------------+------------+ | table_name | table_rows | +-----------------+------------+ | city | 4079 | | country | 239 | | countrylanguage | 984 | +-----------------+------------+MySQL を終了します。
exitクライアント Pod シェルを終了します。
exit
GKE クラスタをバックアップする
シークレットやボリュームなど、クラスタ全体をバックアップします。
バックアップ プランを作成します。
gcloud beta container backup-restore backup-plans create main-plan \ --project=${PROJECT_ID} \ --location=us-central1 \ --cluster=projects/${PROJECT_ID}/locations/${ZONE}/clusters/${KUBERNETES_CLUSTER_PREFIX}-cluster \ --selected-namespaces=namespace-a,namespace-b,default \ --include-secrets \ --include-volume-data \ --target-rpo-minutes=1440 \ --backup-retain-days=7 \ --backup-delete-lock-days=3 \ --locked--selected-namespaces: システム リソースとの競合を避けるために、特定の Namespace をバックアップします。--include-volume-data: Persistent Disk データがバックアップされるようにします。--target-rpo-minutes: 目標復旧時点(RPO)に基づくバックアップ スケジュールを構成します。RPO は、データが失われる可能性のある最大許容時間枠であり、バックアップの頻度を決定します。1440分(1 日)の場合、バックアップは毎日実行されるようにスケジュールされます。
バックアップを作成します。
gcloud beta container backup-restore backups create first-backup \ --project=${PROJECT_ID} \ --location=us-central1 \ --backup-plan=main-plan \ --wait-for-completion出力に
Backup state: SUCCEEDEDと表示されるまで待ちます。バックアップが作成されていることを確認します。
gcloud beta container backup-restore backups list \ --project=${PROJECT_ID} \ --location=us-central1 \ --backup-plan=main-plan
Hyperdisk 変換で復元する
新しいクラスタにバックアップを復元します。復元により、ストレージが Persistent Disk から Hyperdisk に変換され、ワークロードが N4 ノードに移動します。
N4 ノードにターゲット GKE クラスタを作成します。
gcloud container clusters create ${TARGET_CLUSTER_PREFIX}-cluster \ --location ${ZONE} \ --node-locations ${ZONE} \ --shielded-secure-boot \ --shielded-integrity-monitoring \ --machine-type "e2-micro" \ --num-nodes "1"Hyperdisk に必要な
n4-standard-4マシンタイプを使用してノードプールを作成します。gcloud container node-pools create hyperdisk-pool \ --cluster ${TARGET_CLUSTER_PREFIX}-cluster \ --machine-type n4-standard-4 \ --zone ${ZONE} \ --num-nodes 1ターゲット クラスタの認証情報を取得します。
gcloud container clusters get-credentials ${TARGET_CLUSTER_PREFIX}-cluster --zone ${ZONE}balanced-storageという名前の HyperdiskStorageClassを適用します。kubectl apply -f manifests/01-storage-class/storage-class-hdb.yaml次のマニフェストは、Hyperdisk
StorageClassを定義します。manifests/03-transformation-rule/volume.yamlファイルで変換ルールを確認します。このファイルでは、復元中にリソースがどのように変更されるかを定義します。- PVC 変換:
storageClassNameをbalanced-storage(Hyperdisk)に変更します。 - Deployment 変換: ノード アフィニティを更新して、
n4-standard-4ノードで Pod をスケジュールします。
- PVC 変換:
これらの変換ルールを使用して復元プランを作成します。
gcloud beta container backup-restore restore-plans create main-restore \ --project=${PROJECT_ID} \ --location=us-central1 \ --backup-plan=projects/${PROJECT_ID}/locations/us-central1/backupPlans/main-plan \ --cluster=projects/${PROJECT_ID}/locations/${ZONE}/clusters/${TARGET_CLUSTER_PREFIX}-cluster \ --namespaced-resource-restore-mode=merge-replace-on-conflict \ --all-namespaces \ --cluster-resource-conflict-policy=use-existing-version \ --cluster-resource-scope-selected-group-kinds=cluster-resource-scope-all-group-kinds \ --volume-data-restore-policy=restore-volume-data-from-backup \ --transformation-rules-file=manifests/03-transformation-rule/volume.yaml復元を実行します。
gcloud beta container backup-restore restores create first-restore \ --project=${PROJECT_ID} \ --location=us-central1 \ --restore-plan=main-restore \ --backup=projects/${PROJECT_ID}/locations/us-central1/backupPlans/main-plan/backups/first-backup
移行を確認する
新しいクラスタでアプリケーションが実行され、データが破損していないことを確認します。
Pod が実行されているかどうかを確認します。
kubectl get pods -A新しいクラスタの MySQL クライアント Pod に接続します。
# Verify that the client Pod is running kubectl apply -f manifests/02-mysql/mysql-client.yaml kubectl wait pods mysql-client --for condition=Ready --timeout=300s kubectl exec -it mysql-client -- bashnamespace-aで復元された Sakila データベースを確認します。mysql -u root -h mysql-a.namespace-a -p # Password: migration USE sakila; SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'sakila';namespace-bで復元された World データベースを確認します。mysql -u root -h mysql-b.namespace-b -p # Password: migration USE world; SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'world';
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
GKE クラスタを削除します。
gcloud container clusters delete ${KUBERNETES_CLUSTER_PREFIX}-cluster --location ${ZONE} --quiet gcloud container clusters delete ${TARGET_CLUSTER_PREFIX}-cluster --location ${ZONE} --quietバックアップ プランと復元プランを削除します。
# Delete the restore plan gcloud beta container backup-restore restore-plans delete main-restore \ --project=${PROJECT_ID} \ --location=us-central1 \ --quiet # Delete the Backup gcloud beta container backup-restore backups delete first-backup \ --project=${PROJECT_ID} \ --location=us-central1 \ --backup-plan=main-plan \ --quiet # Delete the backup plan gcloud beta container backup-restore backup-plans delete main-plan \ --project=${PROJECT_ID} \ --location=us-central1 \ --quiet
次のステップ
- Backup for GKE の詳細を確認する。
- Hyperdisk ストレージ プールについて確認する。