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 を作成します。

環境設定

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

    gcloud config set compute/region region
    

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

  2. PROJECT_ID 環境変数 Google 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 --location 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