開発日報

窓際エンジニアの開発備忘。日報は嘘です。

GKEチュートリアルやってみる その2 ~ GKEでWordPress ~

GKEチュートリアルやってみる ~ GKEでWordPress ~

概要

単一レプリカのWordPessデプロイをGKEにデプロイします。

MySQLの代わりにGCPのCloud SQLを使用します。また、コンテナの外部ストレージとしてPersistentVolumes(PV)と PersistentVolumeClaims(PVC)を使用してデータを保存します。

目標

事前準備

Cloud SDKもしくはCloudShellを使用できる状態にしておいてください。

※参考 : https://semigeek-dev.hatenablog.com/entry/2020/05/31/110307コマンドラインツールのインストールを行ってください。

以下のコマンドでGKE と Cloud SQL Admin API を有効にします。

gcloud services enable container.googleapis.com sqladmin.googleapis.com

環境設定

gcloud コマンドライン ツールのデフォルト ゾーンを設定します。

gcloud config set compute/zone asia-northeast1-a

Gitからアプリマニフェストファイルをダウンロードする

git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
cd kubernetes-engine-samples/wordpress-persistent-disks

WORKING_DIR 環境変数を設定します。

WORKING_DIR=$(pwd)

環境変数 PROJECT_ID に Google Cloud プロジェクト ID を設定します。

export PROJECT_ID=[PROJECT_ID]

GKE クラスタの作成

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

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 を作成する

kubectl apply -f $WORKING_DIR/wordpress-volumeclaim.yaml

Cloud SQL for MySQL インスタンスを作成する

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認証用のDBユーザーとパスワードを作成します。

CLOUD_SQL_PASSWORD=$(openssl rand -base64 18)

gcloud sql users create wordpress --host=% --instance $INSTANCE_NAME \
 --password $CLOUD_SQL_PASSWORD

サービスアカウントを構成して Secret を作成する

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

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

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

kubectl create secret generic cloudsql-db-credentials \
        --from-literal username=wordpress \
        --from-literal password=$CLOUD_SQL_PASSWORD

サービスアカウントの認証情報にKubernates Secret を作成します。

WordPress をデプロイする

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

cat $WORKING_DIR/wordpress_cloudsql.yaml.template | envsubst > \
        $WORKING_DIR/wordpress_cloudsql.yaml

wordpress_cloudsql.yaml マニフェスト ファイルをデプロイします。

kubectl create -f $WORKING_DIR/wordpress_cloudsql.yaml

デプロイのステータスが running に変わるのを待ちます。

kubectl get pod -l app=wordpress --watch

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

WordPress サービスを公開する

サービスを作成します。ロードバランサーの作成とグローバルIPの割り当てが行われます。

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

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

kubectl get svc -l app=wordpress --watch

------------------------------------
NAME        CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
wordpress   XX.XX.XXX.XXX   XXX.X.XXX.X    80:32418/TCP   1m