目次


リトルエンディアン対応の RHEL 7.1 上に Mesos/Marathon クラスターをセットアップする

Comments

Mesos と Marathon

Mesos は、複数のタスクの間で動的にリソースを共有するという方法でリソース使用状況を改善することを目的とした、分散クラスター・マネージャーです。Mesos ではクラスターのすべてのノード上のリソースを 1 つの統合したリソースとしてとらえ、オペレーティング・システムのカーネルが単一のコンピューターにアクセスする方法と同じような方法で、それらのリソースにシームレスにアクセスすることができます。このことから、Mesos はデータ・センター用のカーネルとも呼ばれています。Mesos を使用することで、データ・センター・アプリケーションを構築するためのコアを手に入れて、Mesos のメイン・コンポーネントであるスケジューラーを使用してスケーラブルな 2 フェーズのスケジューリングを行うことができます。

Mesos クラスター・マネージャーの主なコンポーネントは以下のとおりです。

  • マスター: すべてのクラスター処理を調整するクラスター・マネージャー。高可用性をもたらすために、複数のマスターを使用することができます。
  • スレーブ (またはノード): タスクの実行場所となるクラスター・メンバー。
  • フレームワーク: クラスター内で実行される実際のタスク。各種のアプリケーションやサービスを Mesos クラスター・マネージャー上にデプロイするために使用できるフレームワークは、数多く存在します。

詳細については、このリンク先の「Mesos Architecture」を参照してください。

この後のセクションでは、そのようなフレームワークとして Marathon を使用して、アプリケーションとサービスを Mesos 上にどのようにしてデプロイするのかを説明します。

可用性

以下の表に、IBM PowerPC Little Endian (ppc64le) プラットフォームに関連するパッケージの場所を記載します。

Linux ディストリビューションパッケージの場所
Red Hat Enterprise Linux (RHEL) 7.XUnicamp

http://ftp.unicamp.br/pub/ppc64el/rhel/7_1/misc_ppc64el/ にアクセスして Unicamp リポジトリーを参照してください。

: IBM Power に他のディストリビューションをインストールする場合は、ソースからパッケージを作成する必要があります。

Marathon

Marathon は、Mesos 上で長時間実行されるアプリケーションやサービスを実行するために使用するフレームワークです。これらの長時間実行されるアプリケーションには高可用性の要件が伴います。したがって、Marathon では、アプリケーションをモニタリングし、障害が発生したアプリケーション・インスタンスを自動的に再起動できます。このため、アプリケーションを柔軟にスケーリングすることも可能なはずです。Marathon は Hadoop などの他のフレームワークや自身を実行することもできます。標準的な Marathon 使用法のワークフローでは、それぞれ 1 つのプロセッサーと 1 GB のメモリーを必要とする N 個のアプリケーション・インスタンスをクラスター内で実行することになります。この要求を Marathon に送信すれば、スレーブ上で N 個の Mesos タスクを作成できます。

Marathon には、サービスを起動、停止、スケーリングするために使用する REST (Representational State Transfer) API が用意されています。また、ブラウザー・ベースの GUI と、さらにコマンド・ライン・クライアントもあります。複数の Marathon インスタンスを実行することで、Marathon を高可用性モードで実行できます。

この記事では、Marathon を使用してどのようにしてサービスをデプロイするのか、そしてデプロイされたサービスをサンプル・アプリケーション内でどのようにして利用するのかを紹介します。ここで説明する手順は、Intel アーキテクチャー・ベースのサーバーと IBM Power アーキテクチャー (OpenPOWER) ベースのサーバーの両方に適用されます。デプロイするサービスは、MySQL データベース・サービスです。

以下の図に、Mesos/Marathon クラスターの概要を示します。

図 1. Mesos/Marathon クラスター

サービスの概要

