# Part 1
개발자의 주위환경에 대해 살펴보고 Cloud Foundry overview, Cloud Foundry 를 구성하는 components 마지막으로 Deploy 환경에 대해 알아보겠습니다.
# Part 2
설치부터 코드까지, 데모찍은 동영상은 추후 제공예정
부족한 부분은 nanhap@gmail.com 으로 문의메일 주시면 성심성의껏 답변 드리겠습니다. 감사합니다.
3. http://about.me/nanha
node.js 전문 블로그인 nodeqa.com 운영자
3년간의 웹에이전시들.
손이 빨라졌다. IT 바닥의 쓴맛들. 1/13 퇴직금 제도. 회사 망
7년간의 cafe24 호스팅회사
견문이 넓어졌다. Force10 스위치부터 HTML까지
1년간의 KTH
DevOps 의 경험. 하지만 짧았다. 정리해고 쓴맛.
2003.05.06 ~ 현재 SK Planet
4. Part1 목차 - 1부는 즐겁게
개발자의 주위 환경 대해서 살펴보기
환경에
Cloud Foundry Overview
Cloud Foundry Components
Cloud Foundry Deploy 환경
참고) 설치, CLI, Code 관련 내용은 Part 2 에서 다뤄집니다.
5. Part2 목차 - 2부는 진지하게
Installation version 1 / version 2
클라이언트 툴 설치 / 기능
확장
확장을 고려한 Application 작업 방법
Scheduling / Daemon 작업 방법
Database 작업 방법
맛보기 version1 / version 2
7. 개발자 주위에는 ..... 있다? 없다?
??? 관리 시스템
Security
Infra
Infra 관리 시스템
Delivery 관리 시스템
Developer
Sales
8. 그런데 PaaS 와 같은 플랫폼은 본적 없는거
같아요 !! 왜 일까요? 실무에 사용중인 회사
도 있나요?
http://www.flickr.com/photos/23679420@N00/545653437/
9. 정답은 이럴 것으로 추측됩니다.
너가 책임질꺼야?
점진적으로 발전
시키는 거지 !!
http://jjpd26.tistory.com/96
10. 아래 내용에 대해 한번 생각해보세요.
열심히 만든 프로젝트 배포 !!
몇달 후 다가올 그 무엇이 나를..
10
11. 드디어 Deploy ! 여자친구에게 보여줘야지
http://www.flickr.com/photos/steverhode/3183290111/
11
12. 앗싸 !! 오픈한지 3달, 방문자, 트래픽 대박
주변으로부터 조명을 받기 시작 !!
http://www.flickr.com/photos/libraryman/110679756/
13. 이제 확장이 필요해 졌어요
http://blog.daum.net/seoninnaruto/69
14. 확장이라.....
난 돈이 없는데...
돈
확장 구축을 한 유경험자를 찾고 싶어요...
유경험자
확장하면 프로그램에서 오류날거 같은데 ....
오류
세션, 로컬 리소스 저장
etc ....
15. 아씨... 안해 !!
처음부터 확장을 고려해놓을걸
누가 이렇게 잘 될줄 알았나?
누가 로컬에 업로드 해놨어?
Amazon S3 사용할걸
Session 공유는 ... 제길....
후회......
http://www.flickr.com/photos/44120815@N04/9392721638/
16. 나 열받았어 !!. 직접 나의 환경을 구축시작
나 왕년에 잘 나가는 개발자였어 !!
먼저 돈을 줄일 수 있는 Platform 부터
만들어놓자. 목표는 Less Money !!
http://www.flickr.com/photos/68751915@N05/6355220839/
17. 결론 ::: 나의 환경은 이랬으면 좋겠어요.
개발 에만 집중
인프라 관리시스템 도입
“웹서버 / Runtime / 프레임워크” 리소스 맘대로 사용
“데이타베이스 / MessageQueue” 도 가능하면 !!
Delivery 관리시스템 도입
Staging / Production 서버 구축
Scale Vertical / Horizontal
20. 결론은
잘 구축 / 운용하면 비용 절약할 수 있어요.
Big cost saving
http://www.flickr.com/photos/59937401@N07/5929474535/
21. VM웨어 에서 만들었어요.
2011. 04. 14
VM웨어에서 업계 최초로
Open PaaS “Cloud Foundry” 출시
http://www.vmware.com/kr/company/news/releases/vmw-cloud-foundry-4-14-11.html
22. 좋은 환경을 제공할 수 있어요.
어플리케이션의
배포, 운영을
그리고, 개발자들에게 폭넓은
런타임, 프레임워크, 벡엔드서비스를
간소화
간소화하기 위해
선택할 수 있는 자유 제공합니다.
선택
자유를
설계한 플랫폼입니다.
플랫폼
production
/ staging
source code
devel source
code
23. Open PaaS의 본보기를 보여주고 있어요.
VM웨어가 만들었지만,
VM웨어 IaaS 에서만 동작하는 환경이 아닙니다.
즉, 특정 클라우드 환경에 종속되지 않는
선택의 자유 다양성을 보장
선택 자유와
보장합니다.
24. 다음으로 OpenSource 에요.
VM웨어는 일찍부터
커뮤니티의 도움 없이는
안정적인 클라우드 서비스가 어렵다고 판단했습니다.
Apache2 라이센스 !!
발표 후, 엄청 발전했습니다.
https://github.com/cloudfoundry
http://www.flickr.com/photos/loop_oh/4313629167/sizes/o/in/photostream/
34. version 2 가 나왔어요.
많은 변화
version 1 support 는 deprecated
deprecated.
version1 과 version2 는 각각 매력이 있습니다.
35. version 1 으로 돈벌고 있는 회사에요.
rakuten
static.me
mopaas.com
cloudnpaas.com
appfog.com
ironfoundry.me
uhurucloud.com
cloudfoundry.com
http://www.flickr.com/photos/59937401@N07/5929474535/
36. 아직 갈길이 멀어요.
이제 3년차 !!
플랫폼이 기업에 자리잡기까지의
과정은 험난하지만
OpenSource 의 힘은 대단하기 때문에
꼭 성공할거라 생각됩니다.
http://www.empowernetwork.com/bigbuy/blog/wild-motorcycle-off-road-and-on-road/
37. Cloud Foundry 를 구성하는
Components 에 대해서 알아보겠습니다.
version 1 VS version 2
38. 목표, 사상
간단
간단하고 빠른 인프라 제공
모든 컴포넌트들은 독립적
독립적으로 구성되어 있고, 확장이 용이합니다.
확장
NATS Server 를 바라보기 때문
EventMachine 사용하여 비동기 I/O 처리
IaaS 에 의존하지 않는 시스템
“CloudFoundry Core PaaS System === Kernel” 이라고 표현
Kernel
42. NATS
모든 컴포넌트가 바라보고 있다.
EventMachine 으로 구성된 1개의 경량 Pub / Sub Component
제공하는 장점
모든 컴포넌트의 독립성 / 가용성 보장
가지고 있는 단점
SPOF (single point of failure isssue)
너 죽으면 끝장이야 !! (2중화 권장)
http://seoblog.giorgiotave.it/spof/3156
46. V2 에서는 이렇게 변했어요.
Organization
과금 옵션
Spaces
development / staging / production
각각 Application 위치
http://afbase.com/index.php?mid=pic&page=3&sort_index=readed_count&order_type=desc&document_srl=3354
48. V2 에서는 이렇게 변했어요.
DEA
Cloud Foundry
source code
(배포준비완료)
devel source
code
- Stager 는 DEA 에 흡수
- 별도의 프로세스로 존재하지 않음
- buildpack 으로 100% 대체
buildpack
49. Buildpack 이란?
Application 을 Deploy 하기 위해 준비하는 역할을 담당
준비
기능
b
Install runtime
node.js, java, ruby ....
Install dependencies module
b
b
사용자 만든 Buildpack 을 Application 을 Push 할 때 지정
사용자가
지정가능
현재 Heroku 회사에서 사용하던 기능임.
51. DEA
Stager를 거친 Application == Droplet
DEA는 Droplet 을 실행하고 모니터링 해주는 에이전트
관리해주는 부분은 memory, disk, cpu 그리고 확장
runtime 별로 독립, 너무 쉽게 무한 확장 가능
능력치를 벗어난 deploy 요청 거부권 행사
52. 확장하면 런타임별 프로세스의 모습은?
Java
기본: tomcat 과 함께 실행
확장: port 만 변경되어 기본구조 그대로 복사되어 실행됨
Node.js, Ruby
기본: standalone 혹은 프레임워크에 의존되어 실행됨
확장: port 만 변경되어 기본구조 그대로 복사되어 실행됨
53. 확장하면 런타임별 프로세스의 모습은?
PHP
기본: 최초 “apt-get install apace2” 이건 prefork 방식 설치
start process 5개
확장: port 만 변경되어 기본구조 그대로 실행됨
튜닝: mpm worker 방식으로 설치가 가능하고 (Manual), stager 에서
apache 환경을 변경할 수 있음
56. V2 에서는 이렇게 변했어요.
n
arde r
w
e
ta in
con
c
rden
wa
r
a ine
ont
DEA
rden
wa
r
a ine
cont
57. Warden Container 란?
실행환경을 독립적으로 Isolation
네트워크, CPU, Disk, etc...
가상머신이 아닌 System 레벨에서 가상화 제공
가상화를
rden
wa
r
a ine
cont
기존 Linux Container 와 비슷. ex) docker.io
초기모델은 LXC 였으나,
OS 에 의존되지 않게 간단한 API 로 통신하도록 변경됨.
통신
(Unix Domain socket)
rden
wa
r
a ine
cont
62. Service Node 가 사용자 관리를 어떻게?
MySQL, PostgreSQL
일반적인 방법과 동일하게 사용자를 관리
각각 프로세스 실행방식 그대로
MongoDB, Redis, RabbitMQ
사용자별로 환경설정 파일이 독립적으로 존재
이것을 참조하여 프로세스를 별도로 실행
63. V2 에서는 이렇게 변했어요.
en
ward r
e
ntain
co
en
ward r
e
ntain
co
arden
w
er
ntain
co
en
ward r
e
ntain
co
arden
w
er
ntain
co
66. 제가 느껴본 V1과 V2 의 차이점입니다.
Version 1
아직 다듬어지지 않았지만 그것이 매력이다.
않았지만,
왜냐하면, 분석하고 만들어가는 재미가 있다. v1.5
돈벌고 싶으면 분석해 볼만한 가치가 충분이 있다.
Version 2
거의 다듬어진 모습
모습이다. 그것이 매력이다.
72. Hello World (not Auto-reconfig)
var http = require('http');
http.createServer(function (req, res) {
....
}).listen(1337, '127.0.0.1');
var port = process.env.VCAP_APP_PORT || ‘3000’;
var host = process.env.VCAP_APP_HOST;
var http = require('http');
http.createServer(function (req, res) {
....
}).listen(port, host);
73. Hello World Auto-reconfiguration
var http = require('http');
http.createServer(function (req, res) {
....
}).listen(1337, ‘127.0.0.1’
1337, '127.0.0.1');
That’s it !!!
이 밖에도 Services 에도 지원
고치치 않아도 되요.
74. MongoDB (not Auto-reconfig)
if (process.env.VCAP_SERVICES) {
var service_type = "mongodb-1.8";
// on cloud foundry
var json = JSON.parse(process.env.VCAP_SERVICES);
var credentials = json[service_type][0]["credentials"];
var server = new mongodb.Server(credentials["host"], credentials["port"]);
new mongodb.Db( credentials["db"], server,{} ).open( function(err,client) {
client.authenticate( credentials["username"], credentials["password"],
function(err,replies) {
.....
});
});
} else { // on localhost
var server = new mongodb.Server("127.0.0.1", 27017);
new mongodb.Db( "mongo_survey", server, {} ).open( function(err,client) {
if ( err ) { throw err; }
....
});
75. MongoDB Auto-reconfiguration
var server = new mongodb.Server("127.0.0.1", 27017, {});
127.0.0.1
new mongodb.Db( "mongo_survey", server, {} ).open( function(err,client) {
if ( err ) { throw err; }
....
});
고치치 않아도 되요.
81. 목차
Installation version 1 / version 2
클라이언트 툴 설치 / 기능
확장
확장을 고려한 Application 작업 방법
Scheduling / Daemon 작업 방법
Database 작업 방법
맛보기 version1 / version 2
85. OpenSource. 가자 Github 으로 고고고
version #1
vcap
https://github.com/cloudfoundry/vcap
version #2
https://github.com/cloudfoundry/bosh
bosh
https://github.com/cloudfoundry/bosh-lite
86. 설치 스크립트를 찌져버릴라면?
Ubuntu (lucid64, precise64)
version 1
bash
CHEF
ruby
version 1, 2
BOSH
cf-release (github)
93. BOSH 가 뭐에요?
CloudFoundry가 첫돌 맞은 해에 BOSH가 발표됨.
탄생의 주요원인은 cloudfoundry.com 이 발전하면서 운영의 필요성
기존 CHEF의 영역을 진화시키기 위해 제작
Cloud Foundry의 컴포넌트가 독립적이고, 확장적인 구조이기 때문에
한곳에서 설치 / 관리 / 운영하기 위한 소프트웨어
단점은 무겁고, 치명적으로 IaaS 에 의존적
95. BOSH 구성품
Packages - Archive Software (nginx, pcre ....)
Jobs - Packages / release 설치명세서
Stemcells (줄기세포) - 배포할 플랫폼 (VM Instance 2가지 종류
VM Instance),
cf-release - Cloud Foundry 소스코드 세트 (이제 이곳으로 릴리즈됨)
Deployments - cf-release, IaaS 를 컨트롤할 설치명세서
96. 설치순서 #1 - 환경세팅
IaaS 환경 세팅 (AWS / OpenStack / vSphere ... )
bosh client 와 통신할 수 있도록 준비
각 IaaS 별로 환경설정 메뉴얼
http://docs.cloudfoundry.com/docs/running/deploying-cf/
97. 설치순서 #2 - Install BOSH CLI
Install Ruby
Install bosh cli (gem)
$ gem install bosh_cli
98. 설치순서 #3 - Install Micro-BOSH
micro-bosh 는 BOSH 의 미니어처 / BOSH 컴포넌트 모두 포함
$ bosh download public stemcell <micro-bosh.....tgz>
$ bosh micro deployment micro_bosh.yml (명세서)
$ bosh micro deploy <micro-bosh.....tgz>
TEST !!
$ bosh target x.x.x.x:25555
99. 설치순서 #4 - Install BOSH
$ bosh download public stemcell <bosh.....tgz>
$ bosh upload stemcell <bosh.....tgz>
$ clone http://github.com/...bosh.git
$ ./update && bosh create release --with-tarball --force
$ bosh upload release <output.tgz>
Upload bosh-stemcell
bosh deployment .... (전략 파일 작성)
bosh deploy bosh-stemcell
100. 설치순서 #5 - Deploy cf-release
$ clone http://github.com/...cf-release.git
$ ./update && bosh create release
$ bosh upload release cf-**.yml
$ bosh releases
$ bosh deployment *.yml
$ bosh deploy
$ bosh vms
101. W*F !! Sooooooooo Heavy !!
괜찮아?
다른 방법이 있는지 찾아봐?
http://www.flickr.com/photos/42614915@N00/7383579992/
104. Emulator 의 본고장 Japan
NTT Software 회사의 이와사키 유다이가 Nise_Bosh 제작
Lightweight Bosh Emulator on Local Machine
No CPI (Cloud Provider Interface)
Nise == 일본말로 Pseudo
105. Installer 도 만들었어요.
https://github.com/yudai/cf_nise_installer
독립서버 / Vagrant 에 nise-bosh 를 활용하여 V2 설치가 가능
sudo apt-get install curl
bash < <(curl -s -k -B https://raw.github.com/yudai/cf_nise_installer/$
{INSTALLER_BRANCH:-master}/local/bootstrap.sh)
local/bootstrap.sh
sudo apt-get install curl
bash < <(curl -s -k -B https://raw.github.com/yudai/cf_nise_installer/$
{INSTALLER_BRANCH:-master}/vagrant/bootstrap.sh)
vagrant/bootstrap.sh
108. Client 에서 Application Deploy 방식은?
heroku, azure 는 git 으로 deploy 합니다.
Cloud Foundry 는 http 으로 deploy 합니다.
109. Patch #1 App. 업로드사이즈 증가
기본적으로 64KB
$ vi ...cfoundry-0.5.2/lib/cfoundry/upload_helpers.rb
8 module CFoundry
9 module UploadHelpers
10 # Default paths to exclude from upload payload.
11 UPLOAD_EXCLUDE = %w{.git _darcs .svn}
12
13 # Minimum size for an application payload to bother checking
resources.
14 RESOURCE_CHECK_LIMIT = 64 * 1024 * 1024
15
110. Patch #2. map / unmap 기능 활성 (v1)
vmc map 실행하면 v2 only 라고 보여짐
$ vi .....cloulu-0.2.1/lib/vmc/cli/route/base.rb
1 require "vmc/cli/v2_check_cli"
2
3 module VMC
4 module Route
5 class Base < V2CheckCLI
6
def precondition
7
super
8
#fail "This command is v2-only." unless v2?
9
end
10 end
11 end
12 end
117. Ruby, 1 Instance
require 'sinatra'
get '/' do
$hits = 0 if $hits.eql? nil
$hits = $hits + 1
"Hello World - #{$hits}"
end
$ vmc push ruby-sinatra-1
$ cf push ruby-sinatra-1
...
...
118. Ruby, multi Instance - scale out
require 'sinatra'
require 'redis'
require 'json'
configure do
services = JSON.parse(ENV['VCAP_SERVICES'])
redis_key = services.keys.select { |svc| svc =~ /redis/i }.
Auto-reconfiguration
redis = services[redis_key].first['credentials']
configure do
@@redis = Redis.new
end
redis_conf = {:host => redis['hostname'], :port =>
redis['port'], :password => redis['password']}
@@redis = Redis.new redis_conf
end
get '/' do
$hits = @@redis.incr('hits')
@@redis
"Hello World - #{$hits}"
end
119. SSH 가 지원되지 않는데,
Scheduling (cron) 작업은 어떻게 해요?
120. framework 의 종류를 standalone 선택 !
vmc (cf) push
framework: standalone
domain: none
이때, 도메인을 부여하게 되면 웹서버로 인식하여 시작이
안됨 (bug, vmc unmap 으로 제거)
vmc scale (client, worker background job)
Horizontal / Vertical
121. ruby
$ cat app.rb
require 'rufus/scheduler'
scheduler = Rufus::Scheduler.start_new
scheduler.in '20m' do
# ...
end
scheduler.cron '
0 22 * * 1-5 ' do
# every day of the week at 22:00 (10pm)
end
https://github.com/jmettraux/rufus-scheduler
122. node.js
$ cat app.js
var cronJob = require('cron').CronJob;
var job = new cronJob(' 0
22 * * 1-5 ', function(){
}, function () {
// .....
},
true // Start the job right now
);
https://github.com/ncb000gt/node-cron
125. MySQL
$ vmc tunnel
1: mysql-bb6cf
Which service instance?> 1
1: none
2: mysql
3: mysqldump
Which client would you like to start?> 2
Opening tunnel on port 10001... OK
Waiting for local tunnel to become available... OK
Warning: Using a password on the command line interface can be
insecure.
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 56
126. MySQL
mysql> create table foo ( namae varchar(100) );
Query OK, 0 rows affected (0.12 sec)
mysql> insert into foo values ('deview2013');
Query OK, 1 row affected (0.00 sec)
mysql> select * from foo;
+----------------+
클라이언트 선택에서 2번을 선택
| name
|
+----------------+
Mysql command line 환경을 로컬에 그대로 !!
| deview2013 |
+----------------+
1 row in set (0.01 sec)
mysql>
127. MySQL Client Tool
앞에 client 선택에서 1번 none 선택 !!
접속정보를 활용하여 로컬에서 별도의 클라이언트
프로그램을 사용한 모습
128. mongodb
1: none
2: mongo
3: mongodump
4: mongorestore
Which client would you like to start?> 2
.....
MongoDB shell version: 2.4.3
connecting to: localhost:10000/db
> j = { name : "mongo" }
{ "name" : "mongo" }
> db.testData.insert( j )
> db.testData.find()
{ "_id" : ObjectId("5232acc2648b65e049460945"), "name" :
"mongo" }
129. mongodb
$ vmc tunnel
...
1: none
2: mongo
3: mongodump
4: mongorestore
Which client would you like to start?> 1
Opening tunnel on port 10000... OK
Service connection info:
username : 2b18f727-92a0-46e0-b9cf-9c4fb9ea6638
password : d80e183f-ff91-49b8-9b0a-a55276d28634
name
: db
url
: mongodb://2b18f727-92a0-46e0b9cf-9c4fb9ea6638:d80e183f-ff91-49b8-9b0aa55276d28634@10.0.2.15:25002/db
130. mongodb client tool
앞에 client 선택에서 1번 none 선택 !!
접속정보를 활용하여 로컬에서 별도의 클라이언트
프로그램을 사용한 모습
131. Redis
$ vmc tunnel
1: redis-7ebaa
Which service instance?> 1
1: none
2: redis-cli
Which client would you like to start?> 2
Opening tunnel on port 10001... OK
Waiting for local tunnel to become available... OK
redis localhost:10001> set deview 2013
OK
redis localhost:10001> get deview
"2013"