読者です 読者をやめる 読者になる 読者になる

Google Container Engineの無限のリソースでRStudioを動かす

Docker R Google Compute Engine

これまでのあらすじ:R使いのためのDocker「Rocker」を使ってみる(Windows) - Technically, technophobic.

せっかくDockerに触ってみたので、RstudioをGoogleの(お金さえあるなら)無限のリソースで動かしてみたいと思います。お金はないですが、フリートライアルでやる分にはタダなのでやってみます。タダは正義。

まだアルファリリースですが、GKEを使ってみます。(アルファリリースなので、今回やった手順はそのうち動かなくなると思います。ご注意ください)

Google Container Engine — Google Cloud Platform

※GCEにコンテナを立てたほうが確実ではあります。その場合の手順はこの辺が参考になると思います:

Container-optimized Google Compute Engine images - Google Compute Engine — Google Cloud Platform

Google Cloud Platform - Docker Documentation

Google Cloud Platformにサインアップ

トップページから、「Start Free Trial」みたいなあたりをクリックして名前とかクレジットカードなどのアカウント情報を入力します。

Google Cloud Computing, Hosting Services & Cloud Support — Google Cloud Platform

アカウントをつくれたら、以下のボタンからプロジェクトをつくります。

f:id:yutannihilation:20141221102603p:plain

プロジェクトの中身は特にいじらなくて大丈夫です。

次に、以下のリンクから、つくったプロジェクトでGoogle Container Engineを有効にします。(この手順は変わるかもしれないので、公式ドキュメントを参照してください)

https://console.developers.google.com/project/_/kubernetes/list

コマンドラインツールをインストール

gcloud compute - Google Compute Engine — Google Cloud Platformに書いてある手順にしたがってgcloud computeをインストールします。

標準のままだとまだGoogle Container Engineは使えないので、以下のコマンドでツールをアップデートします。ちなみに、WindowsCLIでもこのコマンド動くんですが、まだGKEのAPIに対応していないみたいでした。。

gcloud components update preview

認証

gcloud auth login

とやると、ブラウザが立ち上がってログイン画面が出ます。もうログインしている場合はアカウントの選択画面が出ます。画面の指示に従って先に進みます。

デフォルトのプロジェクトID、ゾーン名を設定しておくと、毎回--projectとか--zoneを指定しなくてよくて便利です。プロジェクト名ではなくてプロジェクトIDを指定するのに注意です。

gcloud config set project プロジェクトID
gcloud config set compute/zone asia-east1-a

clusterをつくる

clusterはたぶん、Dockerホスト的な存在です。たぶん。マシンタイプは、f1-microとかだと動かないという噂を見かけたので、g1-smallにしています。

gcloud preview container clusters create クラスタ名 \
  --num-nodes 1 \
  --machine-type g1-small

しばらくしてできたクラスタの詳細が返ってきたら成功です。具体的には、以下のような2つのインスタンスを作成しています。

$ gcloud compute instances list
NAME                ZONE         MACHINE_TYPE INTERNAL_IP    EXTERNAL_IP    STATUS
k8s-クラスタ名-node-1 asia-east1-a g1-small     10.XXX.XXX.XXX XX.XXX.XXX.XXX RUNNING
k8s-クラスタ名-master asia-east1-a g1-small     10.XXX.XXX.XXX XX.XXX.XXX.XXX RUNNING

プロジェクトIDやゾーンと同じく、クラスタ名のデフォルトも設定しておくと、毎回--cluster-nameを指定しなくてもよくて便利です。

gcloud config set container/cluster クラスタ名

つくったクラスタの一覧や詳細を見たいときは以下のコマンドを打ちます。

gcloud preview container clusters list
gcloud preview container clusters describe クラスタ名

podをつくる

podはたぶん、Dockerコンテナ的な存在です。たぶん。--imageでDockerhubにあるイメージを指定できます。--portで指定したポートに外からのアクセスを許します(ただしファイヤーウォールもあるのでこの時点ではまだ外からアクセスできません)。