サービスとは、独立してデプロイされて管理される、自己完結型の機能単位のことです。サービス指向アーキテクチャー (SOA) や、最近ではマイクロサービス・アーキテクチャーによって、疎結合された複数のサービスを集めてアプリケーションを構成するという方法が促進されています。最近のアプリケーションが複数のマイクロサービスを集めて構成されるようになってきている背景には、マイクロサービスがもたらす数々の利点があります。具体的には、コードの再利用、31000 から 32000 までの使いやすいデフォルト・ポート範囲、障害の影響の隔離、さまざまなプラットフォームのサポート、デプロイメントの柔軟性、俊敏性の向上などの利点が挙げられます。

処理が完了するまでの標準時間が短ければ、Mesos がバッチ処理、リアルタイム処理、およびその他の処理フレームワークに対処します。けれどもエンタープライズ・インフラストラクチャーによって実行される多くのアプリケーションとサービスは、完了するまでに時間がかかり、データ処理フレームワークとは要件が異なってきます。これらの長時間実行されるサービスはビジネスに極めて重要であると同時に、インフラストラクチャーのリソースの大部分を消費するため、Mesos 上でこれらのサービスを実行できるようにすることが重要です。

大規模にサービスを実行するには、インフラストラクチャーで以下の点に対処できなければなりません。

  • サービスが他のサービスに依存していて、サービスのデプロイ先に制約がある場合は、サービスのデプロイメントが複雑になります。
  • 管理の構成とパッケージ化は、サービスのすべての依存関係を満たし、サービスの開始前に環境がそのサービスに対して適切に構成されるようにするためのものです。
  • サービスの複数のインスタンスが実行される場合には、サービス・ディスカバリーとロード・バランシングが重要になります。サービス・ディスカバリーとは、特定のサービスのインスタンスがどこで実行されているかという質問に答えるものであり、ロード・バランシングとは、特定の要求を割り当てるべきインスタンスを決定するためのものです。
  • サービスがデプロイされた後は、サービスの正常性をモニタリングすることが重要です。正常性のモニタリングから得た情報は、サービスをスケールアップ/スケールダウンしたり、障害時にサービスを再起動したりするなどといった措置を取るために使用できます。
  • 高可用性の要件を満たすには、負荷が高いときや、障害が発生した場合でも、サービスを引き続き利用できる状態にしなければなりません。

RHEL を稼働する OpenPOWER サーバー上に Mesos/Marathon クラスターをセットアップする

以下の手順で、RHEL リトルエンディアン (LE) を稼働する Tyan などの OpenPOWER システム上にどのようにして Mesos/Marathon クラスターをセットアップするのかを説明します。

Mesos マスターと Marathon をインストールしてセットアップする

以下の手順に従って、Mesos マスターと Marathon をインストールしてセットアップします。

  1. Unicamp パッケージのリポジトリーを追加します。Mesos クラスター (mesos-master と mesos-slave) に参加するすべてのシステムに、以下のリポジトリーが追加されていることを確認します。
    	# cat > /etc/yum.repos.d/unicamp-misc.repo <<EOF
    	[unicamp-misc]
    	name=Unicamp Repo for Misc Packages
    	baseurl=http://ftp.unicamp.br/pub/ppc64el/rhel/7_1/misc_ppc64el/
    	enabled=1
    	gpgcheck=0
    	EOF
  2. 以下のコマンドを実行して必要なパッケージをインストールします。
    	# yum install mesos python-mesos zookeeper marathon
  3. Mesos マスターを構成します。/etc/sysconfig/mesos-master ファイルを編集して、以下の情報を追加します。
    MESOS_ip=MESOS_MASTER_IP
    MESOS_ZK=zk://localhost:2181/mesos
    MESOS_QUORUM=1

    mesos-master の IP アドレスが 192.168.122.31 の場合、編集後の構成ファイルの内容は以下のコードに示すようになります。

        # This file contains environment variables that are passed to mesos-master.
    	# To get a description of all options run mesos-master --help; any option
    	# supported as a command-line option is also supported as an environment
    	# variable.
    	# Some options you're likely to want to set:
    	MESOS_log_dir=/var/log/mesos
    	MESOS_work_dir=/var/run/mesos
    	MESOS_port=5050
    	
    	# For isolated sandbox testing
    	#MESOS_ip=127.0.0.1
    	MESOS_ip=192.168.122.31
    	MESOS_ZK=zk://localhost:2181/mesos
    	MESOS_QUORUM=1
  4. 以下のコマンドを実行して、ZooKeeper サービスと mesos-master サービスを再起動します。
    	# service zookeeper start
    	# service mesos-master start
  5. ネットワーク・ポートを開きます。デフォルトでは、mesos-master はポート 5050 を使用して通信します。このポートがローカル・ファイアウォールによってブロックされないようにしてください。ファイアウォールを使用している場合は、以下のコマンドを実行してパブリック・ゾーンの TCP ポートを開きます。
    	# firewall-cmd --zone=public --add-port=5050/tcp --permanent
    	# firewall-cmd –reload
  6. Mesos マスターを実行して、システム上に Marathon を構成します。
    	# cat >/etc/sysconfig/marathon<<EOF
    	MARATHON_MASTER=zk://localhost:2181/mesos
    	MARATHON_ZK=zk://localhost:2181/marathon
    	MARATHON_TASK_LAUNCH_TIMEOUT=600000
    	MESOS_NATIVE_JAVA_LIBRARY=/usr/lib64/libmesos.so.22
    	MESOS_NATIVE_LIBRARY=/usr/lib64/libmesos.so.22
    	EOF
  7. 以下のコマンドを実行して marathon サービスを起動します。
    	# service marathon start

