これまでのあらすじ: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
アカウントをつくれたら、以下のボタンからプロジェクトをつくります。
プロジェクトの中身は特にいじらなくて大丈夫です。
次に、以下のリンクから、つくったプロジェクトでGoogle Container Engineを有効にします。(この手順は変わるかもしれないので、公式ドキュメントを参照してください)
https://console.developers.google.com/project/_/kubernetes/list
コマンドラインツールをインストール
gcloud compute - Google Compute Engine — Google Cloud Platformに書いてある手順にしたがってgcloud compute
をインストールします。
標準のままだとまだGoogle Container Engineは使えないので、以下のコマンドでツールをアップデートします。ちなみに、Windows版CLIでもこのコマンド動くんですが、まだ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
でログインできます。
後片付け
金に飽かしてリソースを消費しまくる計算をして満足したら、プロジェクトを消しましょう。
その前にまず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はじめて使ったんですけど、お手軽でいいですね。無限のリソース、とか書いておきながらみみっちい使い方しかしてなくてすみません。誰かベンチマークとか流してくれないかなー。
どれを使うか迷う、というのはあるので、その辺の勘が働くようになるまでにはもうちょっと経験が必要そうではあります。またそのうち機会があれば使ってみます。