Metering 설치 가이드

1. 개요

1.1. 문서 개요

1.1.1. 목적

본 문서(node.js API 서비스 미터링 애플리케이션 개발 가이드)는 파스-타 플랫폼 프로젝트의 미터링 플러그인과 Node.js API 애플리케이션과 연동하여 API 서비스를 미터링하는 방법에 대해 기술 하였다.

1.1.2. 범위

본 문서의 범위는 파스-타 플랫폼 프로젝트의 Node.js API 서비스 애플리케이션 개발과 CF-Abacus 연동에 대한 내용으로 한정되어 있다.

1.1.3. 참고 자료

2. Abacus 배포

2.1. 미터링 범위

  • 파스-타 플랫폼에서 배포 또는 삭제 한 앱의 컨테이너 사용량을 집계
  • 조직/영역/앱에 대해 당월 사용량 및 지정한 기간 동안의 월간 사용량에 대해 조회 가능

2.2. 배포 전제 조건

  • 이 가이드는 ubuntu14.04 및 로컬 설치를 기준으로 작성되어 있다.
  • cf-CLI 가 로컬에 설치 되어 있어야 한다.
  • zip 패키지가 로컬에 설치 되어 있어야 한다.
  • CF가 설치 되어 있어야 한다.
    ※ 운영 환경의 CF에 abacus를 배포할 경우, abacus를 서비스 하기 위한 security-group을 설정해야 한다.
    • Abacus를 위한 security 설정 정보
      Component
      Protocol
      Port
      abacus-pouchserver
      TCP
      5984
      abacus-usage-collector
      9080
      abacus-usage-reporting
      9088
      abacus-usage-meter
      9100
      abacus-usage-accumulator
      9200
      abacus-usage-aggregator
      9300
      abacus-cf-bridge
      9500
      abacus-cf-renewer
      9501
      abacus-provisioning-plugin
      9880
      abacus-account-plugin
      9881
      abacus-authserver-plugin
      9882
      abacus-eureka-plugin
      9990
    </table>

2.3. Node.js 설치

※ 설치할 abacus가 요구하는 Node.js 및 Npm 버전을 설치한다. Cf-abacus 사이트에서 해당 버전을 확인한다. https://github.com/cloudfoundry-incubator/cf-abacus
※ Node.js와 npm은 같이 설치된다

2.3.1. Node.js 설치 순서

1
$ sudo apt-get install curl
2
3
## Node.js version 6.x를 설치할 경우
4
## Source Repository 등록
5
$ curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
6
7
## Node.js & Npm 설치
8
$ sudo apt-get install -y nodejs
Copied!

2.4. pouchdb, couchdb 설치

※ abacus 데모를 실행하기 위해서는 pouchdb를 설치 해야 한다.
※ abacus 데이터를 영구 보존하기 위해 서는 couchdb를 설치해야 한다.

2.4.1.couchdb 설치

1
## CouchDB 설치
2
$ sudo apt-get install couchdb
3
4
## CouchDB 설정
5
※ abacus와 couchdb가 모두 같은 로컬 환경인 경우 아래 설정은 생략한다.
6
$ vi /etc/couchdb/default.ini
7
8
; etc/couchdb/default.ini.tpl. Generated from default.ini.tpl.in by configure.
9
10
; Upgrading CouchDB will overwrite this file.
11
[vendor]
12
name = Ubuntu
13
version = 14.04
14
15
<<중략>>
16
17
[httpd]
18
port = 5984
19
bind_address = 127.0.0.1 ## Remote 서비스를 할 경우, 0.0.0.0 또는 cf 도메인 ip로 수정한다.
20
authentication_handlers = {couch_httpd_oauth, oauth_authentication_handler}, {couch_httpd_auth, cookie_authentication_handler}, {couch_httpd_auth, default_authentication_handler}
21
default_handler = {couch_httpd_db, handle_request}
22
secure_rewrites = true
23
vhost_global_handlers = _utils, _uuids, _session, _oauth, _users
24
allow_jsonp = false
25
26
<<후략>>
27
28
$ sudo service couchdb restart
Copied!
※ couchDB 설정에 관해서 다음 웹 사이트를 참조한다.

2.4.2. pouchdb 설치(옵션)

