このチュートリアルでは、MySQL データベースを使用して、単一レプリカの WordPress デプロイを Google Kubernetes Engine(GKE)に設定する方法について説明します。MySQL をインストールする代わりに、MySQL のマネージド バージョンを提供する Cloud SQL を使用します。WordPress では、PersistentVolumes
(PV)と PersistentVolumeClaims
(PVC) を使用してデータを保存します。
PV は、クラスタに管理者または Kubernetes がプロビジョニングするストレージ ボリュームで、PVC のリクエストを処理するために使用されます。PVC は、ユーザーが特定のストレージ クラスのストレージに対して行ったリクエストで、PV で処理されます。PV と PVC は Pod のライフサイクルから独立しています。Pod の再起動、再スケジューリング、削除後もデータを保持します。WordPress は、Persistent Disk を PV をサポートするストレージとして使用します。
背景
WordPress は、ブログ記事とそれに関連するオブジェクト、メタデータをリレーショナル データベースに格納し、ブログに投稿する画像などのアセットをローカル ファイル システムに保存するブログツールです。このチュートリアルでは、Docker Hub にある公式の WordPress Docker イメージを使用します。
通常、コンテナのルートファイル システムは永続データの保存に適していません。通常、GKE で実行するコンテナは廃棄可能なエンティティであり、ノードの障害やその他の原因によって使用できなくなったコンテナは、クラスタ マネージャーによって削除、強制排除、再スケジュールされる可能性があります。ノードに障害が発生すると、コンテナのルート ファイルシステムに保存されたすべてのデータは失われます。
Persistent Disk を基盤とする PV を使用すると、WordPress プラットフォームのデータをコンテナの外部に保存できます。この方法を使用すると、たとえコンテナが削除されても、そのデータは保持されます。デフォルトのストレージ クラスでは、Pod が別のノードに再スケジューリングされても、Persistent Disk(ここではユーザーのデータ)は Pod と一緒に移動されません。データの移動を処理する方法はいくつかありますが、このチュートリアルでは説明しません。詳しくは、Persistent Disk を使用する永続ボリュームをご覧ください。
WordPress では、PV にデータを保存する必要があります。このチュートリアルでは、デフォルトのストレージ クラスを使用して、Persistent Disk を動的に作成し、デプロイ用の PVC を作成します。
目標
- GKE クラスタを作成する。
- Persistent Disk を基盤とする PV と PVC を作成する。
- Cloud SQL for MySQL インスタンスを作成する。
- WordPress をデプロイする。
- WordPress ブログを設定する。
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。
始める前に
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
- Cloud Shell で、GKE と Cloud SQL Admin API を有効にします。
gcloud services enable container.googleapis.com sqladmin.googleapis.com
環境設定
Cloud Shell で Google Cloud CLI のデフォルト リージョンを設定します。
gcloud config set compute/region region
次のように置き換えます。
region
: 最も近いリージョンを選択します。詳細については、リージョンとゾーンをご覧ください。
環境変数
PROJECT_ID
に Google Cloud プロジェクト ID(project-id)を設定します。export PROJECT_ID=project-id
GitHub リポジトリからアプリ マニフェスト ファイルをダウンロードします。
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
wordpress-persistent-disks
ファイルのあるディレクトリに変更します。cd kubernetes-engine-samples/quickstarts/wordpress-persistent-disks
WORKING_DIR
環境変数を設定します。WORKING_DIR=$(pwd)
このチュートリアルでは、YAML 形式のマニフェスト ファイルを使用して Kubernetes オブジェクトを作成します。
GKE クラスタの作成
WordPress アプリコンテナをホストする GKE クラスタを作成します。
Cloud Shell で
persistent-disk-tutorial
という名前の GKE クラスタを作成します。CLUSTER_NAME=persistent-disk-tutorial gcloud container clusters create-auto $CLUSTER_NAME
作成した新しいクラスタに接続します。
gcloud container clusters get-credentials $CLUSTER_NAME --region REGION
Persistent Disk を基盤とする PV と PVC を作成する
WordPress に必要なストレージとして PVC を作成します。GKE にデフォルトでインストールされている StorageClass
リソースを使用すると、Persistent Disk を基盤とする PV を動的にプロビジョニングできます。wordpress-volumeclaim.yaml
ファイルを使用して、デプロイに必要な PVC を作成します。
このマニフェスト ファイルには、200 GB のストレージを必要とする PVC が記述されています。このファイルで StorageClass
リソースが定義されていないため、この PVC はデフォルトの StorageClass
リソースを使用して、Persistent Disk を基盤とする PV をプロビジョニングします。
Cloud Shell で、マニフェスト ファイルをデプロイします。
kubectl apply -f $WORKING_DIR/wordpress-volumeclaim.yaml
Persistent Disk を基盤とする PV をプロビジョニングし、PVC にバインドするまでに 10 秒ほどかかります。次のコマンドを使用してステータスを確認できます。
kubectl get persistentvolumeclaim
出力には、次のようなステータスが
Pending
の PersistentVolumeClaim が示されます。NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE wordpress-volumeclaim Pending standard-rwo 5s
この PersistentVolumeClaim は、このチュートリアルの後の部分で使用するまで
Pending
状態のままになります。
Cloud SQL for MySQL インスタンスを作成する
Cloud Shell で、
mysql-wordpress-instance
という名前のインスタンスを作成します。INSTANCE_NAME=mysql-wordpress-instance gcloud sql instances create $INSTANCE_NAME
環境変数にインスタンス接続名を追加します。
export INSTANCE_CONNECTION_NAME=$(gcloud sql instances describe $INSTANCE_NAME \ --format='value(connectionName)')
WordPress のデータを保存するデータベースを作成します。
gcloud sql databases create wordpress --instance $INSTANCE_NAME
wordpress
というデータベース ユーザーとパスワードを作成します。このパスワードは、WordPress でインスタンスの認証を行うときに必要になります。CLOUD_SQL_PASSWORD=$(openssl rand -base64 18) gcloud sql users create wordpress --host=% --instance $INSTANCE_NAME \ --password $CLOUD_SQL_PASSWORD
Cloud Shell セッションを閉じると、パスワードが失われます。パスワードは後で必要になるため、メモしておいてください。
これで、新しい WordPress ブログ用のデータベースの設定が完了しました。
WordPress をデプロイする
WordPress をデプロイする前に、サービス アカウントを作成する必要があります。サービス アカウントの認証情報を保持する Kubernetes Secret を作成します。データベースの認証情報を保持する別の Secret を作成します。
サービス アカウントを構成して Secret を作成する
WordPress アプリが Cloud SQL Proxy を介して MySQL インスタンスにアクセスできるようにするには、サービス アカウントを作成します。
SA_NAME=cloudsql-proxy gcloud iam service-accounts create $SA_NAME --display-name $SA_NAME
サービス アカウントのメールアドレスを環境変数として追加します。
SA_EMAIL=$(gcloud iam service-accounts list \ --filter=displayName:$SA_NAME \ --format='value(email)')
サービス アカウントに
cloudsql.client
ロールを追加します。gcloud projects add-iam-policy-binding $PROJECT_ID \ --role roles/cloudsql.client \ --member serviceAccount:$SA_EMAIL
サービス アカウントのキーを作成します。
gcloud iam service-accounts keys create $WORKING_DIR/key.json \ --iam-account $SA_EMAIL
次のコマンドを実行して、
key.json
ファイルのコピーをダウンロードします。MySQL 認証情報に Kubernetes Secret を作成します。
kubectl create secret generic cloudsql-db-credentials \ --from-literal username=wordpress \ --from-literal password=$CLOUD_SQL_PASSWORD
サービス アカウントの認証情報に Kubernetes Secret を作成します。
kubectl create secret generic cloudsql-instance-credentials \ --from-file $WORKING_DIR/key.json
WordPress をデプロイする
次のステップでは、WordPress コンテナを GKE クラスタにデプロイします。
wordpress_cloudsql.yaml
マニフェスト ファイルには、WordPress インスタンスを含むコンテナを実行する単一の Pod を作成する Deployment が記述されています。このコンテナは、作成した cloudsql-db-credentials
を含む WORDPRESS_DB_PASSWORD
環境変数を読み取ります。
このマニフェスト ファイルには、サイドカー コンテナで実行される Cloud SQL Proxy 経由で MySQL と通信を行うように WordPress コンテナが構成されています。ホストアドレスの値は WORDPRESS_DB_HOST
環境変数で設定されます。
INSTANCE_CONNECTION_NAME
環境変数を置き換えてファイルを準備します。cat $WORKING_DIR/wordpress_cloudsql.yaml.template | envsubst > \ $WORKING_DIR/wordpress_cloudsql.yaml
wordpress_cloudsql.yaml
マニフェスト ファイルをデプロイします。kubectl create -f $WORKING_DIR/wordpress_cloudsql.yaml
Persistent Disk がコンピューティング ノードに接続される場合、このマニフェスト ファイルのデプロイに数分かかります。
デプロイのステータスが
running
に変わるのを待ちます。kubectl get pod -l app=wordpress --watch
出力に
Running
のステータスが示されたら、次のステップに進むことができます。NAME READY STATUS RESTARTS AGE wordpress-387015-02xxb 2/2 Running 0 2m47s
WordPress サービスを公開する
前のステップで WordPress コンテナをデプロイしましたが、外部 IP アドレスを設定していないので、クラスタの外部からアクセスすることはできません。接続されている外部ロードバランサを使用して Kubernetes Service を作成および構成することで、WordPress アプリをインターネットからのトラフィックに公開できます。GKE で Service を使用してアプリを公開する方法については、入門ガイドをご覧ください。
type:LoadBalancer
の Service を作成します。kubectl create -f $WORKING_DIR/wordpress-service.yaml
ロードバランサの作成には数分かかります。
デプロイを監視し、サービスに外部 IP アドレスが割り当てられるまで待ちます。
kubectl get svc -l app=wordpress --watch
出力に外部 IP アドレスが表示されたら、次の手順に進みます。外部 IP は次の例とは異なるため、注意が必要です。
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE wordpress 10.51.243.233 203.0.113.3 80:32418/TCP 1m
後で使用できるように、
EXTERNAL_IP
アドレス フィールドをメモしておきます。
WordPress ブログを設定する
このセクションでは、WordPress ブログを設定します。
ブラウザで次の URL にアクセスします。external-ip-address は、WordPress インスタンスを公開するサービスの
EXTERNAL_IP
アドレスに置き換えます。http://external-ip-address
WordPress のインストール ページで言語を選択して、[Continue] をクリックします。
[Information needed] ページで必要な情報を入力し、[Install WordPress] をクリックします。
[Log In] をクリックします。
以前に作成したユーザー名とパスワードを入力します。
ブログサイトが作成されます。ブログにアクセスするには、ブラウザで次の URL にアクセスします。
http://external-ip-address
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
プロジェクトの削除
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
個々のリソースを削除する
既存のプロジェクトを削除しない場合は、リソースを個別に削除します。
サービスを削除します。
kubectl delete service wordpress
wordpress
Service にプロビジョニングされたロードバランサが削除されるまで待ちます。バックグラウンドでロードバランサが非同期的に削除されます。削除プロセスを確認します。
watch gcloud compute forwarding-rules list
ロードバランサが削除されると、次の出力が表示されます。
Listed 0 items.
Deployment を削除します。
kubectl delete deployment wordpress
WordPress の PVC を削除します。
kubectl delete pvc wordpress-volumeclaim
このコマンドを実行すると、PV と Persistent Disk も自動的に削除されます。
GKE クラスタを削除します。
gcloud container clusters delete $CLUSTER_NAME
Cloud SQL インスタンスを削除します。
gcloud sql instances delete $INSTANCE_NAME
サービス アカウントからロールを削除します。
gcloud projects remove-iam-policy-binding $PROJECT_ID \ --role roles/cloudsql.client \ --member serviceAccount:$SA_EMAIL
サービス アカウントを削除します。
gcloud iam service-accounts delete $SA_EMAIL
次のステップ
- アプリの静的 IP とドメイン名を構成する。
Google Cloud に関するリファレンス アーキテクチャ、図、ベスト プラクティスを確認する。Cloud アーキテクチャ センターをご覧ください。