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. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  4. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  5. Google Cloud プロジェクトで課金が有効になっていることを確認します

  6. Google Cloud コンソールで、「Cloud Shell をアクティブにする」をクリックします。

    Cloud Shell をアクティブにする

    Google Cloud コンソールの下部で Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。Cloud Shell はシェル環境です。Google Cloud CLI がすでにインストールされており、現在のプロジェクトの値もすでに設定されています。セッションが初期化されるまで数秒かかることがあります。

  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 シークレットを作成します。

    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. Google Cloud コンソールで、[リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

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

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

  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
    

次のステップ