1
## pouchdb 설치
2
$ sudo npm install -g pouchdb-server
3
4
## pouchdb에 서비스 포트 할당
5
$ pouchdb-server --port 5984
Copied!

2.4.3. 설치 확인

1
$ curl localhost:5984
2
> {"couchdb":"Welcome","version":"1.5.1",...}
Copied!

2.4.4. CouchDB 계정 생성

2.5. CF에 abacus UAA 계정 등록

CF 설치한 abacus에서 CF의 앱 사용량 정보를 수집하기 위해서 CF 접근을 위한 계정 및 토큰을발급 받아야 한다.
또한 보안 모드로 abacus를 배포한 경우, abacus 컴포넌트간의 데이터 전송을 위한 계정을 등록해야 한다.

2.5.1. UAA 클라이언트 설치

1
$ gem install cf-uaac
Copied!

2.5.2. CF 앱 사용량 수집을 위한 UAA 계정 등록

1
## CF target 설정
2
$ uaac target uaa.<CF 도메인> --skip-ssl-validation
3
4
예) $ uaac target uaa.bosh-lite.com --skip-ssl-validation
5
6
## uaa client 토큰 취득
7
$ uaac token client get <uaac user id> -s <uaac user password>
8
9
예) $ uaac token client get admin -s admin-secret
10
11
## cloud_controller.admi 계정 생성
12
$ uaac client add <CF_CLIENT_ID> --name <CF_CLIENT_ID> --authorized_grant_types client_credentials --authorities cloud_controller.admin --secret <CF_CLIENT_SECRET>
13
14
예) $ uaac client add abacus-cf-bridge --name abacus-cf-bridge --authorized_grant_types client_credentials --authorities cloud_controller.admin --secret secret
Copied!

2.5.3. Secured Abacus를 위한 UAA 계정 등록

  • Secured Abacus를 위한 권한 목록
    내용
    권한 SCOPE
    예시
    미터링 자원 사용량 정보에 대한 abacus 접근 권한
    abacus.usage.{Resource_id}.write
    abacus.usage.linux-container.write
    abacus.usage.{Resource_id}.read
    abacus.usage.linux-container.read
    사용량 정보에 대한 abacus접근 권한
    abacus.usage.write
    -
    abacus.usage.read
    -
    Abacus 모니터링 권한
    abacus.system.read
    -
    1
    ##미터링 자원 사용량 정보에 대한 abacus 접근 권한을 UAA 에 등록
    2
    3
    $ uaac client add <CLIENT_ID> --name <CLIENT_ID> --authorized_grant_types client_credentials --authorities abacus.usage.<Resource_id>.write,abacus.usage.<Resource_id>.read --scope abacus.usage.<Resource_d>*.write,abacus.usage.<Resource_id>.read --secret *<CLIENT_SECRET>
    4
    5
    예)
    6
    $ uaac client add abacus-linux-container --name abacus-linux-container --authorized_grant_types client_credentials --authorities abacus.usage.linux-container.write,abacus.usage.linux-container.read --scope abacus.usage.linux-container.write,abacus.usage.linux-container.read --secret secret
    7
    8
    ##사용량 정보에 대한 abacus 접근 권한을 UAA에 등록
    9
    $ uaac client add <CLIENT_ID> --name <CLIENT_ID> --authorized_grant_types client_credentials --authorities abacus.usage.write,abacus.usage.read --scope abacus.usage.write,abacus.usage.read --secret <CLIENT_SECRET>
    10
    11
    예)
    12
    $ uaac client add abacus --name abacus --authorized_grant_types client_credentials --authorities abacus.usage.write,abacus.usage.read --scope abacus.usage.write,abacus.usage.read --secret secret
    13
    14
    ##Abacus 모니터링 권한을 UAA에 등록
    15
    $ uaac client add <CLIENT_ID> --name <CLIENT_ID> --authorized_grant_types client_credentials –authorities abacus.system.read --scope abacus.system.read --secret <CLIENT_SECRET>
    16
    17
    예)
    18
    $ uaac client add abacus-system --name abacus-system --authorized_grant_types client_credentials --authorities abacus.system.read --scope abacus.system.read --secret secret
    Copied!