Mesos スレーブをインストールしてセットアップする

すべての Mesos スレーブに Docker セットアップが構成されていることを確認します。RHEL LE に Docker をインストールして構成する方法について詳しくは、このリンク先の記事「Linux on Power 向け Docker」を参照してください。

  1. コマンド # yum install mesos python-mesos を実行して必要なパッケージをインストールします。
  2. Mesos スレーブを構成します。/etc/sysconfig/mesos-slave ファイル内の HOSTNAME 変数を編集して Mesos マスターの IP を指すようにした後、MESOS_EXECUTOR_REGISTRATION_TIMEOUT 変数と MESOS_IP 変数を設定します。
    例えば、mesos-master の IP アドレスが 192.168.122.31、mesos-slave の IP アドレスが 192.168.122.48 であるとすると、構成ファイルの内容は以下に示すようになります。
    # This file contains environment variables that are passed to mesos-slave.
    # To get a description of all options run mesos-slave --help; any option
    # supported as a command-line option is also supported as an environment
    # variable.
    # The mesos master URL to contact. Should be host:port for
    # non-ZooKeeper based masters, otherwise a zk:// or file:// URL.
    MESOS_master=192.168.122.31:5050
    MESOS_EXECUTOR_REGISTRATION_TIMEOUT=10mins
    MESOS_IP=192.168.122.48
    # For isolated sandbox testing
    #MESOS_master=127.0.0.1:5050
    # For a complete listing of options execute 'mesos-slave --help'
    MESOS_log_dir=/var/log/mesos
    MESOS_work_dir=/var/run/mesos
    MESOS_containerizers=docker,mesos
    # systemd cgroup integration
    MESOS_isolation='cgroups/cpu,cgroups/mem'
    MESOS_cgroups_root='system.slice/mesos-slave.service'
    MESOS_cgroups_hierarchy=/sys/fs/cgroup
  3. 以下のコマンドを実行して、mesos-slave サービスを再起動します。
    # service mesos-slave restart
  4. ネットワーク・ポートを開きます。デフォルトでは、mesos-slave はポート 5051 を使用して通信します。このポートがローカル・ファイアウォールによってブロックされないようにしてください。ファイアウォールを使用している場合は、以下のコマンドを実行してパブリック・ゾーンの TCP ポートを開きます。
    	# firewall-cmd --zone=public --add-port=5051/tcp -permanent
    	# firewall-cmd -reload

Marathon UI には、http://mesos_master_ip:8080 Web サイト内でアクセスできます。

例えば、mesos-master の IP アドレスが 192.168.122.31 の場合、http://192.168.122.31:8080 Web サイト内で Marathon UI リンクにアクセスできます。

