docker
Bluemix
kubernetes
TensorFlow

BluemixのKubernetesクラスターにDockerHubのTensorFlowイメージをデプロイする

以前にもBluemixのDockerコンテナ上でTensorFlowを動かす手順を書いたことがあるのですが、一年も経たないうちに時代遅れの役立たずになってしまいました。
BluemixがKubernetesクラスタ環境の提供を開始し、今後はこれに一本化されるようなので、Kubernetesを前提に全面改訂しました。手順は以下のとおりです。

  1. Kubernetesクラスターを作成する
  2. CLI環境をセットアップする
  3. TensorFlow用Pod定義ファイルを作成する
  4. TensorFlowイメージをデプロイする

1. Kubernetesクラスターを作成する

Bluemixアカウント(トライアルアカウントでOK)はすでに持っている前提で話を進めます。本記事では次のアカウントを使用しています。

  • アカウント名(IBMid):bmx01@takeyan.xyz
  • 組織名:bmx01
  • スペース名:Dallas

まずBluemixのポータル(https://bluemix.net )にログインし、カタログのページに移動して、左ペインの全てのカテゴリーから「コンテナー」を選択します。
「Kubernetes Cluster」の方をクリックして、作成画面に入ります。(「Container Registry」タイトルを選択とか言っていますが気にせずに(笑))
Screen Shot 2017-09-17 at 9.47.33.png

作成画面でそのまま「クラスターの作成」をクリックします。クラスター名はデフォルトのmyclusterで構いません。
Screen Shot 2017-09-17 at 9.49.57.png

画面が切り替わりますが、まだクラスターは作成中です。
Screen Shot 2017-09-17 at 9.55.34.png

Prerequisites以下には、後の手順で使うコマンドが紹介されているので参考にして下さい。
Screen Shot 2017-09-17 at 9.54.07.png

「準備完了」になったら「ワーカー・ノード」のページを開いて、ノードに割り当てられている「パブリックIP」をメモしておいて下さい。ここでは184.172.229.128になっています。TensorFlowのデプロイまで進んだ後、最後にこのIPアドレスにアクセスします。
Screen Shot 2017-09-17 at 10.19.44.png

「デプロイ中」が「準備完了」に変わるまで結構時間がかかるようです(経験上は10〜20分程度)。
ここでクラスター作成は「デプロイ中」のまま一旦放置して、Bluemixがクラスターを準備している間にCLIのセットアップに進むことにします。

2. CLI環境をセットアップする

2-1. Bluemix CLIをインストールする

最新のインストーラーをこちらのページからダウンロードして実行して下さい。
MacやLinuxユーザーで、ターミナルからコマンド一発でインストールしたい方は以下のコマンドを実行して下さい。

macOS
sh <(curl -fsSL https://clis.ng.bluemix.net/install/osx)
Linux
sh <(curl -fsSL https://clis.ng.bluemix.net/install/linux)

Windowsでもコマンドによるインストールが可能です。手順の詳細はこちらを参照して下さい。

2-2. コンテナサービス用プラグインをインストールする

Bluemix CLIがインストールできたら、Bluemixのコンテナサービス用プラグインを追加でインストールします。以下のコマンドを実行して下さい(Mac,Linux,Windows共通です)。

bx plugin install container-service -r Bluemix
bx plugin list

以下にWindows環境での実行例を示します。
Screen Shot 2017-09-14 at 11.05.42.png

手順の詳細はこちらを参照して下さい。

2-3. Kubernetes CLIをインストールする

Kubernetes CLIのインストール手順はこちらのページに説明があります。
またこちらのページのプラグインインストール手順の直後の③④にも説明があります(こちらの方が日本語なのでわかりやすいかも知れません)。
以下はKubernetesのWebサイトのインストール手順説明のページです。該当するOS環境のタブをクリックして手順を確認して下さい。
Screen Shot 2017-09-14 at 10.12.09.png

MacおよびLinuxの場合はそれぞれターミナルで次のコマンドを実行します。

macOS
curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/darwin/amd64/kubectl
chmod +x ./kubectl 
sudo mv ./kubectl /usr/local/bin/kubectl 
Linux
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
chmod +x ./kubectl 
sudo mv ./kubectl /usr/local/bin/kubectl 

Windowsはkubectl.exeファイル(コマンドそのもの)がダウンロードされるので、これをPATHの通っているフォルダに置いて下さい。Bluemix CLIのフォルダ(C:\Program Files\IBM\Bluemix\bin)でもいいと思います。
kubectlを引数なしで実行して、引数の一覧が表示されたらOKです。

2-4. kubectlコマンド実行環境をセットアップする

kubectlコマンドで、Bluemix上のKubernetesクラスター環境に接続して操作するための環境をセットアップします。手順はこちらの「IBM Bluemix Container Service でクラスターに対して kubectl コマンドを実行するように CLI を構成する 」以下を参照して下さい。
Bluemix CLI(bxコマンド)でBluemixにログインして、一連の手順を実行して下さい。以下の例では米国南部リージョンにログインしています。他のリージョンで組織とスペースを作成した場合は、該当リージョンのAPIエンドポイントを指定して下さい。

bx login -a api.ng.bluemix.net

Emailアドレス(Bluemixアカウント名)とパスワードを聞かれるので、適宜応答して下さい。
アカウントの選択の要求には、数字で(おそらく選択肢は1だけだと思いますが)応答して下さい。
ログインしたら次のコマンドでtargetをセットして下さい。

bx target -o 組織名 -s スペース名

ここまでの例を以下に示します。
Screen Shot 2017-09-17 at 10.33.49.png

続いてコンテナサービスの環境をセットアップします。ここでクラスター名は、Bluemixポータル画面でKubernetesクラスターを作成した際のクラスター名です。デフォルトのままならmyclusterです。

bx cs init
bx cs cluster-config クラスター名

bx cs cluster-configコマンドを実行すると、応答としてKUBECONFIG環境変数をセットするコマンドが表示されるので、これをコピペしてそのまま実行します。コマンド内のymlファイル名はKubernetesクラスターによって異なるので、過去に保存したコマンドではなく、必ずその都度bx cs cluster-configコマンドの応答で得られたコマンドを実行して下さい。

macOS/Linux
export KUBECONFIG=/Users/takey/.bluemix/plugins/container-service/clusters/mycluster/kube-config-・・・
Windows
SET KUBECONFIG=C:\Users\takey\.bluemix\plugins\container-service\clusters\mycluster\kube-config-・・・

実行後は確認のためkubectl get nodesコマンドを実行します。

kubectl get nodes

ここまでの実行例を以下に示します。
Screen Shot 2017-09-17 at 10.36.24.png

Kubernetesクラスターの作成がまだ実行中のタイミングでkubectl get nodesコマンドを実行するとエラー応答が返ります。下図のようにBluemixポータル画面で準備完了になってから再実行して下さい。
Screen Shot 2017-09-17 at 10.48.23.png

3. TensorFlow用Pod定義ファイルを作成する

kubernetesクラスタにデプロイするコンテナは、podという単位で管理されます。コンテナをpodで包んでデプロイする感じです。一つのpodに複数のコンテナを含めることもできるようですが、今回はTensorFlowひとつだけのpodを作成します。
podの定義はYAMLという書式で記述してファイルに保管します。
以下にpod定義の例を示します。

my-tensor-pod.yml
apiVersion: v1
kind: Pod
metadata:
  name: my-tensor-pod
  labels:
    app: my-tensor
spec:
  containers:
    - name: tensorflow
      image: tensorflow/tensorflow:latest
      env:
      - name: PASSWORD
        value: "passw0rd"

"image:tensorflow/tensorflow:latest"のところで、DockerHubに公開されているTensorFlowのイメージを呼び出す指定をしています。
TensorFlowを立ち上げてブラウザでアクセスするとまずログイン画面が表示されるのですが、そこで入力するパスワードをあらかじめ決めておきます。
そのための定義がenv:以下の3行です。ここではパスワードとして"passw0rd"という値を入力していますが、安全のため推測しにくいパスワードに置き換えておいて下さい。

定義はテキストファイルに保存します。ここではmy-tensor-pod.ymlというファイルに保存したとして手順を続けます。

4. TensorFlowイメージをデプロイする

先に作成したmy-tensor-pod.ymlを使って、まずpodをkubernetesクラスターにデプロイします。続いてpodをサービスとして公開します。
以下の手順を実行します。

kubectl create -f my-tensor-pod.yml

pod "my-tensor-pod" createdという応答が返れば成功です。デプロイされたpodは次のコマンドで確認できます。

kubectl get pods

次にpodをサービスとして公開します。ここではサービス名をmy-tensor-svcとしています。

kubectl expose pods my-tensor-pod --type=NodePort --port=8888 --name=my-tensor-svc

公開されたサービスを確認します。サービスに割り当てられたポート番号が表示されるのでメモしておいて下さい。

kubectl get services

ここまでの実行例を以下に示します。kubectl get podsでREADYの表示が「1/1」になっていたら、podのデプロイが完了している印ですので先に進みましょう。
Screen Shot 2017-09-17 at 10.44.27.png

先に確認したIPアドレス、ポート番号をWebブラウザに入力して(ここではhttp://184.172.229.128:31638 )、TensorFlow(Jupyter Notebookサーバ)にログインします。ログイン画面が表示されたら、あらかじめpod定義に指定しておいたパスワードを入力して下さい。
Screen Shot 2017-09-17 at 10.59.02.png

Jupyter Notebook一覧の画面が表示されたら成功です。
Screen Shot 2017-09-17 at 10.59.51.png

これらのJupyter Notebookは、BluemixのData Science Experience(DSX)にインポートして実行することもできます。手順をこちら(http://qiita.com/takeyan/items/83f061ccabeab94ad655 )で紹介していますので、参考にして下さい。

以上です。