gcloud preview container pods create --name ポッド名 \
  --image=rocker/hadleyverse \
  --port=8787

コマンドが終わってもまだpodは作り終わっていないこともあります。(私の場合は数分かかりました。たぶんdocker pullしてくる時間?)。pods listコマンドでSTATUSがRunningになっていればもう準備できています。Pendingとかになっていればまだ待ちましょう。

$ gcloud preview container pods list
NAME                IMAGE(S)             HOST                                                        LABELS              STATUS
ポッド名             rocker/hadleyverse   k8s-クラスタ名-node-1.c.プロジェクト名.internal/XXX.XXX.XXX.XXX   name=ポッド名        Running

ファイヤーウォールを設定する

上でポートをあけましたが、それだけでは外からアクセスできません。ファイヤーウォールの設定が必要です。ルール名は適当につけましょう。

gcloud compute firewall-rules create ルール名 \
  --allow tcp:8787 \
  --target-tags k8s-クラスタ名-node

設定できたか確認するにはgcloud compute firewall-rules listでルールの一覧を表示します。

--target-tagsは何を指定するのか謎だったんですが、nodeのインスタンスに設定されているタグを指定するみたいです。こんな感じで確認できます↓

$ gcloud compute instances describe k8s-クラスタ名-node-1 | grep -A3 tags
tags:
  fingerprint: XXXXXXXXXX
  items:
  - k8s-クラスタ名-node

これでもう準備完了です。

アクセスしてみる

podsのIPはnodeインスタンスのIPです。pods listで表示できます。↓のXXX.XXX.XXX.XXXとなっている部分がIPです。

$ gcloud preview container pods list
NAME                IMAGE(S)             HOST                                                        LABELS              STATUS
ポッド名             rocker/hadleyverse   k8s-クラスタ名-node-1.c.プロジェクト名.internal/XXX.XXX.XXX.XXX   name=ポッド名        Running

http://XXX.XXX.XXX.XXX:8787 にアクセスするとログイン画面が出ます。ユーザ名、パスワードともにrstudioでログインできます。

f:id:yutannihilation:20141221121402p:plain

後片付け

金に飽かしてリソースを消費しまくる計算をして満足したら、プロジェクトを消しましょう。

その前にまずpodを止めます。(プロジェクトは、削除してもすぐには消えません)

gcloud preview container pods delete ポッド名

これでもうさっきまでアクセスできていたRStudioにアクセスできなくなっています。

次に、Billing & Settingのページにいきます。

https://console.developers.google.com/project/プロジェクト名/settings

「Disable Billing」で課金を無効にすると、「Delete Project」のボタンが押せるようになります。ボタンを押すと、ほんとに消すの? 私のことは遊びだったのね?と聞かれるので、プロジェクト名をタイプして真剣度を伝えましょう。悪いけどいつまでも一緒にはいられないんだ。ごめん。

今回できなかったこと

今回はテストということでポートもRStudioのユーザ認証も標準のものを使っていますが、これはセキュリティ的にあまり好ましいことではありません。特に重要なデータを分析する環境として使うならまずいです。

IPython NotebookのDockerイメージは、少なくともパスワードは変えられるようになっていました(昨日の記事を参照)。Rockerも自分でDockerfileを書いて設定を変えればいいんでしょうけど、ちょっとDocker慣れしていないのでうまい書き方が分かりませんでした。ご存知の方教えてください。。

感想

GCPはじめて使ったんですけど、お手軽でいいですね。無限のリソース、とか書いておきながらみみっちい使い方しかしてなくてすみません。誰かベンチマークとか流してくれないかなー。

どれを使うか迷う、というのはあるので、その辺の勘が働くようになるまでにはもうちょっと経験が必要そうではあります。またそのうち機会があれば使ってみます。