Marathon を使用してアプリケーションをデプロイする

ソース・コードは、https://github.com/bpradipt/docker-mysql.git Web サイトから入手できます。

ソース・コードに含まれる Docker ファイルおよび関連するセットアップ・スクリプトによって、Intel システム上と Power (ppc64le) システム上の両方で MySQL Docker イメージをビルドできます。

以下の例で使用されている 192.168.122.48 は、Mesos サーバーと Marathon を実行中のシステムの IP アドレスです。

Marathon UI または REST API を使用して、直接アプリケーションをデプロイすることができます。例えば Marathon の REST API を使用する場合、以下のコマンドを使用してアプリケーションをデプロイできます。

curl -X POST http://192.168.122.48:8080/v2/apps -d @mysqlcontainer.json -H "Content-type: application/json"
#cat mysqlcontainer.json
{
  "id": "mysql",
  "cpus": 0.5,
  "mem": 64.0,
  "instances": 1,
  "container": {
    "type": "DOCKER",
    "docker": {
      "image": "ppc64le/mysql",
      "network": "BRIDGE",
      "portMappings": [
        { "containerPort": 3306, "hostPort": 0, "servicePort": 0, "protocol": "tcp" }
      ]
    }
  },
  "env": {
     "MYSQL_ROOT_PASSWORD" : "password",
     "MYSQL_USER" : "test",
     "MYSQL_PASSWORD" : "test",
     "MYSQL_DB" : "BucketList"
   }
}

hostPort にゼロ以外の値が設定されていると、ランダムなポートが割り当てられることになります。hostPort 値を明示的に指定することもできます。ただし、hostPort に指定するポートは、いずれかのリソースに含まれる必要があります。例えば、デフォルトのポート範囲 31000 ~ 32000 の他に 7000 ~ 8000 のポート範囲を使用する必要がある場合は、以下のオプションを使用します。
–resources="ports(*):[7000-8000, 31000-32000]"

Marathon フレームワークを使用してデプロイ済みサービスに接続する

このセクションでは、MySQL サービスを使用して、Marathon によってデプロイされたサービスに接続して使用するにはどのようにするのか、およびデプロイ済みサービスをサンプル Web アプリケーション内で使用するにはどのようにするのかを説明します。

ソース・コードは、https://github.com/bpradipt/sampleflaskapp.git Web サイトから入手できます。サンプル・コードには、Intel アーキテクチャーと PowerPC LE (ppc64le) アーキテクチャーの両方に使用できる Docker ファイルが含まれています。

Docker のリンクを使用してサービスに接続する

サービスがデプロイされたら、サービスを検出して接続する、つまりサービスからアプリケーションにリンクする必要があります。サービスは、他のサービスに依存する場合があるため、コンテナーをリンクすることが重要です。

Marathon を使用してサービスをリンクする場合は、以下の点に注意してください。

  • Mesos/Marathon には、Docker リンク別名を使用するための手段がありません。そのため、アプリケーション構成がリンク別名に依存していると、アプリケーションは機能しません。例えば、DB コンテナーに依存する Web アプリケーションが DB リンク・プレフィックス (DB_PORT、DB_TCP_ADDR など) を設定した環境変数を使用しているとしたら、アプリケーション構成でリンク別名プレフィックスに依存しないようにしてください。
  • リンクされたアプリケーションとサービスは、同じホスト上にデプロイされない限り、通信できません。

リンクされたコンテナーを同じノード上にデプロイするには、以下の例に示すように、constraints パラメーターを使用します。

	$ curl -X POST -H "Content-type: application/json" localhost:8080/v2/apps -d '{
	   "id": "sleep-cluster",
	   "cmd": "sleep 60",
	   "instances": 3,
	   "constraints": [["hostname", "CLUSTER", "a.specific.node.com"]]
	}'

上記のコードを使用するには、以下の例に示すように、hostname パラメーターを指定して mesos-slave を起動します。

	# mesos-slave --master=zk://192.168.122.48:2181/mesos --containerizers=docker,mesos --executor_registration_timeout=10mins --ip=192.168.122.253 --hostname=Ubuntu

