GCP上にDC/OS環境を構築する
はじめに
先日は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の機能があるのでそれを用いて構築したいと思いました。今後のアップデートに期待です。