minne の開発環境の変革と今後
@_shiro16 GMOペパボ minne事業部 チーフテクニカルリード
minneについて
国内最大級のハンドメイド商品のECサイト 9年目
Agenda
- minnne の構成の話
- Kubernetes導入以前の開発環境
- Kubernetes導入以後の開発環境(問題がどう解決されたか)
- 今後の話
話さないこと
- なぜKubernetesに移行したか
- 実際の以降の話
ざっくりしたminneの構成の話
Route53でDNS LBやってNyah(Openstackベースの自社インフラ)とAWS上で構成(データストアだけAWSメイン) RailsでWebアプリが動いている。現在モノリスからマイクロサービス化を進めていて、実際に内部で1サービスだけマイクロサービスで動いている。
ローカルの開発環境
旧開発環境での課題
- なんか壊れた
- 大体コンテナが立ち上がっていないだけ
- メモリとかで死んでるコマンドがいるとか
- tokenが古い
- 最新masterじゃないと死ぬ
- 大体コンテナが立ち上がっていないだけ
旧リモート開発環境
インターネット越しに確認したいときのための環境 EC2相当のサーバーを複数台用意して、ドメインごとにアクセス先を振りわけ マイクロサービス担ったもの以外は共通のサービスを使っていた ミドルウェアは共通
開発の流れ
まずローカルで開発して、localhost:3000とかで確認したあとで、(やりたければ)任意のブランチをDeployコマンドでリモート環境に転送して、インターネット越しにサービスを確認
旧リモート環境の課題
人が増えて台数が足りなくなった botに誰が使ってるか把握してもらうようにした とはいえ埋まってたら待ちなので生産性が低下する 金で殴れば台数で解決するけど、結局いたちごっこだし、常に使うわけじゃないので増やすだけだとコストメリットが低い
課題をどう解決したか
Kubernetes移行時にリモート環境も再構築して対応した Issueを立てて移行した後のリモート開発環境がどうなるか、メンバーに共有しておき、対応した
ローカルの開発環境
既存と変わらない人もいる 新環境の人は開発するサービスだけDocker上にコンテナを起動 Telepresence経由でアプリをインターネット越しのリモートクラスターにて動かして確認できるようにした 個人の環境への依存度が低下
リモートの開発環境
個人1Pod所有(サービスが2つなので正確には2Pod) nginx ingress controllerでドメインごとにサービス振り分け(自分の名前のサブドメインとかを振り分けるように出来た) ingress controllerにしたのでfloating ipの枯渇問題も解決できた
好きな名前のサービスで好きなドメインですぐに環境立ち上がるようになってよかった
登録されたIngressはexternal dnsでRoute53に登録したかったんだけど、minneの構成の問題でちょっとできなかった(後で説明)
skaffold kaniko kustomizeを利用してリモートでのイメージビルドや複数の環境に対応
deployはSlack botでできるようにしている。bot自体もKubernetes上にPodとして生息
skaffoldでイメージの作成やdeployを対応 yamlで管理できる devモードだとコードの変更をフックしてdeployやってくれる
kustomizeのoverlayを使って環境ごとにマニフェストを生成 json patchで柔軟に変更もできる
kaniko コンテナ内でイメージビルドが出来る docker commandがいらなくなる Pushまで自動でやってくれる
external-dns IngressやServiceの設定をベースにAWS Route53やCloudDNSのレコードを操作できる Ingress/Serviceを削除したときの挙動も制御できる minneの場合、Route53とClusterの間にサーバーが居てそいつがIPを持っているので、制御が難しく断念した
Deploy bot ogidow/gobot interactive messageのパラメーターをもとにコマンド実行してほげほげできる
新たな課題
- 依然として旧環境でDocker使っている場合もある
- Telepresence使うときdocker-sync使うのでメモリ要件が厳しい
- デザイナーさんだと問題
- イメージデカイ→ビルドに時間がかかる(kanikoだとかなりキャッシュを賢く聞かせられるイメージだけどどうなんだろう)
- K8sトラシューむずいもんだい
今後見えている課題
- マイクロサービス化が進んだときに個人の環境をどこまで分離するか
- サービスの全Podを個人ごとに用意するのか
- ミドルウェアどうするか
まとめ
- Kubernetesを使って抱えていた課題をクリアできた
- Telepresenceで環境のいいとこどりができた
- Kubernetesの恩恵をどこまで受けられているかわかっていない
- マイクロサービス化が進むに連れ現れる課題への対応が必要
- ネイティブアプリエンジニア向けに気軽に壊せる環境が払い出せるようになった
質問
- kanikoのオブジェクトストレージキャッシュってどう?
まだチューニングできてない
Telepresenceのレイテンシ問題ってどう?
ただの開発環境なのでそうでもない
Telepresenceで入れ替えるコンテナはどう管理してるの
基本クラスタ上に個人のPodあるのでそれを入れ替えてる
kanikoキャッシュバグ多くない?
- あんまふんでない