Marathon API を使用して、リンクされたコンテナーを起動する

このセットアップは、OpenPOWER (PowerPC アーキテクチャー) ベースの環境上で行われていますが、同じインフラストラクチャーを Intel ベースの環境に使用することもできます。

ターゲット・コンテナーの名前をリンク・キーの値として指定します。さらに、constraints パラメーターを使用して、新しいコンテナーが稼働中のターゲット・コンテナーと同じホスト上にデプロイされるようにします。

curl -X POST http://192.168.122.48:8080/v2/apps -d @flaskcontainer.json -H "Content-type: application/json"
# cat flaskcontainer.json
{
  "id": "flaskappcontainer",
  "cpus": 0.5,
  "mem": 64.0,
  "instances": 1,
  "container": {
    "type": "DOCKER",
    "docker": {
      "image": "ppc64le/flaskapp",
      "network": "BRIDGE",
      "portMappings": [
        { "containerPort": 80, "hostPort": 0, "servicePort": 0, "protocol": "tcp" }
      ],
      "parameters": [
                { "key": "link", "value": "mesos-b81f9a21-3133-49de-acf6-988226eb6874-S18.5d3dcaa7-05c6-4a5b-af68-dba32b7d1835"}
            ]
    }
  },
  "constraints": [
                [ "hostname","CLUSTER","ubuntu" ]
              ]
}

サービスのディスカバリーと接続に mesos-DNS を使用する

mesos-DNS は、Mesos クラスター内で実行中のアプリケーションごとに、IP アドレスとポート番号のマッピング・アプリケーションを作成します。

mesos-DNS は、https://github.com/mesosphere/mesos-dns Web サイトから入手できます。mesos-DNS には Go コンパイラーが必要です。Go コンパイラーが使用可能であれば、任意のプラットフォーム上で簡単に mesos-DNS をビルドすることができます。

ソース自体に含まれているサンプル構成ファイルは、https://github.com/mesosphere/mesos-dns/blob/master/config.json.sample Web サイトから入手することもできます。

一例として、このセットアップに使用した構成を以下に記載します。

{
  "zk": "zk://192.168.122.48:2181/mesos",
  "masters": ["192.168.122.48:5050"],
  "refreshSeconds": 60,
  "ttl": 60,
  "domain": "mesos",
  "port": 53,
  "resolvers": ["8.8.8.8"],
  "timeout": 5,
  "listener": "0.0.0.0",
  "SOAMname": "ns1.mesos",
  "SOARname": "root.ns1.mesos",
  "SOARefresh": 60,
  "SOARetry":   600,
  "SOAExpire":  86400,
  "SOAMinttl": 60,
  "dnson": true,
  "httpon": true,
  "httpport": 8125,
  "externalon": true,
  "IPSources": ["netinfo", "mesos", "host"],
  "EnforceRFC952": false
}

ここで:

  • zk は、ZooKeeper が稼働している場所です。
  • masters は、マスターが稼働している場所です。
  • domain は、Mesos クラスターのドメイン名です。
  • port は、Mesos DNS ポートです。
  • listener は、mesos-DNS にバインドする IP です。
  • resolver は、外部 DNS サーバーです。
  • httpport は、mesos-DNS の HTTP API が実行されるポートです。

mesos-DNS 構成パラメーターの詳細については、このリンク先の Web サイト「Mesos-DNS Configuration Parameters」を参照してください。

mesos-dns は、任意のホスト上で直接実行することも、Marathon フレームワークを使用して実行することもできます。以下に例を示します。

curl -X POST http://192.168.122.48:8080/v2/apps -d @mesos-dns.json -H "Content-type: application/json"

以下のコードにより、Marathon から mesos-DNS が起動します。

curl -X POST http://192.168.122.48:8080/v2/apps -d @mesos-dns.json -H "Content-type: application/json"

以下のコードにより、Marathon から mesos-DNS が起動します。

