この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
先日はAWS上にDC/OS環境を構築してみました。しかし、プラットフォームに依存せずに分散処理実行環境を作れるのがDC/OSの一番のメリットです。そこで今回はGCP(Google Cloud Platform)上にDC/OS環境を構築してみました。
やってみた
手順は公式ドキュメントに則ります。
ブートストラップノードのセットアップ
AWSの場合はCloudFormationからEC2 AutoScalingを構成して...と簡単にできましたが、GCPでは自分でインスタンスを構築していく必要があります。まずDC/OSクラスタ環境をセットアップするためのブートストラップノードとなるインスタンスを構築します。
GCPのコンソールから[Compute Engine]を選択します。
VMインスタンス画面で[インスタンスを作成]をクリックします。
[インスタンスの作成]画面が表示されます。[名前]、[ゾーン]を設定します。OSイメージは[CentOS 7]を選択します。[IDとAPIへのアクセス]欄では[すべてのCloud APIに完全アクセス権を許可]を選択します。
[SSHキー]欄で[プロジェクト全体のSSHキーをブロック]をチェックします。準備ができたら[作成]ボタンをクリックします。
インスタンスが起動したら、[接続]-[ブラウザウィンドウで開く]をクリックします。これでブラウザ上にコンソール画面が立ち上がります。
ブートストラップノードの初期設定として、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つのインスタンスが起動しています。
DC/OSクラスタへのアクセス
DC/OSクラスタへはマスターノードのパブリックIPアドレスにWebブラウザでアクセスすれば良いのですが、この状態では接続できず、ファイアウォールの設定を行う必要があります。
GCPのコンソールから[ネットワーキング]-[ファイアウォールルール]を選択し、[ファイアウォールルールを作成]をクリックします。
[ファイアウォールルールの作成]画面が開きます。任意の名前をつけます。ネットワークはDC/OSクラスタが所属しているサブネットを選択します。ソースフィルタで接続元IPアドレスの制限を行います。[許可対象プロトコルとポート]で[tcp:80; tcp:8080]を許可します。80はDC/OS用、8080はMarathon用です。
この状態でマスターノードのパブリックIPアドレスにWebブラウザでアクセスすると、DC/OSクラスタのログイン画面が表示されます。
ログインしたところ。
この後の使い方はこちらの記事を参照してください。
さいごに
インスタンスの可用性やスケールが担保されないとDC/OSの魅力が半減するので、インスタンスを手作業で立ち上げるのは辛いですね。GCPにもAutoscalingの機能があるのでそれを用いて構築したいと思いました。今後のアップデートに期待です。