Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
[夏休み自由研究]
ラズパイ2で動く Docker PaaS
を作ってみたよ
自己紹介
 佐藤 哲大(tetz)
 本勉強会の企画、運営をしてます
 某ネットワークベンダで、SDN(っぽい)仕
事をしてます
2
tl;dr
 ラズパイ2で動く Docker PaaS を自作してみた
ので、その仕組みを紹介します
 自作した PaaS を CI (継続的インテグレーショ
ン)してみたので、その仕組みを紹介します
 テストする環境を構築した後に、テストするという意味
で、インフラ CI とやっていることは同じ
3
デモ①
 <paas_name> は、既存の Linux コマンドと Linux ユーザとコ
ンフリクトしなければ、なんでも可
 <paas_name> は、ユーティリティコマンドと git リモートリポジトリ
の名前に使われる
 <paas_name> scale web=3
 git push <paas_name> master
4
$ wget http://raw.github.com/tetsusat/raspaas/master/bootstrap.sh
$ chmod +x bootstrap.sh
$ sudo ./bootstrap.sh <paas_name>
そもそも Docker PaaS のうれしさ
5
Docker PaaS従来のPaaS
ハードウェア
ハイパーバイザ
OS
ハードウェア
OS
Docker エンジン
実行環境
(言語、ライブラリ、ミド
ルウェア)
実行環境
(言語、ライブラリ、ミド
ルウェア)
アプリケーション アプリケーション
 実行環境が多様化すると、PaaS ユー
ザはうれしいが、PaaS 事業者はメン
テナンスが大変
 PaaS ユーザは Docker コンテナで
動作させられる言語、ライブラリ、ミド
ルウェアを自由に利用できる
 PaaS 事業者は Docker コンテナが
動作する環境を用意すればいい
 どちらもハッピー
なぜ、ラズパイ2で Docker PaaS?
 建前
 ラズパイ2からクアッドコアに。これをカツカツに使いたい
 本音
 x86 だと、すでにすぐれた Docker PaaS がかなりある(>_<)
6
PaaS の デファクト - Heroku
 キャッチーでポップなワークフローにより一世風靡
7
$ heroku create
Creating polar-inlet-4930... done, stack is cedar-14
http://polar-inlet-4930.herokuapp.com/ | https://git.heroku.com/polar-inlet-4930.git
Git remote heroku added
$ heroku scale web=2
Scaling dynos... done, now running web at 2:standard-1x
$ git push heroku master
Fetching repository, done.
Counting objects: 10, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 876 bytes | 0 bytes/s, done.
Total 6 (delta 4), reused 0 (delta 0)
....
Heroku Inspired な
Docker PaaS?
 最小公倍数的な特徴(私見)
 ワークフローが Heroku っぽい
 <heroku> create
 git push <heroku> master
 <heroku> scale web=3
 Buildpack 対応(後述)
 具体例
 シングルノードで動作する Dokku
 マルチノードで動作する Deis、Flynn
8
Raspaas
https://github.com/tetsusat/raspaas
 利用可能な環境
 x86_64
 Ubuntu14.04 / Docker 1.6 # Vagrantfile 参照
 ARMv7
 Hypriot Docker Image for Raspberry Pi (Version 0.4)
 http://blog.hypriot.com/downloads/
 Scaleway (www.scaleway.com)
 できること
 git push … で Docker コンテナが立ち上がる
 Buildpack には未対応
 Dockerfile を自分で用意する必要あり (>_<)
 オートスケーリング (heroku scale web=3 みたいなやつ) 9
ちなみに Buildpack
 アプリケーションを自動で検知し、実行する環境を用意する Heroku