# cat mesos-dns.json
{
    "cmd": "<path>/mesos-dns -config=<path>/config.json",
    "cpus": 1.0,
    "mem": 1024,
    "id": "mesos-dns",
    "instances": 1,
}

ホスト上で直接 mesos-DNS を実行する場合は、以下のコマンドを使用します。

# mesos-dns -v=1 -config=<path_to_config_json>

サービスを指定するには、以下のフォーマットを使用します。

<service-name>.<framework>.<domain-name>

上記のフォーマットに従うと、MySQL サービスの DNS 名は mysql.marathon.mesos となります。

mesos-DNS は、サービスの DNS SRV レコードも作成します。SRV レコードは、サービス名をホスト名と IP ポートに関連付けます。mesos-DNS は、サービスの DNS-SRV レコードを _task._protocol.framework.domain という名前で生成します。

ここで:

  • task は、起動したアプリケーション/サービス (この例の場合は MySQL) です。
  • protocol は、UDP または TCP です。framework は、Marathon またはその他のフレームワークです。
  • domain は、クラスターのドメイン (この例の場合は Mesos) です。

この SRV レコードは、他の Marathon アプリケーションがサービスを検出するために使用できます。

一例として、MySQL サービスを必要とする任意のアプリケーションが、_mysql_tcp.marathon.mesos を探すために SRV レコードを検索することができます。

# docker ps
CONTAINER ID IMAGE          COMMAND    CREATED       STATUS                PORTS                        NAMES
e227390bfb3d ppc64le/mysql "/setup.sh" 3 seconds ago Up Less than a second 0.0.0.0:31172->3306/tcp   mesos-fabb6e52-064a-425a-a501-330bc772cd55-S16.85fb3e7c-b2ca-412f-ac75-1ec314bee575
# dig _mysql._tcp.marathon.mesos -t SRV
; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7 <<>> _mysql._tcp.marathon.mesos -t SRV
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2126
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; QUESTION SECTION:
;_mysql._tcp.marathon.mesos. IN SRV
;; ANSWER SECTION:
_mysql._tcp.marathon.mesos. 60 IN SRV 0 0 31172 mysql-4huw5-s16.marathon.slave.mesos.
;; ADDITIONAL SECTION:
mysql-4huw5-s16.marathon.slave.mesos. 60 IN A 192.168.122.48
;; Query time: 1 msec
;; SERVER: 192.168.122.48#53(192.168.122.48)
;; WHEN: Mon Feb 08 14:27:38 IST 2016
;; MSG SIZE rcvd: 147

mesos-DNS の命名規則について詳しくは、このリンク先のページ「Service Naming」を参照してください。

以下に、dnspython モジュールを使用して SRV レコードを照会し、サービスにアクセスするために必要なホストとポートを検索する Python コードの例を記載します。

import dns.resolver

a = dns.resolver.query("_mysql._tcp.marathon.mesos",dns.rdatatype.SRV)
for i in a.response.answer:
    for j in i.items:
        print j.target
        print j.port

サンプル・セットアップ内での出力は、以下のとおりです。

mysql-4huw5-s16.marathon.slave.mesos.
31172

上記の出力から、MySQL サービスが mysql-4huw5-s16.marathon.slave.mesos というホスト名のスレーブ上のポート 31172 で実行されていると推測できます。

同様のロジックを直接アプリケーション構成に組み込んだり、データを使用してアプリケーション構成に必要な環境変数を設定したりすることもできます。例えば、MYSQL_TCP_ADDR および MYSQL_TCP_PORT 環境変数を、ターゲットとポートから返されたそれぞれの値に設定することができます。

つながる

IBM Linux Technology Center (LTC) は、Linux オープンソース開発コミュニティーと連携して取り組む IBM オープンソース・ソフトウェア開発者からなるチームです。Linux の技術コンピテンシーの中心的役割を果たす LTC とつながってください。

Twitter でフォローするコミュニティーに参加する著者のブログを読む


ダウンロード可能なリソース


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux
ArticleID=1039669
ArticleTitle=リトルエンディアン対応の RHEL 7.1 上に Mesos/Marathon クラスターをセットアップする
publish-date=11172016