どこにでもいるSEの備忘録

たぶん動くと思うからリリースしようぜ

【自由研究】Vue.js+Flask+Dockerで普通のWebアプリケーションを作る(その4:Kubernetesに書き換える)

f:id:nogawanogawa:20190812202110p:plain:w300

前回はこんな感じのことをやってました。

nogawanogawa.hatenablog.com

また、Kubernetesを軽く勉強してました。

nogawanogawa.hatenablog.com

nogawanogawa.hatenablog.com

今回はせっかく勉強したKubernetesを使っていきたいと思います。

Kubernetes

Kubernetes is 何?

Kubernatesは最近勉強したてホヤホヤなので、大して慣れてもいないので、復習も兼ねてちょっとだけ丁寧目にやっていきます。

qiita.com

この辺を参考にさせていただけば、コンテナオーケストレーションとは

  • たくさんのサーバーに
  • たくさんのコンテナを置いて
  • 連携させるようなアプリケーションを
  • デプロイ・管理・スケールとかさせるやーつ

ってことで、そのデファクトスタンダードがKubernetesって感じですね。

Kubernetesは「あるべき状態」を設定してあげるとその状態を維持するようにいい感じに動作します。 上のqiitaの記事から画像を拝借すると、イメージはこんな感じです。

f:id:nogawanogawa:20190813082523j:plain:w600

いや、上の記事非常にわかりやすいっすね!めっちゃ参考にしました!!

k8s

docker-compose -> k8s

さて、docker-composeで書いていたものをk8sに直します。

こちらの記事を参考にさせていただきました。

qiita.com

永続ボリュームの適用

k8sのデザインとして、"できるだけステートを持たない"ことが良いとされます。 ステートレスなアプリケーションでは、データの永続化は必要ないのでコンテナは使い捨てで構いません。

一方でDBなどはステートの塊ですので、保存したデータをコンテナの外に出して永続化する必要があります。 そんなわけで、MySQL用のデータ保存領域のPersistentVolume(PV)を作成します。

Kubernetes環境でストレージを考えると、イメージはこんな感じですね。

f:id:nogawanogawa:20190816163649j:plain:w600

Persistent Volumeは永続化ボリュームに関するオブジェクトです。 そして、このPersistent Volumeの中からいくらかの領域を確保するのがPersistent Volume Claimです。 この2つで確保した永続化ボリュームをPodから見えるようにしてあげることで、ストレージの永続化が実現されます。

kind: PersistentVolume
apiVersion: v1
metadata:
  name: mysql-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"

次に、Persistent Volume Claimで利用宣言します。 Manual ってStorage Classの利用を宣言します。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi

確認するとこんな感じです。

$kubectl get pv
NAME                CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
mysql-pv-volume     2Gi        RWO            Retain           Bound       default/mysql-pv-claim   manual                  16s

これで、永続化ボリュームは確保できました。

deploymentの適用

deploymentを適用して、MySQLのコンテナを起動します。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim

Serviceはこんな感じ。

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
  - port: 3306
  selector:
    app: mysql
  clusterIP: None
挙動確認

きちんと起動できるか確認してみます。

kubectl run -it --rm --image=mysql --restart=Never mysql-client -- mysql -h mysql -ppassword

これでMySQLが起動すればとりあえず、MySQLのコンテナは使用できています。

create database sample_db;

データベースを作ってみます。

これで一旦コンテナを削除します。

$kubectl delete -f k8s/deployment.yaml
deployment.apps "mysql" deleted

もう一度起動して、アクセスすると

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sample_db          |
+--------------------+
4 rows in set (0.00 sec)

ちゃんとDBが残っていて、永続化されていますね。

感想

mysql側はうまく永続化できました。 次はFlask側も移行したいと思います。