GCP上にDC/OS環境を構築する

はじめに

先日はAWS上にDC/OS環境を構築してみました。しかし、プラットフォームに依存せずに分散処理実行環境を作れるのがDC/OSの一番のメリットです。そこで今回はGCP(Google Cloud Platform)上にDC/OS環境を構築してみました。

やってみた

手順は公式ドキュメントに則ります。

ブートストラップノードのセットアップ

AWSの場合はCloudFormationからEC2 AutoScalingを構成して...と簡単にできましたが、GCPでは自分でインスタンスを構築していく必要があります。まずDC/OSクラスタ環境をセットアップするためのブートストラップノードとなるインスタンスを構築します。

GCPのコンソールから[Compute Engine]を選択します。

Compute_Engine_-_cm-sasaki-daisuke

VMインスタンス画面で[インスタンスを作成]をクリックします。

Compute_Engine_-_cm-sasaki-daisuke 2

[インスタンスの作成]画面が表示されます。[名前]、[ゾーン]を設定します。OSイメージは[CentOS 7]を選択します。[IDとAPIへのアクセス]欄では[すべてのCloud APIに完全アクセス権を許可]を選択します。

Compute_Engine_-_cm-sasaki-daisuke 3

[SSHキー]欄で[プロジェクト全体のSSHキーをブロック]をチェックします。準備ができたら[作成]ボタンをクリックします。

Compute_Engine_-_cm-sasaki-daisuke 4

インスタンスが起動したら、[接続]-[ブラウザウィンドウで開く]をクリックします。これでブラウザ上にコンソール画面が立ち上がります。

Compute_Engine_-_cm-sasaki-daisuke 5

ブートストラップノードの初期設定として、sudoコマンドでrootにスイッチした後、以下のコマンドを実行して必要なパッケージをインストールします。

$ sudo -s
# gcloud components update &&
sudo yum update &&
sudo yum install epel-release &&
sudo yum install python-pip &&
sudo pip install -U pip &&
sudo pip install apache-libcloud &&
sudo pip install docker-py &&
sudo yum install git ansible

途中で何度か確認のプロンプトが表示されますので全部[y]を入力して進みます。

SSHキーペアのセットアップ

次にDC/OSクラスタノードへのログインとセットアップに使うためのSSHキーペアを作成します。rootユーザーから一般ユーザーに戻って実行します。

$ ssh-keygen -t rsa -f ~/.ssh/id_rsa -C smokeymonkey
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): <パスフレーズ>
Enter same passphrase again: <パスフレーズ>

以下のように、ユーザーのホームディレクトリの.ssh配下にSSHキーペアが作成されます。

$ ls -alF ./.ssh/
total 12
drwx------. 2 smokeymonkey smokeymonkey   58 Jul 16 01:30 ./
drwxr-xr-x. 4 smokeymonkey smokeymonkey   84 Jul 16 01:26 ../
-rw-------. 1 smokeymonkey smokeymonkey  766 Jul 16 01:25 authorized_keys
-rw-------. 1 smokeymonkey smokeymonkey 1766 Jul 16 01:30 id_rsa
-rw-r--r--. 1 smokeymonkey smokeymonkey  394 Jul 16 01:30 id_rsa.pub

公開鍵のバックアップを作ります。

$ cp ./.ssh/id_rsa.pub ./.ssh/id_rsa.pub.original
$ ls -alF ./.ssh/id_rsa.pub*
-rw-r--r--. 1 smokeymonkey smokeymonkey 394 Jul 16 01:30 ./.ssh/id_rsa.pub
-rw-r--r--. 1 smokeymonkey smokeymonkey 394 Jul 16 01:35 ./.ssh/id_rsa.pub.original

公開鍵を編集し、行頭にユーザー名を追加します。

$ vi ./.ssh/id_rsa.pub
ssh-rsa abcdefghijklmnopqrstuvwxyz smokeymonkey
↓
smokeymonkey:ssh-rsa abcdefghijklmnopqrstuvwxyz smokeymonkey

公開鍵のパーミッションを変更します。

$ chmod 400 ~/.ssh/id_rsa

GCPのプロジェクトにSSH公開鍵を追加します。

$ gcloud compute project-info add-metadata --metadata-from-file sshKeys=~/.ssh/id_rsa.pub

Dockerのセットアップ

ブートストラップノードにDockerをセットアップします。まずはSELinuxを無効化します。

$ cat /etc/selinux/config | grep SELINUX
SELINUX=enforcing

$ sudo vi /etc/selinux/config 
SELINUX=disabled

$ sudo reboot

Dockerをインストールするために、DockerのリポジトリをYumに登録します。

$ sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
> [dockerrepo]
> name=Docker Repository
> baseurl=https://yum.dockerproject.org/repo/main/centos/7/
> enabled=1
> gpgcheck=1
> gpgkey=https://yum.dockerproject.org/gpg
> EOF

$ cat /etc/yum.repos.d/docker.repo
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg

