Leverages、teratailの新卒一年目エンジニアのtkowです。Leveragesを技術力に定評のある会社に押し上げるべく入社しました。
技術の会社として認められるためにまずやることと言ったらQiitaで色々発信するべきだろうということで、有志でAdventカレンダーを作りました。やる気がありすぎてほぼ一人で半分以上の枠を埋めてしまいました。なるべく記事のクオリティを担保できるように頑張ります。
teratailのインフラ
Google Cloud Platformを使っています。
インフラ構成はGCEインスタンスをItamaeサーバを使って管理しており、
teratail本体に関わるサービスはkubernetesを使用しています。
teratailのフロントエンド
webpackを使ってフロントエンドのバンドルを行なっています。
理由は、共通化されていないファイルが多く存在する環境から
依存関係を把握できるように、module化されていないファイルを
整理するためにwebpackで整理しました。基本的にはbabel-loader
でes6を使用しています。全て、.jsでbuildを有効にしたいところ
でしたが、use strictモード制約に引っかかるようなスコープ汚染の
あるコードが多く、リファクタリング時に拡張子.esにすることで、有効に
なるようにローダーをセッティングして、レガシーなJSをモダンに変えています。
gulpの資産があるので、gulpからwebpackのbuildを叩く設定を作ってい
ますが、マイクロサービス化を目指しwebpack設定を分離して作成しています。
teratailのバックエンド
PHPを使用しています。一部キャンペーンページなどを、micro service化してnuxtjs+expressサーバに移す試みをしています。また、それぞれのサービスはGCEまたは,GKEのL7ロードバランサーで管理されています。GCEとは別にGKEのIngressでL7ロードバランサーを噛ませる構成に変えたいと思っていますが、試行錯誤中です。
teratailのCD
CIツールとして、Circle CIを使用しています。deployはGoogle Container Registryのgithubフックによって、releaseタグを作成したタイミングで、Docker Imageを作成し、kubectl set image image:latest_tag
を利用してデプロイを簡易化しています。この手順で手動更新の作業が発生するのでもっとうまいやり方がないか考案中です。
公式の方に聞いたところ、CDの押しはSpinnakerらしいです。buildオプションによってコンテンツデリバリーを設定していませんが、別プロジェクトでWerckerで遊んでいて、パイプラインを自作するということができるのを知って、調べてみたら、Circle CIでもbuild工程でkubenetesのデプロイをできることを知ったので、ちょっと大変そうですが、やってみています。
何を考えて設計しているか
インフラの再生性や簡易性に重点を置いています。
Infrastracture as Codeで紹介されている概念を元に考えています。
構成管理設定ファイルのバージョン管理、フェニックス交換やカナリヤリリースが容易に設定できるkubernetesを選択しています。