Beyond the Million Users[実践編]

朝起きたらまさかのスペインに日本が勝ってた！！！

勇気を貰えましたね。僕も頑張らねば...

前日の後編になります。今日は実践編です。

ふわとした記事なのでご容赦を...

ほぼポエムかもしれん。

kubernetes(クバネティス)を使ってサーバとDBのコンテナクラスタを作って遊ぼうしました。



## kubernetesとは?
コンテナオーケストレーションツールです。コンテナはdockerでimageから作るあのコンテナです。オーケストレーションとは、組織化、編成、調整、（管弦楽用に）編曲などの意味を持つ英単語。ITの分野では、大規模で複雑な情報システムの管理などをソフトウェアによって効率化、省力化、自動化することをこのように呼ぶことが多い。だそうです。要するに複数のコンテナを管理する技術のことです。これだけだとざっくりしすぎな説明なので詳しく知りたいてかたは[公式](https://kubernetes.io/ja/docs/home/)へgo!

今回はこのkubernetesをコンテナネットワーク(わかりやすいように造語を作った。クラスタ-のこと)を作るために使用します。

具体的にはminikubeというローカル環境でKubernetesを簡単に実行するためのツールを使っています。
## 成果物
クラスターアーキテクチャ
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500962/90f3ff35-1c31-4708-4683-b8482b94221c.png)


localに立てたreactアプリからgoサーバへwebsocketでデータを送信します。黄色い丸はロードバランサを表しています。そのあとgoサーバはデータベースにreactから送信されてきたデータを保存します。めちゃくちゃ単純なデータ入れるだけの構成になってます。

諸々詳細はソースコードにあります
https://github.com/moffy-Black/chatapp

## とりあえずネットワークを作ってみる
minikubeを使ってlocalにkubernetesの仮想環境を作成していく。ちょっと時間かかりめ。
```
minikube start
```
ここからminikube上にコンテナを立てていく。
### DBのコンテナ
まずはDBのマスターから
```
kubectl apply -f https://raw.githubusercontent.com/moffy-Black/chatapp/main/k8s/go-redis-leader.yml
```
コンテナがminikube上に生成されたか確認してみます
![スクリーンショット 2022-12-02 22.04.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500962/afee3216-230c-8bc3-8831-8ba8cbb6692e.png)

1個マスターのDBコンテナが立ったのを確認できました。

次はスレーブのコンテナを立てる。
```
kubectl apply -f https://raw.githubusercontent.com/moffy-Black/chatapp/main/k8s/go-redis-follower.yml
```

![スクリーンショット 2022-12-02 22.06.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500962/d2645e2f-cb84-a365-e477-2ec361476939.png)

2個スレーブのコンテナが立っているのを確認できました。

### サーバのコンテナ
サーバのコンテナを立てます
```
kubectl apply -f https://raw.githubusercontent.com/moffy-Black/chatapp/main/k8s/chat-app.yml
```
![スクリーンショット 2022-12-02 22.09.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500962/6601b98d-7a1a-0d9e-eb54-ecf4bb6d53bb.png)

chat-app系がそうです。3個立ち上げました。

### reactアプリと接続させる
さあこれでminikube上にコンテナのネットワークが立ちました。ローカル上に作ったreactアプリと連携させていきます。

今minikube上に立てているコンテナたちはminikubeのプライベートネットワーク内でしか接続できない状態になっています。要するにコンテナ同士は接続できる状態にあるのですが、ローカルのpcからは接続できない状態です。よって、まずはサーバコンテナに接続できるようにするために、ロードバランサへポートを開いてあげます。

![スクリーンショット 2022-12-02 22.14.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500962/0953b034-e696-b5c4-8f79-6f75ba7b34ac.png)

今回はlocalhost:49279で接続できるみたいです。毎回開くごとに番号が違うので環境変数化してあげてreactアプリに接続先を教えるのがいいかもしれません。でも今回は面倒だったので手打ちで設定してreactアプリを立ち上げます。

![スクリーンショット 2022-12-02 22.17.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500962/8bc939dd-7a94-7027-7dc7-934dc10dbe00.png)

こんな感じのアプリを立ち上げました。ここでテキストボックスに文字を入れてエンターを押すとデータをサーバに送信するようにしました。

![スクリーンショット 2022-12-02 22.21.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500962/a15bd268-feda-08e4-ecbf-1b2c69febd92.png)

試しにいくらかデータを送信してみました。

## ネットワークの確認

### データベースを確認
#### マスター
さて、先ほど"hello"と"world!"と"greeting redis"の3つの文字列をマスターデータベースに保存しました。これらのデータがマスターに入っているのは当然としてスレーブにちゃんと模倣されているか確認してみます。

#### スレーブ
二つあるスレーブのコンテナのうちの一つを選んで、コンテナの中に侵入してデータが保存されているか確認してみました。
![スクリーンショット 2022-12-02 22.26.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500962/058b3bd1-dbb1-b670-da19-6b1a299aeee9.png)
ちゃんと三つのデータ全てが保存されていました。ちゃんと機能していそうです。
ちなみに確認するともう一つの方のスレーブコンテナにもちゃんと保存されていました。

### ロードバランサとサーバの確認
サーバのルートにgetを送るとコンテナ名(本当はpod名だけど)を返却するようにコードを書いておきました。
何回かgetを送ってみましょう!

![スクリーンショット 2022-12-02 22.32.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500962/32bfede4-003c-0387-7f9e-2a0058f5f38e.png)

サーバのコンテナは3つあるのでちゃんと上手くリクエストが分散できていることが確認できました。

## まとめ
kubernetesを使ってコンテナネットワーク(クラスタだけど)を作って遊んでみたポエムになりました。deepなところを盛り込むとギトギト二郎系の記事になるのであえてふわっとした内容で書きました。~~妥協ではない~~。kubernetesて面白そうだなと思ってもらえれば嬉しいです。

今回作ったネットワークはサーバ3台、データベースマスター1台, データベーススレーブ二台,フロント1台のサービスを仮想化してみたものでした。実際にはリクエスト数などの増加に伴ってこれらのサービスの台数は自動で調整することができます(loggingとautoscaling)。