'mesos and marathon'에 해당되는 글 12건

  1. 2017.04.26 마라톤(marathon) 설치/실행하기
  2. 2017.04.24 메소스(mesos) 설치 및 실행하기


마라톤(marathon)을 로컬 모드/확장형으로 설치/실행하는 예이다.


 

 마라톤 상태를 저장하려면 주키퍼가 필요하다. 주키퍼를 설치하고 주키퍼를 실행한다.

 

$ wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.8/zookeeper-3.4.8.tar.gz


$ tar xf zookeeper-3.4.8.tar.gz 


$ cd ~/zookeeper-3.4.8/


$ mv conf/zoo_sample.cfg conf/zoo.cfg

 

$ vi conf/zoo.cfg

# The number of milliseconds of each tick

tickTime=2000

# The number of ticks that the initial

# synchronization phase can take

initLimit=10

# The number of ticks that can pass between

# sending a request and getting an acknowledgement

syncLimit=5

# the directory where the snapshot is stored.

# do not use /tmp for storage, /tmp here is just

# example sakes.

dataDir=/var/zookeeper

# the port at which the clients will connect

clientPort=2181

# the maximum number





$ sudo bin/zkServer.sh start

Starting zookeeper ... STARTED



마라톤 바이너리 파일(libmesos.so)을 lib 공통 폴더에 복사한다. 


$ sudo cp ~/mesos/build/src/.libs/libmesos.so /usr/lib

 

이렇게 하지 않으면 마라톤 실행이 되지 않는다. 


Failed to load native Mesos library from

java.lang.UnsatisfiedLinkError: Expecting an absolute path of the library:

at java.lang.Runtime.load0(Runtime.java:806)

at java.lang.System.load(System.java:1086)

at org.apache.mesos.MesosNativeLibrary.load(MesosNativeLibrary.java:159)

at org.apache.mesos.MesosNativeLibrary.load(MesosNativeLibrary.java:188)

at org.apache.mesos.MesosSchedulerDriver.<clinit>(MesosSchedulerDriver.java:61)

at mesosphere.marathon.MarathonSchedulerDriver$.newDriver(MarathonSchedulerDriver.scala:81)

at mesosphere.marathon.MesosSchedulerDriverFactory.createDriver(SchedulerDriverFactory.scala:28)

at mesosphere.marathon.DebugModule$MetricsBehavior$$anonfun$invoke$1.apply(DebugConf.scala:62)

at mesosphere.marathon.metrics.Metrics.timed(Metrics.scala:27)

at mesosphere.marathon.DebugModule$MetricsBehavior.invoke(DebugConf.scala:61)

at mesosphere.marathon.MarathonSchedulerService.liftedTree1$1(MarathonSchedulerService.scala:282)

at mesosphere.marathon.MarathonSchedulerService.onElected(MarathonSchedulerService.scala:267)

at mesosphere.marathon.DebugModule$MetricsBehavior$$anonfun$invoke$1.apply(DebugConf.scala:62)

at mesosphere.marathon.metrics.Metrics.timed(Metrics.scala:27)

at mesosphere.marathon.DebugModule$MetricsBehavior.invoke(DebugConf.scala:61)

at mesosphere.marathon.core.leadership.CandidateImpl$4.onGroupChange(CandidateImpl.java:177)

at mesosphere.marathon.core.leadership.CandidateImpl.offerLeadership(CandidateImpl.java:212)

at mesosphere.marathon.MarathonSchedulerService$$anonfun$mesosphere$marathon$MarathonSchedulerService$$offerLeadership$1$$anonfun$apply$2.apply(MarathonSchedulerService.scala:370)

at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)

at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)

at scala.concurrent.impl.ExecutionContextImpl$AdaptedForkJoinTask.exec(ExecutionContextImpl.scala:121)

at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)

at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)

at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)

at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)

 




마라톤을 설치한다. 


$ wget http://downloads.mesosphere.com/marathon/v1.1.1/marathon-1.1.1.tgz 

$ tar xf marathon-1.1.1.tgz 

$ cd ~/marathon-1.1.1

$ ./bin/start --master local --zk zk://localhost:2181/marathon 

 [2017-04-26 23:31:17,081] INFO All services up and running. (mesosphere.marathon.Main$:main)






데모로 아래 링크를 참조해서 Hello Marathon를 하나 생성한다.


https://mesosphere.github.io/marathon/docs/application-basics.html


하나의 application을 만들 수 있지만, scale application을 할 수 없다. 로컬 모드라서...






로컬 모드가 아니라 이미 설치된 메소스와 연동한다. 아래와 같이 zookeeper 연동하면 잘 작동한다. 




./bin/start --master zk://zk1:2181,zk2:2181/mesos --zk zk://zk1:2181,zk2:2181/marathon



scala application을 눌러 cpu50개를 사용하는 job을 생성한다. 







그리고, 메소스 내부는 아래와 같이 애플리케이션을 다양하게 사용됨을 확인할 수 있다.






