Japan Container Days v18.12の主催者企画 "showKs"。 開発の経緯と実装についてまとめました。 http://showks.containerdays.jp/
showKs Team @jacopen @jyoshise @amsy810 @makocchi @kojiha @inductor @tsukaman
showKs開発の舞台裏
View Slide
触れる・作れる・持って帰れる参加型ショーケース [ showKs ]必要なのは「やってみるか」の気持ちだけ
フォームに入力したら
あなた専用のキャンバスができていて
GitHubリポジトリや
CIパイプラインや
CDパイプラインができている
ポータルでみんなの絵が見られる
いろんなことがありました
発端
停滞
救世主現る
再起動
9/6第1回 ミーティング
コンセプト決定
✔ クラウドネイティブ開発の体験ができる✔ アプリごとのリポジトリ✔ CI/CDパイプライン✔ PRを活用した開発✔ お絵かきアプリというテーマで共同作業感出す✔ アプリ・マニフェスト・ドキュメント 全てお持ち帰り可能
スペシャルチーム結成jacopenamsy180jyoshisemakocchikojihainductortsukaman
10/11よっしゃ開発だ!
こんな感じだよねポータルキャンバスキャンバスキャンバスgitgitgitCI
って思うじゃん?
打ち合わせのたびに複雑化する構成
CDやりたいよねポータルキャンバスキャンバスキャンバスgitgitgitCI
あ、申し込みフォームいるね。Google FormsとかでポータルキャンバスキャンバスキャンバスgitgitgitCIGoogleForm
でも重複チェックとか要るよね・・・ポータルキャンバスキャンバスキャンバスgitgitgitCIForm
StagingとProductionわけたいよねStgポータルStgキャンバスStgキャンバスStgキャンバスgitgitgitCIFormStgポータルProdキャンバスProdキャンバスProdキャンバスgitgitgit
てかGitHubに自動でリポジトリ作成しないとねStgポータルStgキャンバスStgキャンバスStgキャンバスgitgitgitCIFormStgポータルProdキャンバスProdキャンバスProdキャンバスgitgitgit
SpinnakerとConcourseのパイプラインも生成要るねStgポータルStgキャンバスStgキャンバスStgキャンバスgitgitgitCIFormProdポータルProdキャンバスProdキャンバスProdキャンバスgitgitgit
アプリ連携アーキテクチャ変えないとね・・・StgアグリゲータStgキャンバスStgキャンバスStgキャンバスgitgitgitCIFormStgアグリゲータProdキャンバスProdキャンバスProdキャンバスgitgitgitStgポータルProdポータル
ポータルもちょっと分けて作るわStgアグリゲータStgキャンバスStgキャンバスStgキャンバスgitgitgitCIFormStgアグリゲータProdキャンバスProdキャンバスProdキャンバスgitgitgitStgポータルFrontendStgポータルBackendProdポータルFrontendProdポータルBackend
あ、無くてもうまいこといったわStgアグリゲータStgキャンバスStgキャンバスStgキャンバスgitgitgitCIFormStgアグリゲータProdキャンバスProdキャンバスProdキャンバスgitgitgitStgポータルProdポータル
メトリクスをダッシュボードで見たいよねStgアグリゲータStgキャンバスStgキャンバスStgキャンバスgitgitgitCIFormStgアグリゲータProdキャンバスProdキャンバスProdキャンバスgitgitgitStgポータルProdポータル
活動時間22:00〜28:00
なんとか完成
各所解説
showks-terraformK8sで開発するとしても、k8s外に必要なものが沢山出てきます。- k8sそのもの- DNS- オブジェクトストレージ- 踏み台サーバー- スタティックIPついつい気が緩んで手作業しがちですが、しっかりとコード化して Infrastructure as codeやりましょうhttps://github.com/containerdaysjp/showks-terraform
showks-formhttps://github.com/containerdaysjp/showks-formStgポータルStgキャンバスStgキャンバスStgキャンバスgitgitgitCIFormProdポータルProdキャンバスProdキャンバスProdキャンバスgitgitgit
showks-formhttps://github.com/containerdaysjp/showks-form● ユーザーからの入力に応じて○ バリデーション○ GitHubにリポジトリ作成○ ベースCanvasのPush○ Webhookの設定○ Collaboratorの設定○ Protected Brachの設定○ Concourse Pipelineの生成と反映○ Spinnaker Pipelineの生成と反映
showks-formhttps://github.com/containerdaysjp/showks-form● Rails3くらいまで触ったことがあったので、さっくり作るにはいいよねと採用。Rails5.2● バリデーション楽ちんで助かった● GitHubはOctokit、GitはRuggedで操作。割と楽だった● 依存するものが多いので、安直にイメージ作るとデカい● Sidekiqで非同期にしたかったけど時間切れで同期処理
Concourse Pipelinehttps://github.com/containerdaysjp/showks-concourse-pipelinesshowKs関連コンポーネント● showks-form● showks-portal-frontend● showks-aggregatorユーザーのCanvas● showks-canvas-USERNAMEこれらの● Unit test● Dockerイメージ作成とpush● Prodリリース時はタグの付け替え● k8sマニフェスト作成
Concourse Pipelinehttps://github.com/containerdaysjp/showks-concourse-pipelines
GitOps的アプローチshowks-manifest-stgObjectStoragemanifest-committerpipelineshowks-form-stgpipelineshowks-aggregator-stgpipelineshowks-portal-stgpipelineshowks-canvas-USERpipeline
よかったこと● 知っているけど試したことがなかった技術を試せた● すごいチームで一緒に作業できた● さび付きがちな『現場感』の維持に役立った
反省点● テストがないコードはやはりクソ○ 時間が無い・・・の言い訳あぶない● プロマネ的な大人が1人くらいは欲しい● ちゃんと寝よう!!!!!
showKs’Continuous Deliverywith Spinnaker
俺的showKsのコンセプト(なんとなく結果的に)● 参加者になるべく負担をかけず、かつ「マイクロサービスの開発プロジェクト」のオーナー体験をしてもらう● アプリ自体そこそこ遊べて、かつ大人数で参加して面白いものにする● クラウドネイティブ技術全開で行く● すべて公開/再利用可能なものとするそのために● スケーラビリティ● CI/CDのフルオートメーション● GitHubをSingle source of truthとする
作ったCD環境stg prodns:spinnakerns:showksns:showksHalyardでデプロイTerraformでデプロイ
CDパイプライン概要(Portal, Aggregator)deploy-to-stgcanary-to-proddeploy-to-prodstg clusterprod clusterstg manifeststg imageprod manifestprod imageCI (stgブランチへの merge)CI (masterブランチへの merge)
CDパイプライン概要(canvas)deploy-to-stgdeploy-to-prodstg clusterprod clusterstg manifeststg imageprod manifestprod imageCI (stgブランチへの merge)CI (masterブランチへの merge)このパイプライン自体が自動生成される
なぜSpinnakerか
なぜSpinnakerか● プラットフォームに依存しない
なぜSpinnakerか● プラットフォームに依存しない● なんかクラウドネイティブ感ある
なぜSpinnakerか● プラットフォームに依存しない● なんかクラウドネイティブ感ある● 流行ってるしモテそう
CDこだわりの攻めポイント(守りに入った途端人は年老いていくのだよ)● Kubernetes V2 Providerの採用● Pipeline as Codeによるイミュータブルかつ自動的/継続的パイプライン適用● Canary release
Spinnakerのターニングポイント:Kubernetes V2 ProviderKubernetesの基本的な考え方:● Kubernetes上で動作するワークロードの全ての真実はManifests(YAML)に記述される● Kubernetesは自律的に、適用されたManifestsに記述されている状態に実際のクラスタの状態を追従させる● 宣言的デプロイ、GitOpsといったCloud Nativeベストプラクティスの根本Spinnaker Kubernetes V2 Providerは上記を尊重→従来のコンテナイメージ中心のCDパイプラインから、Manifest中心のCDパイプラインへの転換期
Pipeline as Codeによるイミュータブルかつ自動的/継続的パイプライン適用● もともとSpinnakerに欠けていると言われていたところ○ WebUIからしかパイプラインの管理ができない○ パイプラインがどのように定義されているのかはブラックボックスだった。
Spin CLI● 大したことはできない● でもそれによってむしろImmutableなパイプラインが実現できるのかもやったこと● Web UIから雛形パイプラインを作成● それをspin pipeline getでJSONファイル化● Pythonでパラメータを置換して複製
カナリアリリース当初やりたかったことhttps://www.spinnaker.io/concepts/pipelines.png
カナリアリリースただしこれは従来のSpinnakerの世界観ArtifactはDocker Image
つまり現状これはうまくいかないようだ(やりかたがわからなかった)カナリアリリースstgクラスタで動いているdeploymentをstgクラスタのアカウントで取ってくる?stgクラスタで動いているdeploymentをprodクラスタのアカウントでデプロイする?
困ったちなみに先々週の状況です
そんな僕の前に天使が舞い降りた
annotation書いとくだけで!
nginx-ingress-controller 0.21.0で機能リリース
その他ハマったこと● 認証でドハマり○ Spinnaker自体はユーザー認証の機能を持っていない○ 当初GitHub OAuthを使おうとしたがGitHub TeamsのOrganizationじゃないとダメっぽい○ Google OAuthにしようとしたらG SuiteのOrganizationじゃないとダメっぽい○ 仕方なく単一のgoogleアカウントのみアクセスできるようにした○ などなど● Credential管理問題○ Kubernetes各クラスタのCredential、GCSのCredential、GitHubのCredentialなどいろんなところにとっ散らかってしまった○ 最初になにか管理手段を確立すべきだった● Spinnakerのドキュメントが謎だらけ○ 特にKubernetes V2 Providerは従来のコンセプトをがらりと変えるので既存のドキュメントとの矛盾が多い、かつ実装が文書化されていないので結局コードを読む羽目に
showKsのアプリケーション実装について@inductor(Twitter: @_inductor_)Kohei Ota @ ZOZO Technologies, Inc
アプリで実現したかったこと- ユーザーにただ見せるだけではなく、何らかの形で参加させたい- お絵かきのアプリ!!- マイクロサービスが動いてることを可視化- ただ一覧を出すだけじゃなくて、それぞれが独立していること- 管理画面的なもの(ポータルアプリ)を作成してそれぞれのアプリケーションにアクセスできるように- (当たり前だけど)コンテナで動くやつ
アプリケーションのアーキテクチャ
できたもの- Aggregator- Node.jsのKubernetesクライアントを使って、他のPodの情報を取得、JSONに出力- Socket通信でサムネなどの情報をリアルタイムに取得して描画- Canvasからデータを取ってフロントに投げる
できたもの- Canvas- お絵かきアプリ- 各コンテナは完全に独立して動く(マイクロサービス的なナニカ)- gRPC等内部のAPI通信は今回要件的に不要だったのためやっていない- データの永続化はスケジュールの都合と要件的にやらず- BFF的な何か
できたもの- Portal- シンプルなNuxt.jsベースのアプリ- APIとって表示するだけの簡単な処理とBulmaを使った一覧表示- 無駄にPWA対応(簡単すぎた)- Universal App的な何かができた- なぜNuxtにしたのか?- 使ってみたかったから!!!!!- という気軽な気持ちでやってみれるのがこういうプロジェクトのいいところ
結果的に- マイクロサービス的な何か- マイクロサービスからデータを取ってきていい感じにフロントに投げるBFF的な何か- APIと通信してデータを表示するUniversalアプリの3つからなる今っぽい典型的なアプリケーション構成ができた!
やりたかったけどやれなかったこと- やっぱデータの永続化やりたかった(要件と時間が主に足りなかった)- RDBもだけどAPIのあたりでメモリキャッシュとか使う案もあるにはあった- パフォーマンスとキャパシティの兼ね合いとかまで詰める時間がなかった- Nuxtというかフロントの勉強不足でデータの動的書き換え処理が間に合わなかった- あんまり普段手を動かさないことをやってみるの面白いのでいいですね- アプリ書ける人の割合少ない問題 :innocent:
つらみ
やってよかったこと- 日本の中ではK8sに関することをいろいろ知ってるメンツがそこそこ集合しながらいろんな事ができたというのは本当によかった- 今まで知識では知っていたけど机上の空論でしか話せていなかったことを実際に実現しながらいろいろハマって学ぶことができた- それぞれみんなが、自分のできることでお互いに貢献できた
showKsのこれから
やりたいこと沢山ある- サービスメッシュもやりたい- もっとk8sネイティブにしたいし- いろんなアプリを載せてみたいし- アプリ・インフラどちらのエンジニアも学びがある- もっといろんな人に楽しさを分かって欲しい
次回もやります
最後に- We are hiring!- 一緒にshowKsを発展させられる人を募集しています- アプリ書けるって人一緒にやりましょう!!!!!