yumでdocker-engineをインストールします。

$ sudo yum install docker-engine

Dockerのsystemdサービスファイルを書き換えます。

$ sudo vi /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/docker daemon -H fd://
↓
ExecStart=/usr/bin/docker daemon -H fd:// --graph="/mnt/docker-data" --storage-driver=overlay

そしてSystemdをリロードします。

$ sudo systemctl daemon-reload

Dockerを起動します。

sudo systemctl start docker.service

Dockerの動作確認をします。

$ sudo docker run hello-world
Hello from Docker!
...(snip)...

GCE用DC/OSセットアップスクリプトの準備

githubで公開されている、GCE用のDC/OSセットアップスクリプトをcloneしてきます。

$ git clone https://github.com/ajazam/dcos-gce
$ cd dcos-gce

セットアップファイルの内容を確認します。

$ cat group_vars/all | grep "^[^¥n]"
---
project: trek-trackr
subnet: default-6f68d4d6fabcb680
login_name: ajazam
bootstrap_public_ip: 10.132.0.2
zone: europe-west1-d
master_boot_disk_size: 10
master_machine_type: n1-standard-1
master_boot_disk_type: pd-standard
agent_boot_disk_size: 10
agent_machine_type: n1-standard-1
agent_boot_disk_type: pd-standard
agent_instance_type: "MIGRATE"
agent_type: private
start_id: 0001
end_id: 0001
gcloudbin: /usr/bin/gcloud
image: '/centos-cloud/centos-7-v20160606'
bootstrap_public_port: 8080
cluster_name: cluster_name
scopes: "default=https://www.googleapis.com/auth/cloud-platform"
dcos_installer_filename: dcos_generate_config.sh
dcos_installer_download_path: "https://downloads.dcos.io/dcos/EarlyAccess/{{ dcos_installer_filename }}"
home_directory: "/home/{{ login_name }}"
downloads_from_bootstrap: 2
dcos_bootstrap_container: dcosinstaller

一部必要なところだけ修正しておきます。具体的にはproject、subnet、login_name、bootstrap_public_ip、zoneです。

$ vi group_vars/all
project: <プロジェクトID>
subnet: <ネットワーク>
login_name: smokeymonkey
bootstrap_public_ip: <ブートストラップインスタンスの内部IP>
zone: asia-east1-a

ansible.cfgを編集し、host_key_checkingを無効化します。

$ vi ~/.ansible.cfg
[defaults]
host_key_checking = False

[paramiko_connection]
record_host_keys = False

[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o UserKnownHostsFile=/dev/null

もう1点。hostsファイルにマスターノードのIPアドレスが直書きされているのですが、これをsubnetのIPアドレス範囲に修正します。

[masters]
master0 ip=10.132.0.3
↓
master0 ip=10.140.0.3

DC/OSクラスタのセットアップ

では、ここからが実際の構築です。まずはマスターノードをセットアップするためにansbileを実行します。

$ ansible-playbook -i hosts install.yml

続いてプライベートノードのセットアップを実行します。

$ ansible-playbook -i hosts add_agents.yml --extra-vars "start_id=0001 end_id=0002 agent_type=private"

最後にパブリックノードのセットアップを実行します。

$ ansible-playbook -i hosts add_agents.yml --extra-vars "start_id=0003 end_id=0004 agent_type=public"

セットアップが終わった後のCompute Engineの画面。ブートストラップノード、マスターノード、パブリックノードx2、プライベートノードx2の6つのインスタンスが起動しています。

Compute_Engine_-_cm-sasaki-daisuke 6

DC/OSクラスタへのアクセス

DC/OSクラスタへはマスターノードのパブリックIPアドレスにWebブラウザでアクセスすれば良いのですが、この状態では接続できず、ファイアウォールの設定を行う必要があります。

GCPのコンソールから[ネットワーキング]-[ファイアウォールルール]を選択し、[ファイアウォールルールを作成]をクリックします。

ネットワーキング_-_cm-sasaki-daisuke

[ファイアウォールルールの作成]画面が開きます。任意の名前をつけます。ネットワークはDC/OSクラスタが所属しているサブネットを選択します。ソースフィルタで接続元IPアドレスの制限を行います。[許可対象プロトコルとポート]で[tcp:80; tcp:8080]を許可します。80はDC/OS用、8080はMarathon用です。

ネットワーキング_-_cm-sasaki-daisuke 3

この状態でマスターノードのパブリックIPアドレスにWebブラウザでアクセスすると、DC/OSクラスタのログイン画面が表示されます。

DC_OS

ログインしたところ。

DC_OS 2

この後の使い方はこちらの記事を参照してください。

さいごに

インスタンスの可用性やスケールが担保されないとDC/OSの魅力が半減するので、インスタンスを手作業で立ち上げるのは辛いですね。GCPにもAutoscalingの機能があるのでそれを用いて構築したいと思いました。今後のアップデートに期待です。