※ 하나의 \에 모든 권한을 부여할 수 있다.
※ Secured Abacus에 대해서는 다음 웹 사이트를 참조한다. https://github.com/cloudfoundry-incubator/cf-abacus/blob/master/doc/security.md

2.6. Abacus 배포를 위한 조직 및 영역 설정

1
<< Bosh Lite의 경우>>
2
3
##라우트 확인
4
5
$ route
6
7
$ route
8
Kernel IP routing table
9
Destination Gateway Genmask Flags Metric Ref Use Iface
10
default 10.8.0.5 128.0.0.0 UG 0 0 0 tun0
11
default 192.168.4.1 0.0.0.0 UG 0 0 0 eth1
12
10.8.0.1 10.8.0.5 255.255.255.255 UGH 0 0 0 tun0
13
1 0.8.0.5 * 255.255.255.255 UH 0 0 0 tun0
14
10.244.0.0 192.168.50.4 255.255.0.0 UG 0 0 0 vboxnet0
15
61.74.60.194 192.168.4.1 255.255.255.255 UGH 0 0 0 eth1
16
128.0.0.0 10.8.0.5 128.0.0.0 UG 0 0 0 tun0
17
192.168.4.0 * 255.255.255.0 U 1 0 0 eth1
18
192.168.50.0 * 255.255.255.0 U 0 0 0 vboxnet0
19
20
## route 설정에 10.244.0.0가 없는 경우
21
$ <bosh-lite 설치 경로>/bin/add-route
22
23
## CF target 설정
24
$ cf api https://api.<CF 도메인> --skip-ssl-validation
25
예) $ cf api https://api.bosh-lite.com --skip-ssl-validation
26
27
28
## CF 로그인
29
$ cf login
30
31
##조직 생성 및 설정
32
$ cf create-org <조직>
33
$ cf target -o <조직>
34
35
##영역 생성 및 설정
36
$ cf create-space <영역>
37
$ cf target -o <조직> -s <영역>
Copied!

2.7. cf-abacus 배포

  • Abacus**기능 개요**
형상
설명
abacus-pouchserver
Abacus가 사용하는 in-browser database. 앱을 재시작하면 데이터가 사라지므로 운영 환경에서는 별도의 CouchDB 또는 MongoDB를 구성해야 한다.
abacus-usage-collector
CF 앱 사용량 수집기
abacus-usage-reporting
Abacus가 수집/집계한 미터링 정보에 사용자의 요청에 맞게 보고한다.
abacus-usage-meter
수집한 CF 앱 사용량의 집계를 위해 미터링 정보를 가공한다.
abacus-usage-accumulator
수집한 CF 앱 사용량 정보를 계정/조직/영역/앱 별로 누적한다.
abacus-usage-aggregator
누적한 CF 앱 사용량 정보를 계정/조직/영역/앱 별로 집계한다.
abacus-cf-bridge
CF와 연동하여 앱의 Container 사용량 정보를 수집한다.
abacus-provisioning-plugin
Abacus의 각 기능에서 수집/누적/집계에 필요한 메타 정보를 제공한다.
abacus-account-plugin
앱의 계정 정보 조회 및 유효성 체크를 수행한다.
abacus-authserver-plugin
Secured Abacus 운영을 위한 인증 서비스를 제공한다. 운영 환경에서는 CF UAA로 대체 한다.
abacus-eureka-plugin
Netflix의 Eureka 시스템과 연동하여 Abacus 앱의 분산 처리 서비스를 제공한다.

2.7.1. Git을 통해 cf-abacus를 다운 받는다.

1
$ cd <abacus를 설치할 경로>
2
$ git clone https://github.com/cloudfoundry-incubator/cf-abacus
Copied!
  • Abacus를 빌드하기 위해서는 Node.js 및 Npm을 사전에 설치해야 한다.

2.7.2. Abacus와 연동할 DB 및 Secure 정보 설정

  • DB연동 및 Secure 정보를 설정하기 위해서는 다음 경로에 있는 manifest.yml 파일을 수정한다.
