1日約70万ビルド: DockerとNomadが支えるCI/CDプラットフォーム

9996db3588c75fb4f2b582fa4021cfdb?s=47 Kim, Hirokuni
September 08, 2018
4.2k

1日約70万ビルド: DockerとNomadが支えるCI/CDプラットフォーム

builderscon 2018 9/8 15:30 多目的教室1でのセッション

9996db3588c75fb4f2b582fa4021cfdb?s=128

Kim, Hirokuni

September 08, 2018
Tweet

Transcript

  1. 1日70万ビルド: DockerとNomadが支える CI/CDプラットフォーム

  2. フィードバックのお願い 内容だけではなく、テクニカルな部分もお願いします 傷つかないようオブラートに包んでね

  3. 本日のコンディションについて

  4. なぜこれを話そうと思ったか 背景 Kubernetesがそろそろ世界制覇しそう Nomadだれも使ってない CircleCI 2.0でNomadをフル活用しているので

  5. "Kubernetes is the future!" by GitLab

  6. BuildersConn 2018だけでも4セッションがk8s...

  7. That's crazy!!

  8. ちょっと待ってくれ 確かにKubernetesは素晴らしいがデメリットもある 構造が複雑 Dockerしかサポートしてない 小規模サービスにはToo muchでは?

  9. ご存知HashiCorpなので信頼性は抜群 が、なぜかあんまり世の中に知られていない、、、

  10. プレゼンの構成 1. HashiCorp Nomadについて 2. Nomad @ CirclecI 2.0

  11. 自己紹介 Kim, Hirokuni (金 洋国) + kimh CircleCI (Japan) 電動キックボード

  12. None
  13. 公道で走れるようにするためにごにょごにょ...

  14. NomadとDockerが支える2.0

  15. NomadとDockerにズームした図

  16. 3分で学ぶスケジューラー (1) タスクをスケジューリングするからScheduler Cluster Managerとかとも言わる 分散するマシンをまとめてタスクを割り振る

  17. 3分で学ぶスケジューラー (2) 2つの側面: SchedulerとCluster Manager Dockerのクラスタ バッチスケジューラー

  18. Nomadのアーキテクチャ (1) 概要 Server/Clientモデル Goで書かれている Server間の通信にConsul

  19. Nomadのアーキテクチャ (2)

  20. なぜNomadを選んだか (1) 背景 LXC + 自前ツールの限界 (CircleCI 1.0) LXCつらい。Docker使いたい。 Clojureで作ったschedulerを捨てたい

    PostgreSQLをキューとして使うってどうなん?
  21. なぜNomadを選んだか (2) 主な理由 サービスの特性とマッチ Batch Jobにフォーカス CircleCIでは単発のジョブ(ビルド)が沢山ある 1 ビルド =

    1 Nomad Job K8sはサービス管理にフォーカス
  22. なぜNomad以外を選ばなかったのか Kubernetes: Long running job (サービス)に特化していた Mesos: 長年使われているのに情報が少ない。複雑。 Docker Swarm:

    まだまだ出たばかり
  23. 1年間Nomadやってみた結果 順調に2.0ビルドは伸びている

  24. ちょっと寄り道

  25. CircleCI 2.0が爆速になった話 1.0 2.0

  26. 1.0ではSSHでリモートコマンドを実行 (同期的)

  27. 2.0ではgRPCに置き換えた (非同期)

  28. 運用してわかったこと (1) Single Binaryファイル $ nomad agent -dev ==> Starting

    Nomad agent... ==> Nomad agent configuration: Client: true Log Level: DEBUG Region: global (DC: dc1) Server: true .... メリット: 開発環境でも簡単にテストができる! 運用が楽 スケールが簡単
  29. 運用してわかったこと (2) まだβだけどとても安定している だけど、たまにクラスタが壊れる (Bankurpuctyについては後述)

  30. 効率よくスケジューリングしてくれる (3) より少ないマシンでインフラを運用できる 2.0の resource_class はNomadの機能で実現

  31. 運用してわかったこと (4) みんなもっと使ってくれ、、、

  32. 運用ノウハウ 参考にしてください スケールアップ/ダウン Bankurpucty

  33. スケールアップ Consul AgentとNomad Clientが入ったマシンを起動するだけ # /etc/nomad.d/client.hcl datacenter = "dc1" data_dir

    = "/etc/nomad.d" client { enabled = true } $ nomad agent -config=/etc/nomad.d/client.hcl
  34. スケールダウン 問題点 Drainモードにするとジョブを他のNodeに移そうとする CircleCIではMigrationしないで欲しい パッチで回避 $ nomad node drain -enable

    f4e8a9e5 Are you sure you want to enable drain mode for node "f4e8a9e5 2018-03-30T23:13:16Z: Ctrl-C to stop monitoring: will not cance 2018-03-30T23:13:16Z: Node "f4e8a9e5-30d8-3536-1e6f-cda5c869c35 2018-03-30T23:13:17Z: Alloc "1877230b-64d3-a7dd-9c31-dc5ad3c93e 2018-03-30T23:13:17Z: Alloc "1877230b-64d3-a7dd-9c31-dc5ad3c93e 2018-03-30T23:13:17Z: Alloc "1877230b-64d3-a7dd-9c31-dc5ad3c93e ... 2018-03-30T23:13:42Z: All allocations on node "f4e8a9e5-30
  35. Declaring Bankruptcy (1) GCのせいで時々クラスターが壊れる。その結果、、、

  36. Declaring Bankruptcy (2) Nomad Garbage Collection Server GC: 古いスケジューリングに関するデータを削除 Client

    GC: ジョブが作ったファイルなどを削除 5分ごとに自動で起動される 問題 並列でGCが走る Raftのトランザクションが走る クラスタが高負荷 CircleCIでジョブが処理できなくなる Declaring Bankruptcy
  37. Declaring Bankruptcy (3) 解決方法 rm -rf /opt/nomad/server/raft スケジュールされていたジョブが失われる...

  38. Declaring Bankruptcy (4) 解決方法: CircleCIでジョブが終わった直後にGCをトリガー 結果: 並列GCを抑制 Bankruptしなくなった

  39. 運用ノウハウ (2) Nomad Server on k8s Nomad Serverを運用しないといけない Kubernetesのサービス運用機能はすごい K8sの上でNomadを動かそう!

    詳しくは https://circleci.com/blog/write‑less‑code‑use‑more‑tools/
  40. Thank You HashiCorp CircleCIではHashiCorpのプロダクトはだいたい使っています Vault Terraform Packer Consul Nomad だいたい使ってます

  41. 来週の火曜日にミートアップもありますよ!

  42. None
  43. Thank You