Persistent Disk と Cloud SQL を使用して GKE に WordPress をデプロイする


このチュートリアルでは、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 の次の課金対象のコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。

始める前に

  1. 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.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. In the Google Cloud console, activate Cloud Shell.

    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.

  7. Cloud Shell で、GKE と Cloud SQL Admin API を有効にします。
    gcloud services enable container.googleapis.com sqladmin.googleapis.com
    

環境設定

  1. Cloud Shell で Google Cloud CLI のデフォルト リージョンを設定します。

    gcloud config set compute/region region
    

    次のように置き換えます。

  2. 環境変数 PROJECT_IDGoogle Cloud プロジェクト IDproject-id)を設定します。

    export PROJECT_ID=project-id
    

  3. GitHub リポジトリからアプリ マニフェスト ファイルをダウンロードします。

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    
  4. wordpress-persistent-disks ファイルのあるディレクトリに変更します。

    cd kubernetes-engine-samples/quickstarts/wordpress-persistent-disks
    
  5. 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 をプロビジョニングします。

  1. 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 インスタンスを作成する

  1. Cloud Shell で、mysql-wordpress-instance という名前のインスタンスを作成します。

    INSTANCE_NAME=mysql-wordpress-instance
    gcloud sql instances create $INSTANCE_NAME
    
  2. 環境変数にインスタンス接続名を追加します。

    export INSTANCE_CONNECTION_NAME=$(gcloud sql instances describe $INSTANCE_NAME \
        --format='value(connectionName)')
    
  3. WordPress のデータを保存するデータベースを作成します。

    gcloud sql databases create wordpress --instance $INSTANCE_NAME
    
  4. 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 を作成する

  1. WordPress アプリが Cloud SQL Proxy を介して MySQL インスタンスにアクセスできるようにするには、サービス アカウントを作成します。

    SA_NAME=cloudsql-proxy
    gcloud iam service-accounts create $SA_NAME --display-name $SA_NAME
    
  2. サービス アカウントのメールアドレスを環境変数として追加します。

    SA_EMAIL=$(gcloud iam service-accounts list \
        --filter=displayName:$SA_NAME \
        --format='value(email)')
    
  3. サービス アカウントに cloudsql.client ロールを追加します。

    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --role roles/cloudsql.client \
        --member serviceAccount:$SA_EMAIL
    
  4. サービス アカウントのキーを作成します。

    gcloud iam service-accounts keys create $WORKING_DIR/key.json \
        --iam-account $SA_EMAIL
    

    次のコマンドを実行して、key.json ファイルのコピーをダウンロードします。

  5. MySQL 認証情報に Kubernetes Secret を作成します。

    kubectl create secret generic cloudsql-db-credentials \
        --from-literal username=wordpress \
        --from-literal password=$CLOUD_SQL_PASSWORD
    
  6. サービス アカウントの認証情報に 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 環境変数で設定されます。

  1. INSTANCE_CONNECTION_NAME 環境変数を置き換えてファイルを準備します。

    cat $WORKING_DIR/wordpress_cloudsql.yaml.template | envsubst > \
        $WORKING_DIR/wordpress_cloudsql.yaml
    
  2. wordpress_cloudsql.yaml マニフェスト ファイルをデプロイします。

    kubectl create -f $WORKING_DIR/wordpress_cloudsql.yaml
    

    Persistent Disk がコンピューティング ノードに接続される場合、このマニフェスト ファイルのデプロイに数分かかります。

  3. デプロイのステータスが 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 を使用してアプリを公開する方法については、入門ガイドをご覧ください。

  1. type:LoadBalancerService を作成します。

    kubectl create -f $WORKING_DIR/wordpress-service.yaml
    

    ロードバランサの作成には数分かかります。

  2. デプロイを監視し、サービスに外部 IP アドレスが割り当てられるまで待ちます。

    kubectl get svc -l app=wordpress --watch
    
  3. 出力に外部 IP アドレスが表示されたら、次の手順に進みます。外部 IP は次の例とは異なるため、注意が必要です。

    NAME        CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
    wordpress   10.51.243.233   203.0.113.3    80:32418/TCP   1m
    
  4. 後で使用できるように、EXTERNAL_IP アドレス フィールドをメモしておきます。

WordPress ブログを設定する

このセクションでは、WordPress ブログを設定します。

  1. ブラウザで次の URL にアクセスします。external-ip-address は、WordPress インスタンスを公開するサービスの EXTERNAL_IP アドレスに置き換えます。

    http://external-ip-address
    
  2. WordPress のインストール ページで言語を選択して、[Continue] をクリックします。

  3. [Information needed] ページで必要な情報を入力し、[Install WordPress] をクリックします。

  4. [Log In] をクリックします。

  5. 以前に作成したユーザー名とパスワードを入力します。

  6. ブログサイトが作成されます。ブログにアクセスするには、ブラウザで次の URL にアクセスします。

    http://external-ip-address
    

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

プロジェクトの削除

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

個々のリソースを削除する

既存のプロジェクトを削除しない場合は、リソースを個別に削除します。

  1. サービスを削除します。

    kubectl delete service wordpress
    

    wordpress Service にプロビジョニングされたロードバランサが削除されるまで待ちます。バックグラウンドでロードバランサが非同期的に削除されます。

    削除プロセスを確認します。

    watch gcloud compute forwarding-rules list
    

    ロードバランサが削除されると、次の出力が表示されます。

    Listed 0 items.
    
  2. Deployment を削除します。

    kubectl delete deployment wordpress
    
  3. WordPress の PVC を削除します。

    kubectl delete pvc wordpress-volumeclaim
    

    このコマンドを実行すると、PV と Persistent Disk も自動的に削除されます。

  4. GKE クラスタを削除します。

    gcloud container clusters delete $CLUSTER_NAME
    
  5. Cloud SQL インスタンスを削除します。

    gcloud sql instances delete $INSTANCE_NAME
    
  6. サービス アカウントからロールを削除します。

    gcloud projects remove-iam-policy-binding $PROJECT_ID \
        --role roles/cloudsql.client \
        --member serviceAccount:$SA_EMAIL
    
  7. サービス アカウントを削除します。

    gcloud iam service-accounts delete $SA_EMAIL
    

次のステップ