경로
abacus-pouchserver
/cf-abacus/lib/utils/pouchserver
abacus-usage-collector
/cf-abacus/lib/metering/collector
abacus-usage-reporting
/cf-abacus/lib/aggregation/reporting
abacus-usage-meter
/cf-abacus/lib/metering/meter
abacus-usage-accumulator
/cf-abacus/lib/aggregation/accumulator
abacus-usage-aggregator
/cf-abacus/lib/aggregation/aggregator
abacus-provisioning-plugin
/cf-abacus/lib/plugins/provisioning
abacus-account-plugin
/cf-abacus/lib/plugins/account
abacus-authserver-plugin
/cf-abacus/lib/plugins/authserver
abacus-eureka-plugin
/cf-abacus/lib/plugins/eureka
  • manifest.yml 설정의 예
1
applications:
2
- name: abacus-usage-collector ## 앱 명
3
host: abacus-usage-collector ## 호스트 명
4
path: .cfpack/app.zip ## Cf에 push할 앱을 빌드한 파일 경로 및 파일
5
instances: 1 ## 앱에 할당할 인스턴스 수
6
memory: 512M ## 앱에 할당할 메모리 사이즈
7
disk_quota: 512M ## 앱에 할당할 디스크 사이즈
8
env: ## 앱 실행 환경 설정
9
CONF: default
10
DEBUG: e-abacus-* ## 앱의 출력 로그 레벨
11
METER: abacus-usage-meter
12
PROVISIONING: abacus-provisioning-plugin
13
#DB: abacus-pouchserver ## 로컬 pouchDB를 사용할 경우 설정한 예시
14
DB: http://<user_id>:<password>@<coudb_ip>:<port> ## 외부의 CouchDB를 사용할 경우 설정한 예시
15
#DB: mongodb://9a6e635e-41aa-4522-97b3-ade805ce5b89:[email protected]:27017/728b0614-5357-480e-b238-b618fcc8b957 ## MongoDB 서비스와 바인드하여 MongoDB를 사용할 경우 설정한 예시
16
DBCLIENT: abacus-couchclient ## CouchDB, PouchDB를 사용할 경우 설정
17
#DBCLIENT: abacus-mongoclient ## MongoDB를 사용할 경우 설정
18
ACCOUNT: abacus-account-plugin
19
EUREKA: abacus-eureka-plugin
20
NODE_MODULES_CACHE: false
21
SECURED: true ## Abacus를 Secured 모드로 운영할 경우: true
22
AUTH_SERVER: https://api.bosh-lite.com:443 ## Auth 서비스 Endpoint
23
CLIENT_ID: abacus ## 사용량 정보 접근 권한 ID
24
CLIENT_SECRET: secret ## 사용량 정보 접근 권한 Secret
25
JWTKEY: |+ ### cf 배포 manifest의 properties.uaa.jwt.verification_key를 설정
26
-----BEGIN PUBLIC KEY-----
27
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHFr+KICms+tuT1OXJwhCUmR2d
28
29
-----END PUBLIC KEY-----
30
JWTALGO: RS256 ## JWTKEY 알고리즘
31
THROTTLE: 2
Copied!
>
1
### abacus-authserver를 Auth 서비스로 사용할 경우 설정 예시
2
3
AUTH_SERVER: abacus-authserver-plugin ## Auth 서비스 Endpoint
4
CLIENT_ID: abacus ## 사용량 정보 접근 권한 ID
5
CLIENT_SECRET: secret ## 사용량 정보 접근 권한 Secret
6
JWTKEY: encode
7
JWTALGO: HS256 ## JWTKEY 알고리즘
Copied!

2.7.3. Abacus 빌드

1
$ cd <abacus 경로>
2
$ npm run build
Copied!

2.7.4. Abacus 배포

