GCPTweetそろそろKubernetes(以後k8s)触ってみないといかんな欲が高まってきました。k8sを使ってなにを構築したものかと思ってたんですが、Mastodonを使いたい案件(プライベートで)があったので、k8sを使ってMastodonを構築していこうと思います!自分のメモ書きみたいな内容なので注意。最後に参考資料Kubernetesについてまずk8sについて基礎的なところから学んでいきます。k8sは一言でいうと「コンテナオーケストレーションツール」です。イメージしづらいので詳しく調べてみます。同一ホスト内に複数コンテナがあるとします。(図を書くのが面倒なのでPlantUMLで適当に書いた図)この同一ホスト内でのコンテナ同士はプライベートネットワークで通信ができますが、外部への通信はNATを通してしかできません。このホストのスケールアウトを考えたとき、コンテナの連携やルーティングが複雑になるのは想像に難くないでしょう。この問題を解決するのがKubernetesです。ユーザに上記のような問題を意識させないように、k8sはコンテナのクラスタ化を行います。ユーザがコンテナを起動させたいときはコンテナイメージコンテナの台数を指定するだけで、k8sがいい感じにクラスタ化してくれます。k8sはSpecに指示された台数などを維持します。コンテナやNodeに障害があり落ちても、k8sはこれを検知し、再起動やNodeの起動などを行います。PodPodはk8sにおいての最小単位であり、コンテナの集まりです。上記の「同一ホスト内に複数コンテナ」の図がそのまんまPodにあたります。Podは以下の要素で構成されています。コンテナ複数個ある場合もある。IPPod内コンテナが共有するIPアドレスDeploymentじゃあPodの配置ってどうやんの?って思いますが、それがDeploymentです。Podの起動数やコンテナイメージなどを指定します。Set)がある場合、どれにアクセスしていいかわかりません。そのPodへのアクセス手段を用意するのがServiceです。Setへのロードバランス機能もServiceが提供します。実際k8sでpodを作ってみるここまでPodDeploymentServiceというものが出てきました。それを理解するために実際にk8sになにかデプロイしてみたいと思います。Googleがチュートリアルを提供していますのでこれを例にやっていきます。https://cloud.google.com/kubernetes-engine/docs/tutorials/hello-app?hl=jaまた今回は定義ファイルを中心に見ていきたいので、クラスタ生成などは上記チュートリアルを見てください。8080ではこれをデプロイしてみます。1mこんな感じでPodが3つ作成されます。続いてServiceです。helloweb-1127322674-b3ndrServiceを作ることにより、外部からアクセスできるようになりました!まとめKubernetesはDockerをクラスタ化するもの。MasterはどのクラスタにどうPodを乗せるかなどを管理しているもの。Containerの集まり。記憶領域とIPを共有している。複数のノードに跨がる。何台必要かなどはDeploymentで定義する。Setへのルーティングを担うもの。ロードバランサ的な役割も持つ。MastodonについてMastodonは分散型のソーシャルネットワークで、Twitterのような短文投稿システムです。そのMastodonサーバーのことを「インスタンス」と呼び、そのインスタンスは誰でも立てられます。そのインスタンス同士を繋ぎ大きなソーシャルネットワークを構築することができます。そんなMastodonですがアーキテクチャに様々な技術を使用しており、インスタンスを構築してみることでインフラの勉強になるかと思います。いうことで、内部構造を簡単に見ていきます。トゥートやストリーミングのたびにキューが作られるk8sでMastodonを構築するさて、ようやく本題です。k8sでMastodonを構築するにはどのようにすればよいのでしょうか?まず下記のようなPodが必要そうです。SQLを使おうと思います。ProxyというDockerコンテナが必要になるので、このPodを作成します。接続するまたMastodonでは画像のアップロードが出来ますが、簡易に取り出したいので、GCSに保存していきたいと思います。あとMastodonのユーザ登録にはメール送信が必要です。これはSendGridを使用します。k8sのレシピは下記を基本的に使用してます。https://github.com/jviide/kubedon上記以外で設定した項目を以下に記載していきます。Mastodonの設定ファイルMastodonアプリケーションの設定ファイルを生成しますが、k8sでは「ConfigMap」という設定ファイルリソースを生成することができます。以下が今回作成するMastodonの設定です。https://storage.googleapis.comSMTPとGCSの設定を行っています。Mastodonは標準でS3をサポートしています。GCSはS3のAPIインタフェースで使用することができるので、MastdonでもGCSをストレージとして使用することができます。k8sからCloudSQLにつなぐための設定。完了!ここまで出来たら、自分が設定したMastodonのドメインをブラウザで見てみましょう!以下の画面が出てきたら成功です。開かない場合、エラーが発生しています。GKEでは「Stackdriver」というサービスでアプリケーションログの確認ができます。大体そこに原因が出力されてるので、対応しましょう。ここで終わりではなく、ユーザの登録とトゥートが出来ないと意味がないのでそちらも確認しましょう。gs://mastodon-morix/media_attachments/files/000/000/001/originalgs://mastodon-morix/media_attachments/files/000/000/001/original/f0669c90da43564b.jpg出来ました!!最後に今回のMastodon構築では、下記の設定ファイルを使わせていただきました。