たそらぼ

日頃思ったこととかメモとか。

初めてのGKE~jupyter notebookサーバーを立てる~

GKEのクイックスタートをやってみた記録と、派生してjupyter notebookのイメージを立てた記録。

これからはkubernetesの時代だ!と思ってはや数か月...。ぜんぜん自分で手を動かす気配がないので、一念発起して立ててみた。

GKEのクイックスタート

今回はGCPのGKEを使ってやってみる。
クイックスタートを参考にした。
cloud.google.com

クイックスタートはアクセスするとHello Worldと表示するイメージをk8sクラスタに立てるもの。
これはいろんなところでよく取りあげられているやつ。

helloサーバーの作成

これは先のクイックスタートと同じだが、オプションを立てないと失敗してしまう箇所があったため、記録しておく。
helloサーバーはアクセスするとあいさつをしてくれるアプリケーション。

▼こんなかんじ
f:id:tasotasoso:20190708234432p:plain

前準備

まずGCPにログインする。
プロジェクトを作成し、Kubernetes Engine APIを有効にしておく。
ここまで出来たら(別にできてなくてもいいが、)cloud shellを起動する。

デフォルトのプロジェクトを指定する。

#[PROJECT_ID]は先ほど作成したプロジェクトのID
gcloud config set project [PROJECT_ID]

続いて、リージョンを指定する。

#特にこだわりもないので東京リージョンで。
gcloud config set compute/zone asia-northeast1

クラスターのデプロイ

# [CLUSTER_NAME]は適当なクラスター名。hello-clusterとかでよい。
#--num-nodesはクラスター数。--zoneはAZ。
#この二つを付けないとなんか怒られた。
gcloud container clusters create [CLUSTER_NAME] --num-nodes=3 --zone=asia-northeast1-a

デプロイ出来たら、クラスターの認証情報を取得する。
kubectlがマスターノードと通信するためには認証情報が必要なため、これを取得する。

gcloud container clusters get-credentials hello-cluster --zone=asia-northeast1-a

アプリケーションのデプロイ

gcpに登録されているので、クイックスタート通りにデプロイしてみる。

kubectl run hello-server --image gcr.io/google-samples/hello-app:1.0 --port 8080

デプロイ出来たら公開する。

kubectl expose deployment hello-server --type "LoadBalancer"

なお、LoadBalancerは別途料金がかかる。

アクセスしてみる。

kubectl getで外部IPを調べる。これはEXTERNAL IP 列に表示される。

kubectl get service hello-server

後はブラウザを立ちあげて、httpでアクセスする。


jupyter notebookサーバーの作成

続いて、違うDocker Imageをデプロイしてみる。
今回は以前から興味があったjupyter-notebookのImageを使う。

hub.docker.com

jupyter-notebookは言わずと知れたデータ解析の必須アイテム。
学生時代に流行っていて、自分の身の回りだとanacondaをインストールし、各自が環境を持っている感じだったが、
誰しもがanacondaをガンガン入れてガンガン回せる高スペックのPCを持っていなかったのと、人によって環境が異なるのが気になっていた。
共用のクラスタ上にデプロイして、使いたいときにアクセスできると嬉しい。

クラスターのデプロイ

先ほどと同様にkubernetesクラスターを作成する。
今回は jupyter-clusterという名前にする。

gcloud container clusters create jupyter-cluster --num-nodes=3 --zone=asia-northeast1-a

デプロイ出来たら、クラスターの認証情報を取得する。

gcloud container clusters get-credentials hello-cluster --zone=asia-northeast1-a

アプリケーションのデプロイ

今回はjupyter-notebookのイメージをデプロイする。
jupyterサーバーなのでデフォルトの8888ポートを指定する。

#portは8888でないとアクセスできない。
kubectl run jupyter-server --image jupyter/datascience-notebook --port 8888

#デプロイする。
kubectl expose deployment  jupyter-server --type "LoadBalancer"

アクセスしてみる

kubectl getコマンドで外部IPを取得し、8888番ポートにアクセスする。

▼こんなかんじ
f:id:tasotasoso:20190712202144p:plain
ばっちりデプロイできた!

感想

kubernetetes自体はとても簡単に扱うことができた。kubernetesを使ってマイクロサービスを構築するときに、どうすれば複数機能を共存させられるかに興味があるので、引き続き勉強していきたい。