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

このチュートリアルでは、MySQL データベースを使用して、単一レプリカの WordPress デプロイを Google Kubernetes Engine(GKE)に設定する方法について説明します。MySQL をインストールする代わりに、MySQL のマネージド バージョンを提供する Cloud SQL を使用します。WordPress では、PersistentVolumes(PV)PersistentVolumeClaimsPVC を使用してデータを保存します。

PV は、クラスタに管理者または Kubernetes がプロビジョニングするストレージ ボリュームで、PVC のリクエストを処理するために使用されます。PVC は、ユーザーが特定のストレージ クラスのストレージに対して行ったリクエストで、PV で処理されます。PV と PVC はポッドのライフサイクルから独立しています。再起動、再スケジューリング、ポッドの削除後もデータを保持します。WordPress は、PVs をサポートするストレージとして Google Persistent Disk を使用します。

背景

WordPress は、ブログ記事とそれに関連するオブジェクト、メタデータをリレーショナル データベースに格納し、ブログに投稿する画像などのアセットをローカル ファイル システムに保存するブログツールです。このチュートリアルでは、Docker Hub にある公式の WordPress Docker イメージを使用します。

通常、コンテナのルートファイル システムは永続データの保存に適していません。通常、GKE で実行するコンテナは廃棄可能なエンティティであり、ノードの障害やその他の原因によって使用できなくなったコンテナは、クラスタ マネージャーによって削除、強制排除、再スケジュールされる可能性があります。ノードに障害が発生すると、コンテナのルート ファイルシステムに保存されたすべてのデータは失われます。

Persistent Disk を基盤とする PV を使用すると、WordPress プラットフォームのデータをコンテナの外部に保存できます。この方法を使用すると、たとえコンテナが削除されても、そのデータは保持されます。デフォルトのストレージ クラスの場合、ポッドが別のノードに再スケジューリングされても、Persistent Disk(ここではユーザーのデータ)はポッドと一緒に移動しません。データの移動を処理する方法はいくつかありますが、このチュートリアルでは説明しません。詳しくは、Persistent Disk を使用する永続ボリュームをご覧ください。

WordPress では、PV にデータを保存する必要があります。このチュートリアルでは、デフォルトのストレージ クラスを使用して、Google Persistent Disk を動的に作成し、デプロイ用の PVC を作成します。

目標

  • GKE クラスタを作成する。
  • Persistent Disk を基盤とする PV と PVC を作成する。
  • Cloud SQL for MySQL インスタンスを作成する。
  • WordPress をデプロイする。
  • WordPress ブログを設定する。

費用

このチュートリアルでは、課金対象である次の Google Cloud コンポーネントを使用します。

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

このチュートリアルを終了した後、作成したリソースを削除すると、それ以上の請求は発生しません。詳しくは、クリーンアップをご覧ください。

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

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

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

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

  4. Cloud Console で、Cloud Shell をアクティブにします。

    Cloud Shell をアクティブにする

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

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

環境設定

  1. Cloud Shell で、gcloud コマンドライン ツールのデフォルト ゾーンを設定します。

    gcloud config set compute/zone zone
    

    以下を置き換えます。

    • zone: 最も近いゾーンを選択します。詳細については、地域とリージョンをご覧ください。
  2. GitHub リポジトリからアプリのマニフェスト ファイルをダウンロードします。

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

    cd kubernetes-engine-samples/wordpress-persistent-disks
    
  4. WORKING_DIR 環境変数を設定します。

    WORKING_DIR=$(pwd)
    

    このチュートリアルでは、YAML 形式のマニフェスト ファイルを使用して Kubernetes オブジェクトを作成します。

GKE クラスタを作成する

WordPress アプリコンテナをホストする GKE クラスタを作成します。

  • Cloud Shell で、3 つのノードを持つクラスタを persistent-disk-tutorial という名前で作成します。

    CLUSTER_NAME=persistent-disk-tutorial
    gcloud container clusters create $CLUSTER_NAME \
        --num-nodes=3 --enable-autoupgrade --no-enable-basic-auth \
        --no-issue-client-certificate --enable-ip-alias --metadata \
        disable-legacy-endpoints=true
    

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 秒ほどかかります。

    このプロセスが完了すると、次のような出力が生成されます。

    NAME                    STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    wordpress-volumeclaim   Bound     pvc-89d49350-3c44-11e8-80a6-42010a800002   200G       RWO            standard       5s
    

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 というデータベース ユーザーとパスワードを作成します。このパスワードは、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 シークレットを作成します。データベースの認証情報を保持する別のシークレットを作成します。

サービス アカウントを構成してシークレットを作成する

  1. Cloud SQL Proxy を介した MySQL インスタンスへのアクセスを WordPress アプリに許可するには、サービス アカウントを作成します。

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

    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 インスタンスを含むコンテナを実行する単一のポッドを作成するデプロイが記述されています。このコンテナは、作成した cloudsql-db-credentials を含む WORDPRESS_DB_PASSWORD 環境変数を読み取ります。

このマニフェスト ファイルには、サイドカー コンテナで実行される Cloud SQL Proxy 経由で MySQL と通信を行うように WordPress コンテナが構成されています。ホストアドレスの値は WORDPRESS_DB_HOST 環境変数で設定されます。

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

    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
    

    出力に次のステータスが表示されたら、以下の手順に進みます。

    NAME                     READY     STATUS    RESTARTS   AGE
    wordpress-387015-02xxb   2/2       Running   0          9h
    

WordPress サービスを公開する

前のステップで WordPress コンテナをデプロイしましたが、外部 IP アドレスを設定していないので、クラスタの外部からアクセスすることはできません。ロードバランサを作成して構成することで、インターネットからのトラフィックに WordPress アプリを公開できます。

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

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

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

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

    kubectl get svc -l app=wordpress --watch
    
  3. 出力に外部 IP アドレスが表示されたら、次の手順に進みます。

    NAME        CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
    wordpress   10.51.243.233   203.0.113.3    80:32418/TCP   1m
    
  4. 後で必要になるので、IP アドレスはメモしておいてください。

WordPress ブログを設定する

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

  1. ブラウザで、次の URL に移動し、external-ip-addressを、WordPress インスタンスを公開するサービスの外部 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 Platform アカウントに課金されないようにする手順は次のとおりです。

プロジェクトの削除

  1. Cloud Console で [リソースの管理] ページに移動します。

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

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

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

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

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

    kubectl delete service wordpress
    

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

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

    watch gcloud compute forwarding-rules list
    

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

    Listed 0 items.
    
  2. デプロイを削除します。

    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 $DEVSHELL_PROJECT_ID \
        --role roles/cloudsql.client \
        --member serviceAccount:$SA_EMAIL
    
  7. サービス アカウントを削除します。

    gcloud iam service-accounts delete $SA_EMAIL
    

次のステップ