bosh.io
Techs
(younjin.jeong@gmail.com, 정윤진)
아마 Cloud Foundry 에 관심이 있는 분이라면 bosh.io 를 한번 정도는 방문 했을 것으로 생각된다. 그리고 개인적인 생각인데, OSS Cloud Foundry 를 설치 시도했다가 입을 쩍 벌리고 포기하신 후, 어머 이건 우리가 사용할 수 있는 물건이 아니야 라고 생각했던 분들도 많지 않을까 한다. 사실 이해가 당연히 되는것이, 나도 어디가서 뭐 설치는 정말 많이 해봤다고, 삽질 좀 해봤다고 자부하는데 이거 Cloud Foundry 는 처음 설치를 시도할때 정말 많이 애를 먹었다. 마치 2011년에 오픈스택을 설치하는 느낌. 문서는 버전별로 다르고, 각 문서에 소개된 도구가 다르고, 그 도구별로 또 다른 repository 가 존재하는건 정말 지옥중에 지옥이 아니었을까 한다.
인터넷에 찾아보면 수많은 OSS CF 설치에 대한 글을 찾아 볼 수 있는데, 이 역시도 굉장히 out date 된 내용들이 많아서 참조하기가 매우 곤란한 경우가 많다. 그리고 거기에 나온 내용을 하나 둘 이렇게 저렇게 따라하다 보면 어느새 랩탑은 너덜너덜 거지꼴을 못면한다. 이 대표적인 이유가 bosh 는 아직 현재까지는 ruby 와 ruby gem 을 사용하여 구현 된 것을 사용해야 하기 때문이다.
어쨌든 이놈의 bosh 라는 도구가 사용하기 와이리 힘드노 하는 이유를 간략하게 정리해 보자면 아래와 같다.
- 일단 ruby 기반이다. 뭐 하나 시키면 더럽게 느려서 결과를 볼 때까지 시간이 매우 걸린다.
- 기본적으로 그 구조를 이해하는 것이 매우 쉽지 않다. 처음 접하면, CF 와 bosh 가 무엇이 다른지도 잘 감이 오질 않는다.
- YAML 지옥이다. 간단한 환경 설정이나 properties 정도를 적어두는 것이 아니라, 그 배포 대상의 용도에 따라 어마어마한 내용을 살펴야 할 때가 많다. spiff 라는 YAML merge 도구를 사용하다 보면 OSS CF 배포에 사용되는 YAML 은 보통 1800 줄 정도 된다.
- 문제가 발생할때 까지도 시간이 오래 걸리고, 문제를 확인 하는것도 오래 걸리고, 문제를 고쳐서 잘 돌아가는 것을 확인하는데도 오래 걸린다. 즉, 문제가 생기면 골때리게 시간을 오래 잡아 먹을 가능성이 높다.
(이미치 출처: https://lh3.googleusercontent.com/-FZftK6jFru8/UC1OtbbRb6I/AAAAAAAADqI/D-8bbqzCjug/w640-h400-p-k/mario-yamld.png)
- Bosh 에서 말하는 jobs 는 각 용도별 Virtual Machine 을 일컫는다. 즉, YAML에 jobs: 하위에 consul 이 정의되어 있다면 이것은 consul 을 배포하는 작업이다.
- Stemcell 이라는 방법을 사용하여 VM 위의 OS 레이어를 추상화 한다. AWS 로 치자면 사전에 패킹된 AMI 를 지정한다고 보면 된다. 따라서 bosh 를 사용함에 이로운 점은 CVE 와 같은 긴급 패치가 발생한 경우 배포한 서비스들에 AMI 를 바꿔치기 하는 방법으로 전체 서비스의 업데이트가 가능하다. 물론, multi-AZ 와 같은 구성은 필수겠다.
- 보통 bosh micro 라는 VM 을 배포하고 여기를 director 로 연결해서 사용한다. Jumpbox 를 만들면 편리한데, 이는 클라이언트와 디렉터간에 간혹 무거운 파일 전송이 발생하는 경우가 있기 때문이다.
- bosh 는 매번 배포를 진행할때, 이전에 했던 모든 동작을 다시 반복한다. 물론 전체를 매번 재배포 하는것은 아니지만, manifest 의 설정대로 작업을 진행하며 이미 있는건 검사하고 넘어간다. 이러한 특징 때문에 신규 작업을 위해서 해당 배포는 시간이 엄청나게 오래 걸리는 단점이 있다.
- 문제를 해결해야 하는 경우가 상당히 자주 발생한다. 그것이 YAML 자체의 문제이건, 중간에 나오는 설정의 문제이건 간에 아무튼 엄청나게 자주 발생한다. 따라서 이러한 문제를 해결하기 위해서는 STDOUT 의 메세지만으로는 턱없이 부족한데, 다음과 같은 것들을 알아두면 좋다.
- bosh task [task number] --debug | egrep -i error 특정 bosh 작업에서 어디의 어떤게 문제였는지 빠르게 확인할 수 있다. 보통 ruby 에러 메세지 및 output 이 담겨있으므로 모든 내용을 보는것은 좀 짜증 날때가 많음
- 뭔가 더이상 진행되지 않거나 진행되다가 롤백 된다면, 꼭 ngrep host 나 tcpdump 를 사용해 볼 것을 권고한다. 어느 포트에서 어느 포트로 통신이 필요한데 이것이 제대로 되지 않으면, 그러니까 이를테면 NATS bus 와 같은 메세지 통신이 기존 bosh director 와 bosh 의 job 으로 생성된 vm 간에 허용되지 않으면 두 VM 모두 멍때리는 경우가 많다. 덤프 떠 보자.
- 구글 검색에서 사실 cloudfoundry.org 의 문서를 참조하는것이 도움이 된다고 말하기 힘들때가 많다. 문제를 해결하는 가장 빠른 방법은 bosh 나 cf-release 디렉토리 내에 있는 코드와 템플릿, 스크립트를 참조하는 것이다. 그렇다. 나는 지금 에러 메세지를 통한 검색 방법 보다 코드를 보면서 문제를 해결하는 것이 빠르다고 말하고 있는것 맞다.
- Manifest 파일 안에서 실수하기 좋은 것들이 static ip 설정이나 이에 따른 subnet 할당이다. multi-az 로 배포한다면 이것이 뒤바뀌면 문제가 많다.
- AWS 의 Security Groups, Routing Table, VPC 와 같은 설정들은 아무리 본인이 전문가라해도 항상 의심해서 확인에 확인을 거듭하는 것이 좋다.
- 한 2일 정도 붙들고 있으면 대략 윤곽이 보인다.
의외로 Ruby 와 Ruby Gem 이 상당히 짜증을 유발한다. 뭔가 여기 저기서 권고하는 도구를 설치하다가 버전이고 뭐고 다 이상하게 되었다는 생각이 든다면, 아래의 doctor 를 써보자. 나름 잘 고쳐줌. --
https://gist.github.com/mislav/4728286/raw/rbenv-doctor.sh