System Compleat.

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 에 대해 설명해 보자면, 바로 배포 도구다. 어떤 배포 도구냐면, 예를 들어 MySQL 이나 PostgreSQL, Gemfire, Hadoop 과 같은 도구들에 대해서는 잘 알고 있을 것이다. 이러한 도구들을 각 클라우드 서비스에 '설치' 하는 도구를 바로 bosh 라고 할 수 있다. 당연하지만 이 설치에 필요한 설정이 바로 manifest 파일이고, 이는 YAML 을 사용하도록 되어있다. 따라서 설치 하려는 대상이 복잡하면 복잡할 수록, 구성해야 하는 내용이 많으면 많을 수록 YAML 파일의 길이는 안드로메다로 간다. 어쨌든, bosh 는 클라우드 서비스에 뭔가를 설치하려는 경우 사용할 수 있는 설치도구로 보면 된다. 

현재 bosh 의 repository 를 살펴보면 CPI 라고 해서 클라우드 서비스 프로바이더 인터페이스를 bosh-core 와 분리해 놓은 것을 볼 수 있다. 현재로서는 VMWare vSphere, vCloud Air, Amazon Web Services, Azure, OpenStack 을 지원하고 있다. 이전에는 bosh-core 와 CPI 인터페이스가 덩어리로 뭉쳐 있어 새로운 IaaS의 지원 속도가 좀 떨어졌다면 2015년 부터는 이 부분을 좀 개선해서 새로운 클라우드 서비스의 지원이 조금 빨라지고 있는 모양이다. 

개발자 분들이라면 아래의 링크들을 살펴보면 bosh 의 개발이 어떻게 이루어지고 있는지 눈으로 확인하실 수 있겠다. 

Bosh CI on Concurse: https://main.bosh-ci.cf-app.com/ 


일단 어떤 도구인지는 알았으니, 그 사용할때 어떤 점을 알아두면 좋은가 하는건 아래와 같이 대략 정리가 가능하겠다. 

  • 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  




정리해 보면, 전체적으로는 다음과 같은 과정이다. 

1. bosh 및 bosh micro 클라이언트 설치 
2. bosh director 준비를 위한 stemcell, manifest.yml 파일 준비 
3. bosh micro deploy 를 사용하여 bosh director 준비
4. Cloud Foundry 또는 다른 bosh 를 통해 배포할 manifest 준비 
5. bosh target x.x.x.x 로 로그인 
6. bosh create release 
7. bosh upload release 
8. 배포될 서비스에 필요한 버전의 Stemcell 업로드 : bosh upload stemcell [스템셀링크 또는 스템셀] 
9. 대망의 bosh deploy 


YAML 은 매우 엄격하다. 그리고 spiff 도구를 통해 필요한 YAML 을 합체하다 보면 순서가 뒤죽박죽 합체되어 뭐 하나 찾으려면 골치가 아프다. 막상 배포에 뭐가 잘못 되면, 그 해당 에러와 YAML 의 어느 부분이 문제인지에 대한 상관 관계 확인 또는 매핑이 매우 어렵다. 아울러 이러한 에러에 대한 정보가 아예 없거나 너무 구버전의 정보이거나 아니면 케이스바이케이스로 풀리는 것도 많이 봤다. 따라서 정리하면 현재로서 사용하려면 매일 이것을 업으로 삼고 있는 사람이 아니면 쉽지 않은 것이다. 

그래도 OSS Cloud Foundry 가 매력적인것은 당연하다. 괜히 I 사나 H 사가 가져다가 자사의 IaaS 에 올리고 있는것이 아니다. 클라우드는 결국 애플리케이션의 구동을 위해 필요한 것이며, 이 애플리케이션의 구동을 더욱 쉽게 해 주는 도구이기 때문에. 

Cloud Foundry 의 Product Manager 의 말에 의하면, 조만간 공개될 새로운 버전의 BOSH 는 YAML 이 지옥에서 현실적인 수준으로 바뀐다고 한다. 아울러 Cloud Foundry 에서 서비스 연결을 할때 원하는 "기존의" 서비스를 연계하도록 하는 것이 아니라, 원하면 BOSH 를 통해 "새롭게 배포된" 서비스를 할당할 수 있도록 더욱더 강화할 예정이라고도 한다. 

CF release 211 때 한번 격렬하게 삽질했다가 이번에 밋업 준비하면서 233 release 에 또한번 격렬한 삽질을 하고 보니 이거 지속적으로 한번씩은 해 줘야 감을 유지하겠구나 싶다. ㅎ 

엔터프라이즈라면 OSS 말고 PCF 를 씁니다. 거기에는 OpsManager 라는 매우 편리한 GUI Bosh 가 있거든요. 

아래는 클라우드파운드리 밋업 주소. 

만약 설치 버전이 아니라 경험만 하고 싶은 경우라면 이런 심한 고생 하실 필요가 없습니다 여러분. http://run.pivotal.io 

AWS 에 배포하는 경우라면 반드시! EC2 limit increase 가 필요합니다. 이것은 각 EC2 콘솔의 대시보드에 있으니 미리 미리 늘려두어 어머 하는 당황스러운 사태를 피합시다 그려. 집에 놀고 있는 vSphere 가 있다면 도전! 

클라우드 때문인지 오픈소스가 날이 갈수록 복잡해짐. ㅋ  

(younjin.jeong@gmail.com, 정윤진)