前にこんな感じのことをやってました。
この記事の内容には一点問題があって、マシンの状態によってはDockerコンテナの状態が不安定です。 理由はわかっていて、MySQLのアプリがコンテナ内で起動する前にFlaskが起動してしまい、コネクションを確立できずにエラーで落ちています。
停止したコンテナを再起動させてあげれば普通に動くんですが、あまりにもイケてないです。 というわけでKubernetesを軽く勉強してました。
前回からk8sへ移行し始めました。今回はその続きです。
k8s
やること
Dockerの文脈では、そもそも論として、コンテナをコンテナとして使ってなかったので、そこから直していきます。
どういうことかというと、こんな感じに変えます。
コンテナにはライブラリしか入ってなかったのを、プロダクションコードまでのせます。
k8sの文脈では、前回までの状態はこんな感じでした。
今回はこんな感じに直します。
コンテナの作り方を直す
前はdocker-composeでコンテナを作成していましたが、今回はDocker Imageから定義します。
とは言うものの、Dockerfileをちょっと直してビルドしてあげるだけです。
k8s上に乗せる
すでにPodの中にMySQLのコンテナはできているので、Podの中にFlaskのコンテナを追加します。
flaskのスクリプトも一部書き換えました。
挙動確認
今回はコンテナの中から弄ってみます。
flaskのコンテナの中に入ります。
kubectl exec -it [pod name] bash
とりあえず、flaskが動いてるか確認。
top
top - 13:16:52 up 5:20, 0 users, load average: 1.14, 1.15, 1.18 Tasks: 3 total, 1 running, 2 sleeping, 0 stopped, 0 zombie %Cpu(s): 5.8 us, 12.6 sy, 0.0 ni, 80.5 id, 0.9 wa, 0.0 hi, 0.2 si, 0.0 st KiB Mem : 4042484 total, 1000136 free, 1640628 used, 1401720 buff/cache KiB Swap: 1048572 total, 1048572 free, 0 used. 2046544 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 193524 39036 14372 S 0.0 1.0 0:00.87 flask 18 root 20 0 20252 3800 3356 S 0.0 0.1 0:00.02 bash 63 root 20 0 38372 3508 3052 R 0.0 0.1 0:00.00 top
flaskが動いていて一安心。 mysqlのコンテナにつながるか確認。
root@myapp-786fcfdf85-tdw5d:~# curl localhost:5000 {"results":[{"category":"food","content":"good","index":1,"title":"curry"},{"category":"vegitable","content":"good","index":2,"title":"poteto"},{"category":"vegitable","content":"good","index":3,"title":"onion"},{"category":"meat","content":"good","index":4,"title":"poak"}]}
ちゃんと永続化されたデータがflask側から確認できました。
感想
これでようやくアプリケーションがk8s上に乗りました。k8sクラスタの外からアクセスできるようにできてないのは、単純に疲れたから。
しゅごい。