5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Beyond the Million Users[実践編]

Last updated at Posted at 2022-12-02

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

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

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

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

ほぼポエムかもしれん。

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

kubernetesとは?

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

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

具体的にはminikubeというローカル環境でKubernetesを簡単に実行するためのツールを使っています。

成果物

クラスターアーキテクチャ
図1.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

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

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

サーバのコンテナ

サーバのコンテナを立てます

kubectl apply -f https://raw.githubusercontent.com/moffy-Black/chatapp/main/k8s/chat-app.yml

スクリーンショット 2022-12-02 22.09.24.png

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

reactアプリと接続させる

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

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

スクリーンショット 2022-12-02 22.14.49.png

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

スクリーンショット 2022-12-02 22.17.54.png

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

スクリーンショット 2022-12-02 22.21.09.png

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

ネットワークの確認

データベースを確認

マスター

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

スレーブ

二つあるスレーブのコンテナのうちの一つを選んで、コンテナの中に侵入してデータが保存されているか確認してみました。
スクリーンショット 2022-12-02 22.26.44.png
ちゃんと三つのデータ全てが保存されていました。ちゃんと機能していそうです。
ちなみに確認するともう一つの方のスレーブコンテナにもちゃんと保存されていました。

ロードバランサとサーバの確認

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

スクリーンショット 2022-12-02 22.32.41.png

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

まとめ

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

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

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?