ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 오픈소스로 구성하는 데브옵스 시스템 - 서비스 디스커버리 구성
    DevOps 2017. 5. 21. 23:46

    앞에서 Mesos 클러스터와 Marathon을 이용하여 서비스를 구성해 보았습니다.


    그런데 marathon을 이용해 Application을 실행하게 되면, 어떤 Mesos slave에서 실행이 될지는 정해져 있지 않습니다. 또한 Instance는 임의의 포트를 할당 받게 되는데, 실제 사용자를 위한 서비스는 80 또는 443포트를 이용해야 합니다.


    여기에 Mesos slave에는 다양한 서비스가 올라가고 이들은 보통 80 또는 443 포트를 이용해야 하기에 Virtual Host를 이용한 서비스 디스커버리도 필요로 합니다.


    위의 모든 사항을 만족하기 위해 이제부터 Marathon-lb를 이용하여 서비스 디스커버리 및 로드밸런서 기능을 구현해 보도록 하겠습니다.

    Marathon-lb도 Marathon 프레임워크에서 실행을 하도록 구성해 보겠습니다. 아래와 같이 json 코드를 작성해서 Marathon-lb Docker 이미지를 서버스를 올려 보겠습니다.


    {

      "id": "/marathon-lb",

      "cpus": 0.1,

      "mem": 256,

      "instances": 2,

      "container": {

        "type": "DOCKER",

        "docker": {

          "image": "mesosphere/marathon-lb:latest",

          "network": "HOST",

          "privileged": false,

          "forcePullImage": false

        }

      },

      "healthChecks": [

        {

          "gracePeriodSeconds": 300,

          "intervalSeconds": 60,

          "timeoutSeconds": 20,

          "maxConsecutiveFailures": 3,

          "port": 9090,

          "path": "/_haproxy_health_check",

          "protocol": "HTTP",

          "ignoreHttp1xx": false

        }

      ],

      "portDefinitions": [

        {

          "port": 80,

          "protocol": "tcp",

          "name": "default",

          "labels": {}

        },

        {

          "port": 443,

          "protocol": "tcp",

          "name": "ssl",

          "labels": {}

        }    

      ],

      "args": [

        "sse",

        "-m",

        "http://Marathon:8080",

        "--group",

        "external"

      ],

      "constraints": [

        [

          "hostname",

          "UNIQUE"

        ]

      ]

    }


    Docker Host Server의 포트를 사용해야 하기에 Docker network는 HOST로 설정을 해야합니다. 그리고 Marathon-lb는 haproxy를 내장하고 있어서 healthChecks는 haproxy_health_check 페이지를 이용합니다.


    또한 보통 웹서비스는 80 또는 443을 이용해야 하기에 portDefinitions를 80과 443으로 바인딩 할 수 있도록 설정하구요.

    그리고 marathon-lb가 실행할 때 argument를 넣을 수 있습니다. group을 지정하면 특정 서비스 별로 그룹핑을 할 수 있습니다. 그리고 -m 옵션을 넣어 Marathon의 서비스 url도 설정을 해줘야 합니다.

    마지막으로 Mesos slaved에 하나의 marathon-lb만 실행하기 위해서는 constratints 옵션에 hostname:UNIQUE 옵션을 추가 합니다.



    위의 설정으로 실행한 모습 입니다.

    저의 경우에는 Mesos slave가 2대로 구성 되었기에 instance 수도 2로 설정 하였습니다.

    혹시 instance를 Mesos slave 보다 많게 설정하면 아래와 같이 나타납니다.



    그리고 한가지 더 해줘야 될 부분이 있습니다. 앞서 구성한 Web Application을 그룹핑 해줘야 하는데요.

    Web Application의 Label에 marathon-lb에서 지정한 group 값을 넣어 줍니다.



    그리고 Marathon-lb 서비스가 실행되는 두 서버 중 아무거나 80포트로 접속을 하면 이전 구성한 서비스를 확인 가능 합니다.



    그런데 같은 80으로 다른 서비스가 올라오면 어떻게 될까요??

    이를 확인하기 위해 Tomcat7 서비스를 추가로 구성해 보았습니다.



    동일한 marathon-lb 주소로 접속이 되는 것을 볼 수 있습니다.

    F5을 계속 눌러보면 화면이 번갈아가며 바뀌는 것을 볼 수 있습니다.



    이를 해결하기 위해 보통 웹서버의 Virtual Host 기능을 이용하는데요, Marathon-lb도 VHOST를 설정하여 해결할 수 있습니다.



    위와 같이 Labels 항목에 VHOST를 입력합니다.

    한가지 주의할 점은 80외에 443포트를 사용할 경우 VHOST 값을 동일하게 설정해 줘야 합니다. 가운데 설정 된 숫자는 Ports 메뉴에 지정된 port 값의 index라고 이해하시면 됩니다.

    그리고 각 port의 우선 순위를 BACKEND_WEIGHT Label로 가중치값을 두어 구분합니다. 



    marathon-lb에 대한 label 항목은 아래 사이트를 확인하시면 됩니다.

    https://github.com/mesosphere/marathon-lb/blob/master/Longhelp.md#other-labels


    마지막으로 해당 웹서버의 servicePort 값을 유일한 값으로 변경해야 됩니다.

    servicePort는 10000번 이후의 값으로 설정하는 것이 좋습니다.



    그리고 각 Virtual Host 도메인을 통해 각 서비스를 접속해 봅니다.

    아래와 같이 해당 서비스만 접속이 가능한 것을 확인할 수 있습니다.




    앞서 이야기 했지만 Marathon-lb는 haproxy를 내장하고 있어서, haproxy에 대한 config 값은 아래 웹페이지 url을 통해서 확인할 수 있습니다.


    http://marathon-lb:9090/_haproxy_getconfig


    그리고 haproxy의 상태를 확인하고 싶다면 아래 링크 페이지에서 확인 가능 합니다.


    http://marathon-lb:9090/haproxy?stats



    더 많은 haporxy의 API는 아래 페이지에서 확인 가능 합니다.

    https://github.com/mesosphere/marathon-lb/


    지금까지 Mesos와 Marathon, Marathon-lb를 이용하여 기본적인 서비스 구성을 만들어 봤습니다.

    이제부터는 빌드와 배포를 위한 환경 구성을 해보도록 하겠습니다.

Designed by Tistory.