Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Infrastrucure as a CodeにおけるJenkinsの役割

3,345 views

Published on

Jenkins ユーザ・カンファレンス 2015 東京で発表した資料です。
概要はこちら
> http://build-shokunin.org/juc2015/
セッション詳細はこちら
> http://build-shokunin.org/juc2015/sessions/#satta-3
====
デプロイの自動化やテストの自動化を導入し、継続的インテグレーションを実施されている方々は多いのではないでしょうか。
サーバ構築においても継続的インテグレーションを行う時代です。弊社では2013年にChefを導入、その後Chefでどこまで構築するか、テストはどうやって回すかを試行錯誤しておりました。そこで環境構築を4つのレイヤーに分けそれぞれの役割を決め、これまで複雑化していたサーバ構築から本番稼働までの流れを明確にしました。
今回の発表では、「Infrastructure as a Codeのテスト駆動開発への取り組み」と「Jenkinsの冗長構成などを行って安定稼働させるための仕組み」についてお話します。
====

Published in: Technology
  • Dating direct: ❶❶❶ http://bit.ly/39sFWPG ❶❶❶
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Follow the link, new dating source: ❶❶❶ http://bit.ly/39sFWPG ❶❶❶
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

Infrastrucure as a CodeにおけるJenkinsの役割

  1. 1. 「Infrastructure as a CodeにおけるJenkinsの役割」 〜環境構築も継続的インテグレーションを行う時代です〜 Copyright 2015 CYBIRD Co., Ltd. All Rights Reserved. 株式会社サイバード 藤原 涼 本田 恭 Jenkins ユーザ・カンファレンス 2015 東京
  2. 2. [PDF] http://goo.gl/f96u5k [PowerPoint] http://goo.gl/qqhdoo [関連資料] AutoScale×ゲーム http://goo.gl/i0cXfH (前半) http://goo.gl/MKgQPA (後半) 資料はこちらからも閲覧できます
  3. 3. Agenda 〜概念編〜 サーバ構築フローとJenkinsの役割 〜実践編〜 サーバ構築の実践例とCI環境
  4. 4. 自己紹介 ● 本田 恭 ● 2012年新卒入社 (3年目) ● Twitter: @Altsencturely ● インフラ系男子
  5. 5. Agenda 〜実践編〜 1: 各レイヤーの実践方法 2: JenkinsによるChef CI 3: Jenkins冗長化 4: やってみた結果
  6. 6. Agenda 〜実践編〜 1: 各レイヤーの実践方法 2: JenkinsによるChef CI 3: Jenkins冗長化 4: やってみた結果
  7. 7. Bootstrapping Releasalization Orchestration Configuration 再 掲
  8. 8. レイヤー ● Bootstrapping ● Configuration ● Orchestration ● Releasalization
  9. 9. Bootstrapping ● OSのインストールとサーバ起動 ● Configurationを実行するための準備 OSのプロビジョニング Bootstrapping Configuration Orchestration 再 掲
  10. 10. Bootstrapping実践 -物理- ● Kickstartで実行 ○ OSインストール ○ ディスクのパーティション設定 ○ NIC, Routingの設定 ○ SELinux無効化 ○ 管理ユーザーの作成(Chef実行ユーザー) ■ useradd ■ authorized_keys
  11. 11. Bootstrapping実践 -クラウド- ● Kickstartの内容を実行しイメージ化 ○ OSインストール OSの選択 ○ ディスクのパーティション設定 Volume設定 ○ NIC, Routingの設定 Network Interface設定 ○ SELinux無効化 ○ 管理ユーザーの作成(Chef実行ユーザー) ■ useradd ■ authorized_keys
  12. 12. Bootstrapとは 物理 クラウド 共通 ● SELinux無効 ● 管理ユーザー作成 ● OSインストール ● パーティション ● NICやRouting ● OS選択 ● Volume設定 ● Network設定
  13. 13. Bootstrapping実践 ● Kickstartをベースに作業 ○ 物理/クラウド両方で同じように考えられるように ● 最低限の作業のみ行う ○ インストールや設定は他のレイヤーで行う ○ Chefが実行できる状態にするだけ
  14. 14. レイヤー ● Bootstrapping ● Configuration ● Orchestration ● Releasalization
  15. 15. Configuration ● ミドルウェアのセットアップ ● 対象サーバの役割に応じた設定 ● サーバ単体で完結するような処理 システム構成のプロビジョニング 構成管理ツールが得意な領域 Bootstrapping Configuration Orchestration 再 掲
  16. 16. Configuration実践
  17. 17. Configuration実践 ● Chef Solo ○ Chef Server運用の問題を解決 ○ JenkinsがChefを管理できるように ● Jenkinsから対象のサーバに対してknife solo 実行
  18. 18. Configuration実践 http://www.levihackwith.com/wp-content/uploads/2011/10/github-logo.png Server knife solo レシピたち(一部抜粋) hosts iptables user(sshd, sudo) PHP ImageMagick httpd GlusterFS Zabbix Agent Fluentd Serf Chef Repository
  19. 19. Configuration実践 ● Chef Soloの利用 ○ Chef Server運用上発生した問題点を解決 ● Jenkinsの利用 ○ Chefの実行がより簡単になった ○ Chef実行結果がログに残る ○ 成功/失敗の管理できる
  20. 20. レイヤー ● Bootstrapping ● Configuration ● Orchestration ● Releasalization
  21. 21. Orchestration ● サーバ単体では完結しない処理を担う ○ GlusterFSのClusterに追加 ○ Jenkinsからソースコードデプロイ ○ zabbix-agentの起動など アプリケーションのプロビジョニング Bootstrapping Configuration Orchestration デプロイツールなどが得意な領域 再 掲
  22. 22. Orchestration実践 http://pocketstudio.jp.s3.amazonaws.com/log3/wp-content/uploads/2013/11/serf-logo.png S E R F
  23. 23. Orchestration実践 ● Serf ○ イベントを受けてそれぞれのNodeでやりたい処理を実 行させる ● Jenkins ○ サーバのSerfクラスタ参加イベントを検知 ○ Serf経由でOrchestration処理イベント発火
  24. 24. Serfって何? ● Go言語製オーケストレーションツール ○ メンバーシップ ○ 障害検知と復旧 ○ カスタムイベント伝播 ● ゴシッププロトコル
  25. 25. Serfって何? serf 使い方
  26. 26. これまでのSerfの利用方法 http://www.awssummittokyo.com/ S E R F
  27. 27. slideshare autoscale ゲーム http://goo.gl/MKgQPA
  28. 28. Configurationおさらい Server knife solo レシピたち(一部抜粋) hosts iptables user(sshd, sudo) PHP ImageMagick httpd GlusterFS Zabbix Agent Fluentd Serf Chef Repository
  29. 29. Configurationおさらい Chef Repository Server knife solo レシピたち(一部抜粋) hosts iptables user(sshd, sudo) PHP ImageMagick httpd GlusterFS Zabbix Agent Fluentd Serf
  30. 30. Orchestration実践 Server Server Server serf-members serf join Server Serf Cluster Serf
  31. 31. Orchestration実践 Server Server Server 【event】 member-join Server
  32. 32. Orchestration実践 Server Server Server 【event】 member-join Server
  33. 33. Orchestration実践 Server Server Server Orchestration Build Flow実行 Server
  34. 34. Orchestration実践 Server Server Server Server JoinしたServerのTag でJob内容切り分け Web => Nginx start Img => httpd start
  35. 35. Orchestration実践 Server Server Server Server 【query】 httpd start ※-nodeで対象指定
  36. 36. Orchestration実践 Server Server Server Server 【query】 httpd start
  37. 37. Orchestration実践 Server Server Server Server 【query】 httpd start Serf query ● Serfの処理結果を取得できる ● JenkinsがBuild Flowを途中で 止 められる
  38. 38. Orchestration実践 Server Server Server Server 【query】 httpd start Serf query ● Serfの処理結果を取得できる ● JenkinsがBuild Flowを途中で 止 められる 失敗したらそこで終了させる
  39. 39. SerfのTags ● Configuration(Chef)で設定 ○ Orchestrationの処理内容はChefのRoleと密接に関係 ● TagsはChefのRoleの要約
  40. 40. SerfのTags例 { "node_name": "jenkins", "encrypt_key": "XXXXXXXXXXXXXX", "interface": "eth0", "event_handlers" : [ "user:shell=/bin/sh", "query:shell=/bin/sh" ], "tags": { "role": "img", "place": "jenkins-conference", "at": "tokyo" } }
  41. 41. SerfのTags例 { "node_name": "jenkins", "encrypt_key": "XXXXXXXXXXXXXX", "interface": "eth0", "event_handlers" : [ "user:shell=/bin/sh", "query:shell=/bin/sh" ], "tags": { "role": "img", "place": "jenkins-conference", "at": "tokyo" } } Tagsの値に応じてJobの分岐
  42. 42. Orchestration実践 ● SerfでConfigurationとOrchestrationを連携 ○ ChefでSerfをagentとして起動 ○ Serfの起動をJenkinsが受けて開始 ● JenkinsがSerfを操作 ○ queryを使って成功/失敗の判断 ○ 処理内容はTagsで分岐 ○ Serf経由で実行するのでSSH必要なし
  43. 43. レイヤー ● Bootstrapping ● Configuration ● Orchestration ● Releasalization
  44. 44. Releasalization(造語) ● Orchestrationの処理内容をテスト ○ Serverspec ● サーバを本番環境に投入 ○ LBに追加 サービス提供のプロビジョニング Configuration Bootstrapping Releasalization Orchestration 再 掲
  45. 45. Serverspec ● サーバ環境の自動テストフレームワーク ○ RSpecの機能を使って書ける ○ http://serverspec.org/
  46. 46. Orchestrationのおさらい Server Server Server Server 【query】 httpd start
  47. 47. Server Server Server Releasalization実践 Server Serverspec
  48. 48. Releasalization実践 Server Server Server Serverspec Server ● Orchestrationの内容をテスト ● Configurationのテストとは別 ○ CI環境の話で紹介 Serverspec
  49. 49. Server Server Server Releasalization実践 LB追加 Server
  50. 50. Server Server Server Releasalization実践 Server LB01 LB02
  51. 51. Server Server Server Releasalization実践 Server LB01 LB02 すべて成功したら本番環境投入
  52. 52. Releasalization実践 ● Serverspecによるテスト ○ 中途半端なサーバを本番投入しなくてすむ ○ Orchestration処理の品質向上 ● 全Build Flowが成功すると本番投入
  53. 53. Bootstrapping AMI/Kickstart Releasalization JOB JOB Orchestration JOB JOB Configuration JOB JOB Server
  54. 54. Releasalization JOB JOB Orchestration JOB JOB Configuration JOB JOB Bootstrapping AMI/Kickstart Server
  55. 55. Server Serf serf-members Releasalization JOB JOB Orchestration JOB JOB Configuration JOB JOB Bootstrapping AMI/Kickstart
  56. 56. Releasalization JOB JOB Orchestration JOB JOB Configuration JOB JOB Server 【query】 httpd start Bootstrapping AMI/Kickstart
  57. 57. Server Releasalization JOB JOB Orchestration JOB JOB Configuration JOB JOB Serverspec Bootstrapping AMI/Kickstart
  58. 58. Releasalization JOB JOB Orchestration JOB JOB Configuration JOB JOB Server Bootstrapping AMI/Kickstart
  59. 59. Agenda 〜実践編〜 1: 各レイヤーの実践方法 2: JenkinsによるChef CI 3: Jenkins冗長化 4: やってみた結果
  60. 60. Jenkinsの役割 -今回- ● ソースコードのDeploy ● UnitTestによるCI ● サーバ構築の自動化管理 ○ Chef ○ Orchestration ○ Serverspec ■ ChefのCI ■ Releasalization
  61. 61. Chefの見直し ● ChefをConfigurationに適応 ○ 他サービスとの連携削除 ○ 冪等性の担保 ○ Cookbook間の依存をなくす
  62. 62. Chefの見直し ● ChefをConfigurationに適応 ○ 他サービスとの連携削除 ○ 冪等性の担保 ○ Cookbook間の依存をなくす Chef開発方法の見直しが必要
  63. 63. Chefの開発方法 -これまで- ● ChefのCookbook作成 ● レシピ開発 ● (Chef Serverに登録) ● EC2やVagrantでInstance起動 ● Chef実行 ● GitHubにpush
  64. 64. ● ChefのCookbook作成 ● レシピ開発 ● (Chef Serverに登録) ● EC2やVagrantでInstance起動 ● Chef実行 ● GitHubにpush Chefの開発方法 -これまで- つらい
  65. 65. Chefの開発方法 -要望- ● レシピを書いてすぐChefを実行できる ● Serverspecでテストが簡単にできる ● まっさらな状態が簡単に作れる
  66. 66. http://blog.docker.com/wp-content/uploads/2013/06/Docker-logo-011.png
  67. 67. Chefの開発方法 -改善策- ● DockerとChef Zeroをインストール ○ AWS EC2やローカルPC ● Chef Repositoryをコンテナにmount ● コンテナ起動 ○ Chefのレシピとかupload ○ chef-client実行 ● Serverspecでテスト実行
  68. 68. Chefの開発方法 Chef Repository knife.rb KEY /chef /root/.chef Container Chef Zero ● upload ● chef-client Serverspec実行 Host
  69. 69. Chefの開発方法 Chef Repository knife.rb KEY /chef /root/.chef Container Chef Zero ● upload ● chef-client Serverspec実行 Host Chefのテスト駆動開発ができる
  70. 70. Chefの開発方法 Chef Repository knife.rb KEY /chef /root/.chef Container Chef Zero ● upload ● chef-client Serverspec実行 Host Jenkinsに同じことをさせる
  71. 71. JenkinsでChef CI https://wiki.jenkins-ci.org/download/attachments/72418012/Capture+d%E2%80%99%C3%A9cran+2014-04-08+%C3%A0+12.12.37.png https://octodex.github.com/images/jenktocat.jpg
  72. 72. Chef Repository Pull Request ghprb-plugin knife.rb pem /chef /root/.chef Container Chef Zero ● upload ● chef-client Serverspec実行 JenkinsでChef CI
  73. 73. Chef Repository Pull Request ghprb-plugin knife.rb pem /chef /root/.chef Container Chef Zero ● upload ● chef-client Serverspec実行 ● Chefが実行するRoleの決め方 ○ すべてのRoleを実行するのは時間がかかる ○ 他のレシピでFailしたら意味不明 JenkinsでChef CI
  74. 74. Chef Repository Pull Request ghprb-plugin knife.rb pem /chef /root/.chef Container Chef Zero ● upload ● chef-client Serverspec実行 ● Chefが実行するRoleの決め方 ○ すべてのRoleを実行するのは時間がかかる ○ 他のレシピでFailしたら意味不明 ● Branch名 ≒ Role名 ○ feature/fix_httpd_php ○ roles/FIX_HTTPD_PHP.json JenkinsでChef CI
  75. 75. Chefの開発方法 -結果- ● Chefの開発/レビューが格段に早くなる ○ テストによって品質向上 ● だれでもChefの開発に参入できる ○ レシピの属人化消滅 ● Chef以外にも使える仕組み ○ 社内の他Provisioning Toolsにも対応可能
  76. 76. ● Chefの開発/レビューが格段に早くなる ○ テストによって品質向上 ● だれでもChefの開発に参入できる ○ レシピの属人化消滅 ● Chef以外にも使える仕組み ○ 社内の他Provisioning Toolsにも対応可能 Chefの開発方法 -結果- ちょっとモダンな開発
  77. 77. ChefをChefらしく使う Chefで構成管理とCIが実現 ● ChefをConfigurationに適応 ○ 他サービスとの連携削除 ○ 冪等性の担保 ○ Cookbook間の依存をなくす
  78. 78. Agenda〜実践編〜 1: 各レイヤーの実践方法 2: JenkinsによるChef CI 3: Jenkins冗長化 4: やってみた結果
  79. 79. Jenkinsの役割 -今回- ● ソースコードのDeploy ● UnitTestによるCI ● サーバ構築の自動化管理 ○ Chef ○ Orchestration ○ Serverspec ■ ChefのCI ■ Releasalization
  80. 80. Jenkinsの役割 -今回- ● ソースコードのDeploy ● UnitTestによるCI ● サーバ構築の自動化管理 ○ Chef ○ Orchestration ○ Serverspec ■ ChefのCI ■ Releasalization Jenkinsが死んだら詰む
  81. 81. Jenkinsの冗長構成 XXX.XXX.XXX.XXX Serf Cluster http://cdn.freshdesk.com/data/helpdesk/attachments/production/1000124656/original/base-aws_awscloud.png
  82. 82. Jenkinsの冗長構成 XXX.XXX.XXX.XXX
  83. 83. Jenkinsの冗長構成 【event】 member-failed XXX.XXX.XXX.XXX
  84. 84. Jenkinsの冗長構成 EIP付け替え 要求 XXX.XXX.XXX.XXX
  85. 85. Jenkinsの冗長構成 XXX.XXX.XXX.XXX
  86. 86. Jenkinsの冗長構成 XXX.XXX.XXX.XXX
  87. 87. Jenkinsの冗長構成 with Serf ● 仕組みが単純 ○ Heartbeatなどを入れる必要がない ○ Jenkinsサーバ自体のdownを検知すれば自動で切り替 わる ● Serfの検知/伝播力高い ○ 100台のClusterでも2秒程度しかかからないので https://www.serfdom.io/docs/internals/simulator.html
  88. 88. Agenda 〜実践編〜 1: 各レイヤーの実践方法 2: JenkinsによるChef CI 3: Jenkins冗長化 4: やってみた結果
  89. 89. やってみた結果 -Configuration- ● Chefが独立してくれた ○ 他サービスと連携しないからテストやCIもできる ○ 他プロジェクトで使いまわし可能 ● Provisioning Tools開発はDocker使うのいい ○ 開発/検証早くなる ○ パッケージ入れ忘れがなくなるのでレシピの品質が高く なる
  90. 90. ● Chefが独立してくれた ○ 他サービスと連携しないからテストやCIもできる ○ 他プロジェクトで使いまわし可能 ● Provisioning Tools開発はDocker使うのいい ○ 開発/検証早くなる ○ パッケージ入れ忘れがなくなるのでレシピの品質が高く なる やってみた結果 -Configuration- Chefに無理させないの大事
  91. 91. やってみた結果 -Orchestration- ● Serfのおかげ感がすごい ○ バイナリ置くだけですぐ使い始められる ○ やれることが柔軟で設定もシンプル ○ TagsとQueryの万能感がすごい ○ SSH経由からSerf経由に
  92. 92. やってみた結果 -Orchestration- ● Serfのおかげ感がすごい ○ バイナリ置くだけですぐ使い始められる ○ やれることが柔軟で設定もシンプル ○ TagsとQueryの万能感がすごい ○ SSH経由からSerf経由に SerfとJenkins超仲良し
  93. 93. やってみた結果 -Releasalization- ● 本番投入前のテスト大事 ○ 一定の品質を担保できる ○ 本番に変なサーバが入らないから心に優しい ● Serverspec便利 ○ Chefのテスト以外でも使える
  94. 94. やってみた結果 -Releasalization- やっぱりテストは大事 ● 本番投入前のテスト大事 ○ 一定の品質を担保できる ○ 本番に変なサーバが入らないから心に優しい ● Serverspec便利 ○ Chefのテスト以外でも使える
  95. 95. やってみた結果 -Jenkins- ● レイヤーが明確化する ● Jobのログが残る ○ 失敗したサーバで原因探す必要がない ○ Jobが何をやっているかわかる ● Build Flowを途中で止められる ○ 不完全なサーバが本番投入されない
  96. 96. ● レイヤーが明確化する ● Jobのログが残る ○ 失敗したサーバで原因探す必要がない ○ Jobが何をやっているかわかる ● Build Flowを途中で止められる ○ 不完全なサーバが本番投入されない やってみた結果 -Jenkins- 構築自動化において重要人物
  97. 97. Jenkinsへのメッセージ ● Jenkinsがシステムの中心になりつつある ○ Deploy, Build, CI以外の利用シーンがある ○ Jenkinsが止まってはいけない ○ 活用方法をもっと広く共有していきたい
  98. 98. Jenkinsへのメッセージ 執事から指揮官に出世 ● Jenkinsがシステムの中心になりつつある ○ Deploy, Build, CI以外の利用シーンがある ○ Jenkinsが止まってはいけない ○ 活用方法をもっと広く共有していきたい
  99. 99. ありがとう、Jenkins 私達からJenkinsへのメッセージ
  100. 100. Copyright 2015 CYBIRD Co., Ltd. All Rights Reserved.

×