【Docker】Kubernetes(GKE)でMySQLをデプロイしてみる

docker

こんにちは!オオイシです。

過日「DockerComposeでWordpressをGCP上に構築しよう!」と試みましたが、どうやら、DockerComposeは対応していないことを知りました。。。

GCPではDocker + Kubernetes(GKE)を使うのが正しいやり方のようです。

そこで、Google Cloud のチュートリアルのWordPress と MySQL での永続ディスクの使用をベースにWordPressを構築することにしました。

今回は、MySQL部分のみ作成してみます。

MYSQLをGKE上に構築する手順

Kubernetes クラスタを作成する

はじめに、k8sをgcloudコマンドで使うためのコンポーネントを事前にインストールしておきます。

k8sコンポーネントをインストール:


$ gcloud components install kubectl

git でgoogle が公開しているサンプルコードをclone。

git clone:


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

ファイルの中身の説明は後述するとして、まずは、構築を進めていきます。

Kubernetes Engineクラスタを作成

はじめにGKEクラスタを作成します。

今回は、

  • node数=3
  • machine-type = g1-small
  • zone = asia-northeast1-b

としました。

k8sクラスタ作成:


$ gcloud container clusters create hello \
--num-nodes=3 \
--machine-type=g1-small \
--zone=asia-northeast1-b

しばらくすると、GKEクラスタが作成されたことが確認できます。

クラスタ一覧 :


$ gcloud container clusters list
NAME   LOCATION           MASTER_VERSION  MASTER_IP    MACHINE_TYPE   NODE_VERSION  NUM_NODES  STATUS
hello  asia-northeast1-b  1.9.7-gke.6     35.221.98.1  n1-standard-1  1.9.7-gke.6   3          RUNNING

とすることで確認もできます。

GCPコンソール→GKE→GKEクラスタ からも確認できます。

マシンタイプとゾーンを調べる

$ gcloud compute machine-types list

永続ディスク(Persistent Disk)を作成する

MySQLのDBデータを保存する場所作成します。

なぜ、作成するのかというと、Dockerコンテナを破棄するとデータも削除されるため、永続的なデータの保管場所は別途作成する必要あるためです。

コンテナはスケールアップしたりダウンさせたりを繰り返すので、ステートレス(状態を持たない)な設計を意識しましょう。

永続ディスクを作成:


$ gcloud compute disks create --size 10GB mysql-disk

作成状態を確認します。

ディスクの一覧:


$ gcloud compute disks list
NAME ZONE SIZE_GB TYPE STATUS
〜〜 省略 〜〜
mysql-disk asia-northeast1-b 10 pd-standard READY

GCEのコンソールからはこのように確認できます。

 

MySQL をセットアップする

MySQLのデータベースのパスワードが漏れないようにシークレットに保存します。

Kubernetes のシークレットは、機密情報を暗号化して保存する仕組みで、環境変数から参照できます。

シークレット作成:

$ kubectl create secret generic mysql \
--from-literal=password=任意のパスワード

GCPコンソール → GKE → 設定 から確認できます。

MySQLのデプロイメント用のマニフェストファイルを確認します。

mysql.yaml:

apiVersion: extensions/v1beta1 # Deploymentのyamlの定義ver
kind: Deployment # ReplicaSetを生成するためのデプロイ定義
metadata:
  name: mysql # このマニフェストのユニークな名前
  labels:
    app: mysql
spec:
  replicas: 1 # Podの数
  selector:
    matchLabels:
      app: mysql # ReplicaSetが選択するPod(任意)
  # Podのテンプレート(PodTemplate)
  template:
    metadata:
      labels:
        app: mysql # Podの名前。通常は1つ。
    spec:
      # Dockerコンテナの情報
      containers:
        - image: mysql:5.6
          name: mysql
          env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef: # シークレットで設定したパスワード
                  name: mysql
                  key: password
          ports:
            - containerPort: 3306
              name: mysql
          volumeMounts:
            - name: mysql-persistent-storage # 永続ディスクのマウント先
              mountPath: /var/lib/mysql
      volumes: 
        - name: mysql-persistent-storage # 永続ディスク
          gcePersistentDisk:
            pdName: mysql-disk
            fsType: ext4

このマニフェストファイルを使ってデプロイします。

Deploymentをデプロイ:


$ kubectl create -f mysql.yaml
deployment.extensions "mysql" created

Podが実行されていることを確認します。

Podを確認:


$ kubectl get pod -l app=mysql
NAME READY STATUS RESTARTS AGE
mysql-7bfbdc45b7-ljrsn 0/1 ContainerCreating 0 12s
RLSUU098522M01:wordpress-persistent-disks ooishimakoto$ kubectl get pod -l app=mysql
NAME READY STATUS RESTARTS AGE
mysql-7bfbdc45b7-ljrsn 1/1 Running 0 1m

STATUS が Running になればデプロイ完了。

GCPの場合はデータベースにCloudSQLを使う方法もあります。

MySQLサービスを作成

MySQLは実行しましたが、アクセスするための入り口が必要です。

後に作成するWordPressからMySQLへアクセスするためのサービスを作成します。

mysql-service.yaml:


apiVersion: v1 # Serviceのyaml定義ver
kind: Service
metadata:
name: mysql
labels:
app: mysql
spec:
type: ClusterIP # 内部的に使う(外部に公開しない)クラスタ用のIP
ports:
- port: 3306
selector:
app: mysql # サービスを提供するPodの名前

Serviceをデプロイ:

 $ kubectl create -f mysql-service.yaml 

サービスが作成されているか確認するためには、次のコマンドを実行します。

サービスの一覧:

$ kubectl get service mysql
NAME      TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
mysql     ClusterIP   10.3.247.100   none          3306/TCP   32m

コンソール -> GKE → サービス からも確認できます。

MySQLクライアントのコンテナからMySQLに接続して見ます。

MySQLクライアントを実行:

$ kubectl run -it --rm --image=mysql:5.6 \
--restart=Never mysql-client \
-- mysql -h mysql -pパスワード

実行結果:


If you don't see a command prompt, try pressing enter.

show databases;
+---------------------+
| Database |
+---------------------+
| information_schema |
| mysql |
| performance_schema |
| wordpress |
+---------------------+
5 rows in set (0.01 sec)

このように、MySQLから接続することができました。

まとめ

今回は、k8sでMySQLサービスを立ち上げました。

データの永続化するために、永続ディスク(Persistent Disk)を作成してそこにDBデータを保存することを学びました。

次回はWordPressをデプロイするところを実施していきます!