前回はこんな感じのことをやってました。
また、Kubernetesを軽く勉強してました。
今回はせっかく勉強したKubernetesを使っていきたいと思います。
Kubernetes
Kubernetes is 何?
Kubernatesは最近勉強したてホヤホヤなので、大して慣れてもいないので、復習も兼ねてちょっとだけ丁寧目にやっていきます。
この辺を参考にさせていただけば、コンテナオーケストレーションとは
- たくさんのサーバーに
- たくさんのコンテナを置いて
- 連携させるようなアプリケーションを
- デプロイ・管理・スケールとかさせるやーつ
ってことで、そのデファクトスタンダードがKubernetesって感じですね。
Kubernetesは「あるべき状態」を設定してあげるとその状態を維持するようにいい感じに動作します。 上のqiitaの記事から画像を拝借すると、イメージはこんな感じです。
いや、上の記事非常にわかりやすいっすね!めっちゃ参考にしました!!
k8s
docker-compose -> k8s
さて、docker-composeで書いていたものをk8sに直します。
こちらの記事を参考にさせていただきました。
永続ボリュームの適用
k8sのデザインとして、"できるだけステートを持たない"ことが良いとされます。 ステートレスなアプリケーションでは、データの永続化は必要ないのでコンテナは使い捨てで構いません。
一方でDBなどはステートの塊ですので、保存したデータをコンテナの外に出して永続化する必要があります。 そんなわけで、MySQL用のデータ保存領域のPersistentVolume(PV)を作成します。
Kubernetes環境でストレージを考えると、イメージはこんな感じですね。
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側も移行したいと思います。