CoreOS入門

36,619 views

Published on

CoreOS入門
BPStudy#81 資料

Published in: Technology

CoreOS入門

  1. 1. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . CoreOS 入門 May 31, 2014
  2. 2. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 自己紹介 • Yutaka Matsubara • Abby CTO • twiter: @mopemope • github: @mopemope Abby 社員募集中です
  3. 3. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 宣伝 Docker の薄い本を書きました
  4. 4. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... .
  5. 5. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . CoreOS とは • Alex Polvi が立ち上げた CoreOS Inc が開発 • 分散システムを前提に設計されたLinux Distribution ▶ Google などを参考に ▶ アドバイザーには Greg KH
  6. 6. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . オフィスの様子 http://www.wired.com/2013/08/coreos-the-new-linux/
  7. 7. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . CoreOS の特徴
  8. 8. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . CoreOS の設計 クラスタ + コンテナ
  9. 9. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . CoreOS の特徴 • 小さくかつ堅牢なOSコア • 安全なアップデート (update_engine, omaha) • Docker Ready (docker) • クラスタを標準でサポート (etcd) • 分散システムをサポート (fleet)
  10. 10. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . コア • セキュリティ、一貫性、信頼性を重視した設計 • 新しい Kernel を積極的に採用 • モダンな Linux らしく systemd を採用 • コンテナが動作する事を踏まえて最小のオーバーヘッド • 多くのプラットフォームで動作する ▶ 各クラウドサービス, 物理マシン(BareMetal)
  11. 11. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . バージョンについて バージョンはCoreOS初版からの日数 • CoreOS: 324.2.0 • Kernel: 3.14.4 • btrfs, ext4 • Docker: 0.11.1 • etcd: 0.3.0 • fleet: 0.3.2
  12. 12. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . セキュリティ、一貫性、信頼性 • デフォルトでブートするとログインすら不可能 ▶ ssh のみログイン可能 • パッケージマネージャーが存在しない • root partition が書き込み不可能 ▶ /etc など一部は可能 ▶ ユーザーデータは外部ストレージ
  13. 13. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 安全なアップデート • update_engine を提供 ▶ alpha, beta の 2 channel • アップデートはroot parttionを載せ替える ▶ 個別のパッケージを管理からの開放 ▶ 2つのroot partition • update元イメージは署名入りで検証を行う
  14. 14. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . アップデート update_engine[22503]: start size part contents update_engine[22503]: 2492416 2097152 4 Label: ”USR-B” update_engine[22503]: Type: Alias for coreos-rootfs update_engine[22503]: UUID: E03DD35C-7C2D-4A47-B3FE-27F15780A57C update_engine[22503]: Attr: priority=2 tries=1 successful=0 update_engine[22503]: COREOS_RELEASE_VERSION=282.0.0 update_engine[22503]: Setup USR-B (/dev/vda4) for next boot.
  15. 15. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Docker • アプリケーションは基本docker上で起動 ▶ ホストOSとの分離による管理コスト低減 • ポータビリティの確保 ▶ どのホストでも問題なく動作 • オーケストレーション(コンテナ間連携)にetcdを使う
  16. 16. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . クラスタ • etcd によって実現 ▶ 耐障害性 ▶ その他のツールの基盤 • コンセンサスアルゴリズムにRaftを採用 • ユーザーデータを保持可能 ▶ 設定などを同期
  17. 17. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 分散システム • fleet = etcd + systemd + job scheduling • 複数ホストへサービスを配備 ▶ 管理コスト低減 • 耐障害性 ▶ 障害を検知し、別ホストへサービスをふりかえる • ログはsystemd-journaldと連携
  18. 18. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 構成要素
  19. 19. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 構成要素 主要構成要素は以下 • coreos-cloudinit • etcd • fleet • locksmith ライブラリ依存を最小限に抑えるためgoで書かれている
  20. 20. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . CoreOS-CloudInit
  21. 21. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . CoreOS-CloudInit 書き込み不可能なCoreOSを初期化、カスタマイズする仕組み • クラウド環境での一括初期化 ▶ cloud-config.yml のサポート • ユーザーによるカスタマイズ ▶ サービスの追加など • 外部デバイスからの読み込み ▶ config-driveのサポート ▶ OpenStack, LibVirt
  22. 22. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 主な設定可能項目 • etcd の設定 • service の自動起動、停止、無効化 ▶ 新しくserviceも追加可能 • ssh キーの設定 • ユーザーの追加、設定 • 任意のファイルの作成 ▶ Network設定 ▶ システム設定 ▶ 環境変数設定
  23. 23. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 例 #cloud-config coreos: etcd: discovery: https://discovery.etcd.io/cc3fad77be13cbde64409073e1175eff addr: $private_ipv4:4001 peer-addr: $private_ipv4:7001 bind-addr: 0.0.0.0 peer-heartbeat-interval: 100 peer-election-timeout: 1000 units: - command: start name: etcd.service - command: start name: fleet.service - command: start name: docker.service
  24. 24. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 例 users: - name: core coreos-ssh-import-github: mopemope write_files: - path: /etc/fleet/fleet.conf content: | agent_ttl=”120s”
  25. 25. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Etcd
  26. 26. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Etcd クラスタの基盤となる耐障害性のある分散KVS • HTTP API(JSON) での操作 ▶ CASのサポート ▶ Waitによる変更監視サポート • 高速に動作 • SSL による認証 • Raft Protocol • Cluster Discovery のサポート
  27. 27. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . HTTP API Setting the value of a key $ etcdctl --debug set /message ”Hello World” Cluster-Peers: http://xxxxxxxxx:4001 Curl-Example: curl -X PUT http://xxxxxxx:4001/v2/keys/message -d value=Hello W Hello World { ”action”: ”set”, ”node”: { ”createdIndex”: 2, ”key”: ”/message”, ”modifiedIndex”: 2, ”value”: ”Hello world” } }
  28. 28. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . HTTP API Get the value of a key Support recursive and sorted $ etcdctl --debug get --sort --recursive /queue Cluster-Peers: http://xxxxxxxx:4001 Curl-Example: curl -X GET http://xxxxxxxxxx:4001/v2/keys/queue?recursive=true Hello World
  29. 29. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . HTTP API { ”action”: ”get”, ”node”: { ”createdIndex”: 2, ”dir”: true, ”key”: ”/queue”, ”modifiedIndex”: 2, ”nodes”: [ { ”createdIndex”: 2, ”key”: ”/queue/2”, ”modifiedIndex”: 2, ”value”: ”Job1” }, { ”createdIndex”: 3, ”key”: ”/queue/3”,
  30. 30. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Raft ノード間のコンセンサスをとるアルゴリズム スタンフォード大学の Diego Ongaro、 John Ousterhoutが作成
  31. 31. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Raft 民主的(Vote)で合理的なアルゴリズム • リーダーの選出 • ログのレプリケーション • 設定の同期 • 実用的、合理的 http://thesecretlivesofdata.com/raft/
  32. 32. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Leader Election Raft では各ノードはいずれかの役割を行う • Leader ▶ 最新の値を持つ • Follower ▶ Leaderに従う • Candidate ▶ リーダーが欠如した際の時期リーダー候補者
  33. 33. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Election Flow 投票によってリーダーを決める 1. 各自 Followeからのスタート、Leaderからのheartbeatを待つ 2. 届かない場合、Leader不在とみなし、Candidateへ 3. 選挙開始に伴いTermを+1する 4. CandidateになったノードはFollowerに投票リクエストを投げる 5. Follwerは投票リクエストを受け取り、未投票であれば投票を行う 6. Candidateはノードの過半数の投票を得られればLeaderに昇格 7. 他のノードが既に過半数を得ていればFollowerへ 8. 過半数に満たないなど場合は再選挙 3.へ戻る
  34. 34. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Term Term (期間・任期)を導入 • Leader が安定していればそのまま ▶ 大何代総長みたいなもの • Leader が不安定 ▶ 選挙になると代が+1 • 先代のLeaderの復帰 ▶ 代が変わっているのでFolloweに降格
  35. 35. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Log Replication 2 Phase Commit LogにはIndexが振られておりそれを見て古いか判断 1. Leaderへ値を通知 2. 各Followerへ値を送る 3. Followerは成功した旨をLeaderへ伝える 4. Leaderは各Followerへコミットメッセージを送る
  36. 36. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Etcd の現状 • Raft は大きなクラスタ組むのに適していない ▶ 適切なサイズは 5 - 9 ▶ Stanby Mode • Leaderのheartbeatがことごとくtimeout ▶ デフォルトで50ms毎にheartbeat ▶ peer-election-timeoutの調整 ▶ heartbeat-intervalの調整 • Discoveryで失敗した場合の復旧 ▶ 任意のノードをマニュアルで削除(etcd 0.4)
  37. 37. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Stanby Mode Etcd 0.4からサポート • クラスタサイズの設定 ▶ 最大activeノード数を設定 (9) ▶ 溢れたノードはStanby Modeへ • Stanby ノード ▶ アクセスは全てLeaderノードへリダイレクト ▶ Stanbyでも一定時間ごとにLeaderと設定を同期(5秒) • Followerへの昇格 ▶ activeノードに空きができるとFollowerへ ▶ 昇格時は再度同期
  38. 38. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Fleet
  39. 39. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Fleet SystemdとEtcdを利用した分散システムツール 低レベルのオーケストレーションツールの位置づけ • コンテナをクラスタにデプロイ • コンテナを指定マシンにデプロイ ▶ 特定のコンテナを同じマシンにデプロイ ▶ metadaにマッチングしたマシンにデプロイ • 同マシンにデプロイされないよう禁止 • コンテナの障害を検出し、他のマシンへ自動で再デプロイ • コンテナ以外でもOK • ssh トンネリングからの操作
  40. 40. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Fleet Engine と Agentに別れる • Engine ▶ Job Scheduling ▶ AgentへJobをお願い • Agent ▶ Jobの実行判断 ▶ 実際のJobを実行 ▶ D-Busからイベントを監視 ▶ StateをEngineに送信
  41. 41. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Job Schedule Flow
  42. 42. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Fleet with Systemd FleetはSystemdのUnitを対象マシンへ配布 • Service TypeのUnitとして使用 • mount, path, timerのUnitもサポート • 障害を検出するとUnitファイルごと削除 ▶ motdにて通知
  43. 43. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Fleet 拡張 [X-Fleet] セクションによる独自拡張 • X-ConditionMachineID ▶ 指定したMachineIDにデプロイ • X-ConditionMachineMetadata ▶ 指定したmetadataにマッチしたマシンにデプロイ • X-ConditionMachineOf ▶ 指定したサービスがデプロイされているマシンにデプロイ • X-Conflicts ▶ 同じサービスが同マシンにデプロイされるのを禁ずる
  44. 44. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Unit File 例 [Unit] Description=Graphite Server After=docker.service Requires=docker.service [Service] TimeoutStartSec=20m ExecStartPre=/usr/bin/docker pull mopemope/graphite-docker ExecStartPre=-/usr/bin/docker rm ”graphite-server” ExecStart=/usr/bin/docker run --rm --name ”graphite-server” -a stdout -a stderr -p 80:81 -p 81:80 -p 2003:2003 ”mopemope/graphite-docker” ExecReload=-/usr/bin/docker stop ”graphite-server” ExecReload=-/usr/bin/docker rm ”graphite-server” ExecStop=-/usr/bin/docker stop ”graphite-server” [X-Fleet] X-ConditionMachineID=359e258ac888444b8722b723c730a91a X-Conflicts=graphite.*.service
  45. 45. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Fleet の現状 • Fleet Agent Heartbeat Timeout ▶ etcdの問題 ▶ agent_ttlの調整 • Job Schduling ▶ 優先度がない(早いモノ順) • Job 登録のセキュリテイ ▶ 誰でもデプロイできる ▶ 証明書はこれから
  46. 46. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Locksmith
  47. 47. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . locksmith クラスタ上のマシンのRebootを管理する • 自動更新で一度に全てのマシン落ちないようにする • update_engineのイベントを監視 • semaphore方式でロックをかける • よくpanicを起こしている
  48. 48. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . DEMO
  49. 49. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 今後の課題
  50. 50. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . CoreOSの今後の課題 • 安定性 ▶ 各構成要素の安定 • クラスタサイズ ▶ Stanby Modeでどれくらいまで耐えれるか? • fleet などのセキュリティ ▶ unit に証明書がない(実装予定) • 高レベルのオーケストレーション ▶ コンテナ間をより簡単に連携 ▶ 総合的なツール
  51. 51. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 運用にあたっての課題 クラスタ前提での設計 • クラスタ設計 ▶ スペック、数、ストレージ容量 ▶ クラスタ内におくもの ▶ クラスタ外におくもの • オーケストレーション ▶ 高レベルのオーケストレーションツール • システム監視 ▶ メトリクス収集 ▶ ログ収集 ▶ アラート
  52. 52. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 運用するにあたっての課題 Docker前提の設計 • 外部ホスト連携 ▶ confd • 永続化データの保存先 ▶ 外部ストレージ • ディスク使用帯域の制御 ▶ blkio ▶ btrfs quota ぐらい?
  53. 53. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Q&A

×