このチュートリアルでは、Backup for GKE を使用して、GKE のステートフル アプリケーションを、Persistent Disk ボリュームがアタッチされた N2 などの古い世代のマシンタイプから、Hyperdisk ボリュームがアタッチされた N4 などの新しい世代のマシンタイプに移行する方法について説明します。Hyperdisk をサポートするマシンタイプの詳細については、Compute Engine のドキュメントをご覧ください。
このチュートリアルでは、移行を説明するために、Sakila データベースと World データベースを使用してサンプル データセットを提供します。Sakila は、MySQL が提供するサンプル データベースで、架空の DVD レンタルショップを表しています。World データベースには、国と都市に関するデータが含まれています。このチュートリアルでは、複雑なマルチテナント環境をシミュレートするために、別々の Namespace で 2 つの異なるデータセットを使用します。
このチュートリアルは、ストレージの作成と割り当てを行い、データ セキュリティとデータアクセスを管理するストレージ スペシャリストとストレージ管理者を対象としています。 Google Cloudのコンテンツで使用されている一般的なロールとタスクの例の詳細については、一般的な GKE ユーザーのロールとタスクをご覧ください。
デプロイ アーキテクチャ
次の図は、Backup for GKE を使用して、ステートフル MySQL ワークロードを N2 マシンタイプの Persistent Disk から N4 マシンタイプの Hyperdisk に移行するプロセスを示しています。
- 移行元クラスタ: 2 つの MySQL Deployment が、N2 マシンシリーズのノードプール上の別々の Namespace(
namespace-aとnamespace-b)に存在します。これらのデプロイでは、データ ストレージに SSD 永続ディスクを使用します。 - バックアップ戦略: クラスタで Backup for GKE エージェントを有効にし、バックアップ プランを作成して、Namespace、ボリュームデータ、シークレットをキャプチャします。次に、手動バックアップを実行して、ポイントインタイム リカバリ ポイントを作成します。
- 変換と復元: 変換ルールを使用して復元プランを定義し、移行先の環境のリソースを適応させます。これらのルールは次の処理を行います。
StorageClassをpremium-rwo(PD)からbalanced-storageという名前の Hyperdisk ストレージ クラスにスワップします。- Pod アフィニティ ルールを変更して、復元されたワークロードが新しい N4 ノードプールにスケジュールされるようにします。
- 移行先の環境: N4 マシンタイプを使用して新しい GKE クラスタをプロビジョニングします。復元プロセスでは、バックアップからディスクが Hyperdisk ボリュームとして再作成され、MySQL インスタンスが互換性のある N4 ノードにデプロイされます。
目標
このチュートリアルでは、次の方法について学習します。
- バックアップ用に GKE ステートフル アプリケーションを準備します。
- Backup for GKE アドオンを有効にします。
- バックアップ プランを作成し、ソース クラスタをバックアップします。
- 変換ルールを使用してストレージを Hyperdisk に移行する復元プランを作成します。
- ワークロードを新しいクラスタに復元し、データを確認します。
費用
このドキュメントでは、課金対象である次の Google Cloudコンポーネントを使用します。
- GKE
- Compute Engine (Persistent Disk and Hyperdisk)
- Backup for GKE
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
- Google Cloud アカウントにログインします。 Google Cloudを初めて使用する場合は、 アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $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
ロールを確認する
-
Google Cloud コンソールで、[IAM] ページに移動します。
IAM に移動 - プロジェクトを選択します。
-
[プリンシパル] 列で、自分または自分が所属するグループの行をすべて確認します。所属するグループについては、管理者にお問い合わせください。
- 自分のメールアドレスを含む行の [ロール] 列で、ロールのリストに必要なロールが含まれているかどうか確認します。
ロールを付与する
-
Google Cloud コンソールで、[IAM] ページに移動します。
IAM に移動 - プロジェクトを選択します。
- [ アクセスを許可] をクリックします。
-
[新しいプリンシパル] フィールドに、ユーザー ID を入力します。 これは通常、Google アカウントのメールアドレスです。
- [ロールを選択] をクリックし、ロールを検索します。
- 追加のロールを付与するには、 [別のロールを追加] をクリックして各ロールを追加します。
- [保存] をクリックします。
-
Cloud Shell を設定する
-
Google Cloud コンソールで Cloud Shell をアクティブにします。
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)に変更します。 - デプロイの変換: ノード アフィニティを更新して、
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 ストレージ プールについて確認する。