정상적으로 동작하는지 테스트해본다.




curl -X POST http://마라톤_장비:8080/v2/apps -d @basic-3.json -H "Content-type: application/json"


{

  "id": "basic-3",

  "cmd": "python3 -m http.server 8080",

  "cpus": 0.5,

  "mem": 32.0,

  "container": {

    "type": "DOCKER",

    "docker": {

      "image": "python:3",

      "network": "BRIDGE",

      "portMappings": [

        { "containerPort": 8080, "hostPort": 0 }

      ]

    }

  }

}



http-json으로 app 생성을 요청해 본다.


$ curl -X POST http://마라톤-ip:8080/v2/apps -d @basic-4.json -H "Content-type: application/json"


{"id":"/basic-4","cmd":"python3 -m http.server 8080","args":null,"user":null,"env":{},"instances":5,"cpus":0.5,"mem":32,"disk":0,"executor":"","constraints":[],"uris":[],"fetch":[],"storeUrls":[],"ports":[0],"portDefinitions":[{"port":0,"protocol":"tcp","labels":{}}],"requirePorts":false,"backoffSeconds":1,"backoffFactor":1.15,"maxLaunchDelaySeconds":3600,"container":{"type":"DOCKER","volumes":[],"docker":{"image":"python:3","network":"BRIDGE","portMappings":[{"containerPort":8080,"hostPort":0,"servicePort":0,"protocol":"tcp","labels":{}}],"privileged":false,"parameters":[],"forcePullImage":false}},"healthChecks":[],"readinessChecks":[],"dependencies":[],"upgradeStrategy":{"minimumHealthCapacity":1,"maximumOverCapacity":1},"labels":{},"acceptedResourceRoles":null,"ipAddress":null,"version":"2017-04-28T13:59:01.853Z","residency":null,"tasksStaged":0,"tasksRunning":0,"tasksHealthy":0,"tasksUnhealthy":0,"deployments":[{"id":"c6c8a6db-5e25-49ed-aaae-9d902dcf2744"}],










참고 문서 : https://mesosphere.github.io/marathon/docs/application-basics.html

Posted by 김용환 '김용환'

메소스 다운로드



http://www.apache.org/dist/mesos/ 에서 다운받을 바이너리를 확인한다.



sudo yum install -y cyrus-sasl-md5  subversion-devel 

http://www.apache.org/dist/mesos/1.0.3/mesos-1.0.3.tar.gz

tar -zxf mesos-1.0.0.tar.gz

mv mesos-1.0.0 mesos 

cd mesos 

mkdir build 

cd build 

../configure

make 


다운로드 에러가 발생한다면 proxy 이슈이다. 아래와 같이 maven 설정 파일에 proxy를 추가한다.


$ cat ~/.m2/settings.xml

<settings>

    <proxies>

        <proxy>

            <active>true</active>

            <protocol>http</protocol>

            <host>proxy서버</host>

            <port>8888</port>

        </proxy>

    </proxies>

</settings>




제대로 컴파일되었는지 확인한다.


make check 



스탠드얼론 형태로 마스터 서비스를 실행한다. (마스터가 1인 메소스)



cd /home/deploy/mesos/build


sudo ./bin/mesos-master.sh --work_dir=/var/lib/mesos



http://서버-IP:5050






이제 클러스터 모드로 돌려본다.


rsync를 이용해 슬레이브가 될 장비들에 복사를 진행한다. 이미 컴파일된 된 상태이다.


rsync ...




슬레이브 장비에서 yum을 설치하고 mesos를 슬레이브 상태로 실행했다.


 sudo yum install -y cyrus-sasl-md5  subversion-devel  screen

 

 sudo ./bin/mesos-slave.sh --work_dir=/var/lib/mesos --master=마스터_IP:5050




여기서 high availability를 지원하기 위해 zookeeper를 사용하는 것이 좋다.



예제로 두 대의 서버에 zookeeper를 실행하고 다음과 같이 master를 실행했다. 



sudo ./bin/mesos-master.sh --work_dir=/var/lib/mesos  --quorum=1 --zk=zk://zk1:2181,zk2:2181,zk3:2181/mesos --log_dir=/var/log/mesos



잘 동작하고 있다.












참고 : 에러


* Need to specify --quorum for replicated log based registry when using ZooKeeper  : 이 에러를 해결하려면 쿼럼의 값을 조절하는 것이다. --quorum=2 처럼 사용한다.



* F0427 18:21:35.832242 22151 master.cpp:1536] Recovery failed: Failed to recover registrar: Failed to perform fetch within 1mins

*** Check failure stack trace: *** 

메소스를 처음에 실행할 때 에러가 발생했다. 이 문제의 해결은 quorum의 값을 잘못 넣어서 발생했다. quorum의 값을 제대로 넣어보니 더 이상 발생하지 않았다.

(실제 복구 문제라면 이렇게 쉽게 해결되지 않을 것 같다.)




Posted by 김용환 '김용환'