1
$ cd <abacus 경로>
2
3
## abacus 설치를 위한 CF 타겟 지정 5. 에서 생성한 조직 과 영역을 지정 한다 .
4
이미 지정한 경우 생략한다.
5
$ bin/cfsetup
6
7
$ bin/cfsetup
8
Enter your API URL [https://api.bosh-lite.com]: https://api.bosh-lite.com ## CF API EndPoint
9
Enter your user name [admin]: admin ## <계정 ID>
10
Enter your organization [abacus]: abacus ## <조직>
11
Enter your space [dev]: dev ## <영역>
12
API endpoint: https://api.bosh-lite.com
13
Password> ## <계정 비밀번호>
14
Authenticating...
15
OK
16
17
Targeted org abacus
18
19
Targeted space dev
20
21
API endpoint: https://api.bosh-lite.com (API version: 2.62.0)
22
User: admin
23
Org: abacus
24
Space: dev
25
Creating security group abacus as admin
26
OK
27
28
Assigning security group abacus to space dev in org abacus as admin...
29
30
OK
31
32
TIP: Changes will not apply to existing running applications until they are restarted.
33
34
##타겟으로 지정한 조직 / 영역에 대해 abacus앱을 배포한다.
35
※ 주의: CF의 Nodejs Build Pack 버전이 낮을 경우 cfpush는 실패한다. CF의 Nodejs build pack 버전이 낮을 경우, 반드시 Nodejs build pack을 업그레이드 한다.
36
$ npm run cfpush
37
## abacus 설치 형상 확인
38
39
$ cf a
40
41
$ cf a
42
Getting apps in org abacus / space dev as admin...
43
OK
44
45
name requested state instances memory disk urls
46
abacus-pouchserver started 1/1 1G 512M abacus-pouchserver.bosh-lite.com
47
abacus-authserver-plugin started 1/1 512M 512M abacus-authserver-plugin.bosh-lite.com
48
abacus-account-plugin started 1/1 512M 512M abacus-account-plugin.bosh-lite.com
49
abacus-usage-collector started 1/1 512M 512M abacus-usage-collector.bosh-lite.com
50
abacus-usage-aggregator started 1/1 512M 512M abacus-usage-aggregator.bosh-lite.com
51
abacus-provisioning-plugin started 1/1 512M 512M abacus-provisioning-plugin.bosh-lite.com
52
abacus-eureka-plugin started 1/1 512M 512M abacus-eureka-plugin.bosh-lite.com
53
abacus-usage-meter started 1/1 512M 512M abacus-usage-meter.bosh-lite.com
54
abacus-usage-accumulator started 1/1 512M 512M abacus-usage-accumulator.bosh-lite.com
55
abacus-usage-reporting started 1/1 512M 512M abacus-usage-reporting.bosh-lite.com
Copied!
※ Build Pack 업데이트 참고 사이트

2.7.5. abacus-cf-bridge 배포

2.6.4 에서 배포한 abacus는 외부 사용량에 대한 수집 기능은 없다. 따라서 실제 CF에서 발생한 앱 사용량을 수집하기 위해서는 별도의 앱을 배포해야 한다. Abacus-cf-bridge는 CF에서 사용 중인 앱의 Container 사용량을 수집하기 위한 앱이다.
1
$ cd <abacus 경로>/lib/cf/bridge
2
3
## CF Bridge 빌드
4
$ npm install && npm run babel && npm run lint && npm test && npm run cfpack
5
6
## CF 연동을 위한 Secure 정보 설정
7
$ vi manifest.yml
8
※ *manifest.yml**내용 및 수정 사항에 대해서는 별도 기술*
9
10
## CF Bridge 배포
11
$ cf push –no-start
12
13
## abacus-cf-bridge 서비스 시작
14
$ cf start abacus-cf-bridge
Copied!
  • Abacus-cf-bridge의 manifest.yml
1
applications:
2
- name: abacus-cf-bridge
3
host: abacus-cf-bridge
4
path: .cfpack/app.zip
5
instances: 1 ### 앱 인스턴스 수
6
memory: 512M ### 앱 할당 메모리
7
disk_quota: 512M ### 앱 할당 디스크
8
env: ### 앱 실행 환경 정보
9
CONF: default
10
DEBUG: e-abacus-*
11
COLLECTOR: abacus-usage-collector
12
EUREKA: abacus-eureka-plugin
13
API: https://api.<CF 도메인> ### CF api 도메인
14
#DB: abacus-pouchserver ### Abacus의 Pouch서버를 DB로 사용할 경우
15
DB: http://<user_id>:<password>@<coudb_ip>:<port> ### 외부의 CouchDB를 DB로 사용할 경우 설정 예시
16
#DB: mongodb://9a6e635e-41aa-4522-97b3-ade805ce5b89:[email protected]:27017/728b0614-5357-480e-b238-b618fcc8b957 ## Abacus를 CF MongoDB 서비스팩과 바인드하여 DB로 사용할 경우 설정 예시
17
DBCLIENT: abacus-couchclient ## CouchDB 또는 PouchDB를 사용할 경우
18
#DBCLIENT: abacus-mongoclient ## MongoDB를 사용할 경우
19
CF_CLIENT_ID: abacus-cf-bridge ## CF cloud_controller.admin Client ID
20
CF_CLIENT_SECRET: secret ## CF cloud_controller.admin Client Secret
21
NODE_MODULES_CACHE: false
22
SECURED: true ## Abacus를 Secured 모드로 운영할 경우: true
23
AUTH_SERVER: https://api.bosh-lite.com ## Auth 서비스 Endpoint
24
CLIENT_ID: abacus-linux-container ## 미터링 자원 접근 권한 ID
25
CLIENT_SECRET: secret ## 미터링 자원 접근 권한 secret
26
JWTKEY: |+ ### cf 배포 manifest의 properties.uaa.jwt.verification_key를 설정
27
-----BEGIN PUBLIC KEY-----
28
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHFr+KICms+tuT1OXJwhCUmR2d
29
30
-----END PUBLIC KEY-----
31
JWTALGO: RS256 ## JWTKEY 알고리즘
32
THROTTLE: 2
Copied!
※ 참고: cf-abacus 는 cf-abacus 가 설치 완료 된 이후 시점부터, cf 상의 app이 새로 push 되거나 cf stop 및 cf start 된 cf event 를 기반으로 데이터를 수집, 집계한다.

3. PAASTA-USAGE-REPORTING 배포

PAASTA-USAGE-REPORTING은 abacus 시스템과 연동하여 PAASTA에 앱의 사용량을 보고하는 서비스이다.

3.1. 배포 전제 조건

3.2. CF에 UAA 계정 등록

3.3. paasta-usage-repoting 배포

3.3.1.다운로드

1
##다운로드 대상 파일
2
PaaS-TA-Usage-Reporting.tar
3
4
##대상 파일을<설치 경로>에 다운로드
5
$ cd <설치 경로>
6
7
##파일압축 해제
8
$ tar xvf PaaS-TA-Usage-Reporting.tar
Copied!

3.3.2. paasta-usage-reporting 배포

1
$ cd <설치 경로>/PaaS-TA-Usage-Reporting/usageReporting
2
3
## Abacus 연동을 위한 DB 및 Secure 정보 설정
4
$ vi manifest.yml
5
※ manifest.yml 내용 및 수정 사항에 대해서는 별도 기술
6
7
$ cf push
Copied!
※ paasta-usage-reporting과 연동하기 위한 인터페이스는 다음 파일을 참조한다.
※ paasta-usage-reporting manifest.yml
1
applications:
2
- name: paasta-usage-reporting
3
memory: 1024M
4
disk_quota: 512M
5
instances: 1
6
command: node app.js # 애플리케이션 실행 명령어
7
path: ./ # 배포될 애플리케이션의 위치
8
env:
9
DEBUG: a*
10
API: https://api.<CF 도메인 >
11
CF_CLIENT_ID: abacus-cf-bridge
12
CF_CLIENT_SECRET: secret
13
ABACUS_REPORT_SERVER: http://abacus-usage-reporting.<CF 도메인>
14
NODE_TLS_REJECT_UNAUTHORIZED: 0
15
NODE_MODULES_CACHE: false
16
SECURED: false # abacus-usage-reporting의 SECURED 설정이 true인 경우, true 설정
17
AUTH_SERVER: https://api.<CF 도메인>
18
CLIENT_ID: abacus
19
CLIENT_SECRET: secret
20
JWTKEY: |+
21
-----BEGIN PUBLIC KEY-----
22
-----END PUBLIC KEY-----
23
JWTALGO: RS256
Copied!

3.3.3. 배포 형상

1
$ cf a
2
3
Getting apps in org test / space test as admin...
4
OK
5
name requested state instances memory disk urls
6
paasta-usage-reporting started 1/1 512M 512M paasta-usage-reporting.bosh-lite.com
Copied!

3.3.4. api 호출 예제

1
$ curl -k -X GET https://paasta-usage-reporting.bosh-lite.com/v1/org/:org_id/space/:space_id
Copied!
Last modified 1yr ago