の仕組み
10
[参考] Buildpack Adventure 2 (http://ba2.herokuapp.com/)
Heroku Inspired な
Docker PaaS 比較(不完全版)
11
Dokku Raspaas
CPU アーキテクチャ x86_64 x86_64 x86_64 x86_64 / ARMv7
OS CoreOS Ubuntu Ubuntu Ubuntu
ノード マルチ マルチ シングル シングル
アプリケーションの
デプロイ方式
Buildpack
Dockerイメージ
Dockerfile
Buildpack
Dockerイメージ
Buildpack
Dockerfile
Dockerfile
デモ(つづき)
12
$ git clone https://github.com/tetsusat/ruby-sample.git
$ teroku create
$ git push teroku master
$ teroku scale web=3
利用コンポーネント
 gitreceive (https://github.com/progrium/gitreceive/)
 git push した際の git フックを仕掛けるためのユーティリティ
 Consul (https://www.consul.io/)
 サービスディスカバリ
 Registrar (https://hub.docker.com/r/gliderlabs/registrator/)
 Docker API からサービスを検知して Consul へ登録
 Consul Template (https://github.com/hashicorp/consul-template)
 Consul イベントを検知して Nginx の設定を更新
 Nginx (http://nginx.org/)
 ルータ(HTTP リクエストをロードバランス)
 Docker Compose (https://docs.docker.com/compose/)
 Docker コンテナ管理のユーティリティ
13
git pushでデプロイできる仕組み
14
Git Repo
git push teroku master
① git clone …
② docker build ….
③ docker run …
オートスケーリングの仕組み
15
Docker エンジン
registrar
① 登録
Nginx +
consul template
app
consul
② 設定更新
teroku scale web=3
app app
Docker コンテナ(システム)
Docker コンテナ(ユーザ)
HTTP リクエスト
Docker API
Consul Template
16
{{range services}}upstream {{.Name}} {
{{range service .Name}}server 10.0.2.15:{{.Port}};
{{else}}server 127.0.0.1:65535; # force a 502{{end}}
}{{end}}
server {
listen 80;
{{range services}}location /{{.Name}} {
proxy_pass http://{{.Name}}/;
}{{end}}
}
upstream ruby-sample {
server 10.0.2.15:32768;
server 10.0.2.15:32769;
server 10.0.2.15:32770;
}
server {
listen 80;
}location /ruby-sample {
proxy_pass http://ruby-sample/;
}
}
/etc/nginx/conf.d/service.conf
(一部のみ)/templates/service.ctmpl
 Consul のイベントをトリガーにテンプレートから特定のファイル(設
定ファイルなど)を動的に生成し、アクション(サービスのリローなど)
を実行
Scaleway
 ARMベースのベアメタルクラウドサービス
 4コアCPU+50GB SSD で €2.99 (安っ!)
17
Drone+Gitlab+Vagrantで
PaaS の CI 環境を構築してみた
18
drone.io
 Travis CI、Circle CI のように、Github 等の Git ホスティング
サービスと連携できるホスティング型の CI ツール
 ホスティング版だけでなく、オンプレ環境で動作するオープンソース
版がある
 Drone + Gitlab + Vagrant で PaaS の CI 環境をオンプレに
無料で作れそう。。。
19
PaaS の CI
20
Drone Host Vagrant/Virtualbox
Drone
Docker Engine
app app app
① Gitlab へ git push
② Gitlab から Drone を呼び出し
③ Drone がテスト用に Docker コンテナを生成
④ AnsibleでVagrant VM の起動
⑤ Ansibleで PaaS (raspaas) のインストール
⑥ Ansible で App (ruby-sample) のインストール
⑦ Infrataster でテスト
⑧ Ansible で App のオートスケーリング
⑨ Infrataster でテスト
⑩ AnsibleでVagrant VM の廃棄
④
⑩
⑤ ⑥ ⑧
⑦ ⑨
Docker コンテナ
VirtualBox VM
Infrataster
Ansible
①
②
③
Serverspec と Infrataster
21
[参考] Introduction Infrataster
(https://speakerdeck.com/ryotarai/introducing-infrataster)
.drone.yml
22
image: "tetz/drone-npstudy"
git:
path:$$GITLAB/tetsusat/raspaas
script:
- rm $HOME/.ssh/id_rsa
- echo 'StrictHostKeyChecking=no' > $HOME/.ssh/ssh-config
- ssh-keygen -f $HOME/.ssh/id_rsa -t rsa -q -N ''
- sshpass -p $$VAGRANT_HOST_PASS ssh-copy-id
$$VAGRANT_HOST_USER@$$VAGRANT_HOST
- echo 'vagrant-host ansible_ssh_host=$$VAGRANT_HOST
ansible_ssh_user=$$VAGRANT_HOST_USER' > hosts
- echo 'vagrant-guest ansible_ssh_port=22222 ansible_ssh_host=$$VAGRANT_HOST
ansible_ssh_user=$$VAGRANT_USER' >> hosts
- ansible-playbook -i hosts playbooks/vagrant-up.yml
- sshpass -p vagrant ssh-copy-id 'vagrant@$$VAGRANT_HOST -p 22222'
- ansible-playbook -i hosts playbooks/raspaas-setup.yml
- ansible-playbook -i hosts playbooks/app-setup.yml
- cd tests
- rspec spec/raspaas_app_spec.rb
- ansible-playbook -i ../hosts ../playbooks/app-auto-scale.yml
- rspec spec/raspaas_auto_scale_spec.rb
- ansible-playbook -i ../hosts ../playbooks/vagrant-destroy.yml
Ansibleインベントリ作成
Ansible Playbook 実行
Infrataster 実行
Ansible Playbooks
Raspaas のセットアップ
23
- hosts: vagrant-guest
tasks:
- name: restart docker engine
command: sudo service docker restart
- name: download bootstrap.sh
command: wget http://raw.github.com/tetsusat/raspaas/master/bootstrap.sh
- name: chmod +x bootstrap.sh
command: chmod +x bootstrap.sh
- name: start bootstrap script
command: sudo ./bootstrap.sh teroku
playbooks/raspaas-setup.yml
Ansible Playbooks
サンプル App のセットアップ
24
- hosts: vagrant-guest
tasks:
- name: change ssh config for git push
shell: echo 'StrictHostKeyChecking no' > $HOME/.ssh/config
- name: git clone
command: git clone https://github.com/tetsusat/ruby-sample.git
- name: teroku create
command: teroku create
args:
chdir: ruby-sample/
- name: git push
command: git push teroku master
args:
chdir: ruby-sample/
playbooks/app-setup.yml
Infrastater Spec ファイル
サンプル App のテスト
25
require 'spec_helper'
describe server(:vagrant_host) do
describe http('http://<vagrant_host>:8080/ruby-sample') do
it "responds content including 'Hello, world'" do
expect(response.body).to include('Hello, world')
end
end
end
tests/spec/raspaas_app_spec.rb
Infrastater Spec ファイル
オートスケーリングのテスト
26
require 'spec_helper'
seen = []
describe server(:vagrant_host) do
3.times do
describe http('http://<vagrant_host>:8080/ruby-sample') do
it "responds content including 'Hello, world' from unseen container" do
see = ""
if response.body =~ /Hello, world from (w+)/
see = $1
end
expect(seen).not_to include(see)
seen << see
end
end
end
end
tests/spec/raspaas_auto_scale_spec.rb
実行イメージ
27
失敗 成功
おわり
ご清聴、ありがとうございました
m(_ _)m
28

More Related Content

ラズパイ2で動く Docker PaaSを作ってみたよ

  • 2. 自己紹介  佐藤 哲大(tetz)  本勉強会の企画、運営をしてます  某ネットワークベンダで、SDN(っぽい)仕 事をしてます 2
  • 3. tl;dr  ラズパイ2で動く Docker PaaS を自作してみた ので、その仕組みを紹介します  自作した PaaS を CI (継続的インテグレーショ ン)してみたので、その仕組みを紹介します  テストする環境を構築した後に、テストするという意味 で、インフラ CI とやっていることは同じ 3
  • 4. デモ①  <paas_name> は、既存の Linux コマンドと Linux ユーザとコ ンフリクトしなければ、なんでも可  <paas_name> は、ユーティリティコマンドと git リモートリポジトリ の名前に使われる  <paas_name> scale web=3  git push <paas_name> master 4 $ wget http://raw.github.com/tetsusat/raspaas/master/bootstrap.sh $ chmod +x bootstrap.sh $ sudo ./bootstrap.sh <paas_name>
  • 5. そもそも Docker PaaS のうれしさ 5 Docker PaaS従来のPaaS ハードウェア ハイパーバイザ OS ハードウェア OS Docker エンジン 実行環境 (言語、ライブラリ、ミド ルウェア) 実行環境 (言語、ライブラリ、ミド ルウェア) アプリケーション アプリケーション  実行環境が多様化すると、PaaS ユー ザはうれしいが、PaaS 事業者はメン テナンスが大変  PaaS ユーザは Docker コンテナで 動作させられる言語、ライブラリ、ミド ルウェアを自由に利用できる  PaaS 事業者は Docker コンテナが 動作する環境を用意すればいい  どちらもハッピー
  • 6. なぜ、ラズパイ2で Docker PaaS?  建前  ラズパイ2からクアッドコアに。これをカツカツに使いたい  本音  x86 だと、すでにすぐれた Docker PaaS がかなりある(>_<) 6
  • 7. PaaS の デファクト - Heroku  キャッチーでポップなワークフローにより一世風靡 7 $ heroku create Creating polar-inlet-4930... done, stack is cedar-14 http://polar-inlet-4930.herokuapp.com/ | https://git.heroku.com/polar-inlet-4930.git Git remote heroku added $ heroku scale web=2 Scaling dynos... done, now running web at 2:standard-1x $ git push heroku master Fetching repository, done. Counting objects: 10, done. Delta compression using up to 4 threads. Compressing objects: 100% (6/6), done. Writing objects: 100% (6/6), 876 bytes | 0 bytes/s, done. Total 6 (delta 4), reused 0 (delta 0) ....
  • 8. Heroku Inspired な Docker PaaS?  最小公倍数的な特徴(私見)  ワークフローが Heroku っぽい  <heroku> create  git push <heroku> master  <heroku> scale web=3  Buildpack 対応(後述)  具体例  シングルノードで動作する Dokku  マルチノードで動作する Deis、Flynn 8
  • 9. Raspaas https://github.com/tetsusat/raspaas  利用可能な環境  x86_64  Ubuntu14.04 / Docker 1.6 # Vagrantfile 参照  ARMv7  Hypriot Docker Image for Raspberry Pi (Version 0.4)  http://blog.hypriot.com/downloads/  Scaleway (www.scaleway.com)  できること  git push … で Docker コンテナが立ち上がる  Buildpack には未対応  Dockerfile を自分で用意する必要あり (>_<)  オートスケーリング (heroku scale web=3 みたいなやつ) 9
  • 10. ちなみに Buildpack  アプリケーションを自動で検知し、実行する環境を用意する Heroku の仕組み 10 [参考] Buildpack Adventure 2 (http://ba2.herokuapp.com/)
  • 11. Heroku Inspired な Docker PaaS 比較(不完全版) 11 Dokku Raspaas CPU アーキテクチャ x86_64 x86_64 x86_64 x86_64 / ARMv7 OS CoreOS Ubuntu Ubuntu Ubuntu ノード マルチ マルチ シングル シングル アプリケーションの デプロイ方式 Buildpack Dockerイメージ Dockerfile Buildpack Dockerイメージ Buildpack Dockerfile Dockerfile
  • 12. デモ(つづき) 12 $ git clone https://github.com/tetsusat/ruby-sample.git $ teroku create $ git push teroku master $ teroku scale web=3
  • 13. 利用コンポーネント  gitreceive (https://github.com/progrium/gitreceive/)  git push した際の git フックを仕掛けるためのユーティリティ  Consul (https://www.consul.io/)  サービスディスカバリ  Registrar (https://hub.docker.com/r/gliderlabs/registrator/)  Docker API からサービスを検知して Consul へ登録  Consul Template (https://github.com/hashicorp/consul-template)  Consul イベントを検知して Nginx の設定を更新  Nginx (http://nginx.org/)  ルータ(HTTP リクエストをロードバランス)  Docker Compose (https://docs.docker.com/compose/)  Docker コンテナ管理のユーティリティ 13
  • 14. git pushでデプロイできる仕組み 14 Git Repo git push teroku master ① git clone … ② docker build …. ③ docker run …
  • 15. オートスケーリングの仕組み 15 Docker エンジン registrar ① 登録 Nginx + consul template app consul ② 設定更新 teroku scale web=3 app app Docker コンテナ(システム) Docker コンテナ(ユーザ) HTTP リクエスト Docker API
  • 16. Consul Template 16 {{range services}}upstream {{.Name}} { {{range service .Name}}server 10.0.2.15:{{.Port}}; {{else}}server 127.0.0.1:65535; # force a 502{{end}} }{{end}} server { listen 80; {{range services}}location /{{.Name}} { proxy_pass http://{{.Name}}/; }{{end}} } upstream ruby-sample { server 10.0.2.15:32768; server 10.0.2.15:32769; server 10.0.2.15:32770; } server { listen 80; }location /ruby-sample { proxy_pass http://ruby-sample/; } } /etc/nginx/conf.d/service.conf (一部のみ)/templates/service.ctmpl  Consul のイベントをトリガーにテンプレートから特定のファイル(設 定ファイルなど)を動的に生成し、アクション(サービスのリローなど) を実行
  • 18. Drone+Gitlab+Vagrantで PaaS の CI 環境を構築してみた 18
  • 19. drone.io  Travis CI、Circle CI のように、Github 等の Git ホスティング サービスと連携できるホスティング型の CI ツール  ホスティング版だけでなく、オンプレ環境で動作するオープンソース 版がある  Drone + Gitlab + Vagrant で PaaS の CI 環境をオンプレに 無料で作れそう。。。 19
  • 20. PaaS の CI 20 Drone Host Vagrant/Virtualbox Drone Docker Engine app app app ① Gitlab へ git push ② Gitlab から Drone を呼び出し ③ Drone がテスト用に Docker コンテナを生成 ④ AnsibleでVagrant VM の起動 ⑤ Ansibleで PaaS (raspaas) のインストール ⑥ Ansible で App (ruby-sample) のインストール ⑦ Infrataster でテスト ⑧ Ansible で App のオートスケーリング ⑨ Infrataster でテスト ⑩ AnsibleでVagrant VM の廃棄 ④ ⑩ ⑤ ⑥ ⑧ ⑦ ⑨ Docker コンテナ VirtualBox VM Infrataster Ansible ① ② ③
  • 21. Serverspec と Infrataster 21 [参考] Introduction Infrataster (https://speakerdeck.com/ryotarai/introducing-infrataster)
  • 22. .drone.yml 22 image: "tetz/drone-npstudy" git: path:$$GITLAB/tetsusat/raspaas script: - rm $HOME/.ssh/id_rsa - echo 'StrictHostKeyChecking=no' > $HOME/.ssh/ssh-config - ssh-keygen -f $HOME/.ssh/id_rsa -t rsa -q -N '' - sshpass -p $$VAGRANT_HOST_PASS ssh-copy-id $$VAGRANT_HOST_USER@$$VAGRANT_HOST - echo 'vagrant-host ansible_ssh_host=$$VAGRANT_HOST ansible_ssh_user=$$VAGRANT_HOST_USER' > hosts - echo 'vagrant-guest ansible_ssh_port=22222 ansible_ssh_host=$$VAGRANT_HOST ansible_ssh_user=$$VAGRANT_USER' >> hosts - ansible-playbook -i hosts playbooks/vagrant-up.yml - sshpass -p vagrant ssh-copy-id 'vagrant@$$VAGRANT_HOST -p 22222' - ansible-playbook -i hosts playbooks/raspaas-setup.yml - ansible-playbook -i hosts playbooks/app-setup.yml - cd tests - rspec spec/raspaas_app_spec.rb - ansible-playbook -i ../hosts ../playbooks/app-auto-scale.yml - rspec spec/raspaas_auto_scale_spec.rb - ansible-playbook -i ../hosts ../playbooks/vagrant-destroy.yml Ansibleインベントリ作成 Ansible Playbook 実行 Infrataster 実行
  • 23. Ansible Playbooks Raspaas のセットアップ 23 - hosts: vagrant-guest tasks: - name: restart docker engine command: sudo service docker restart - name: download bootstrap.sh command: wget http://raw.github.com/tetsusat/raspaas/master/bootstrap.sh - name: chmod +x bootstrap.sh command: chmod +x bootstrap.sh - name: start bootstrap script command: sudo ./bootstrap.sh teroku playbooks/raspaas-setup.yml
  • 24. Ansible Playbooks サンプル App のセットアップ 24 - hosts: vagrant-guest tasks: - name: change ssh config for git push shell: echo 'StrictHostKeyChecking no' > $HOME/.ssh/config - name: git clone command: git clone https://github.com/tetsusat/ruby-sample.git - name: teroku create command: teroku create args: chdir: ruby-sample/ - name: git push command: git push teroku master args: chdir: ruby-sample/ playbooks/app-setup.yml
  • 25. Infrastater Spec ファイル サンプル App のテスト 25 require 'spec_helper' describe server(:vagrant_host) do describe http('http://<vagrant_host>:8080/ruby-sample') do it "responds content including 'Hello, world'" do expect(response.body).to include('Hello, world') end end end tests/spec/raspaas_app_spec.rb
  • 26. Infrastater Spec ファイル オートスケーリングのテスト 26 require 'spec_helper' seen = [] describe server(:vagrant_host) do 3.times do describe http('http://<vagrant_host>:8080/ruby-sample') do it "responds content including 'Hello, world' from unseen container" do see = "" if response.body =~ /Hello, world from (w+)/ see = $1 end expect(seen).not_to include(see) seen << see end end end end tests/spec/raspaas_auto_scale_spec.rb