好きなものだけ書く。ポジティブに。

好きなことを楽しく。プログラミング、写真、音楽、ガジェットとか。

GKEことGoogle Container EngineでFlaskアプリケーションを動かしてみた。簡単すぎてこれを仕事で使えるまで頑張る。

f:id:noblejasper:20161120071346j:plain

上はこの前京都に行った時の紅葉の写真なんですが、秋はあっという間に終わっちゃいましたね。 めっきり寒くなってきましたが皆さん風邪引いていないですか?

今日はめずらしくマジメに技術敵な事を書きます!

Google Cloud Platform に東京リージョンも出来た事ですし、 Google Container Engine も出来てからそれなりにたった事ですし、いい加減イジイジしてみようかと思いまして。

どうせなら普段使っている Python の Flask を動く環境を作ってみます。

Running the Python Bookshelf on Container Engine  |  Python  |  Google Cloud Platform にならって Google Container Engine で Flask を動かしてみる。

所感

やってみた所感としては、 かなり簡単 です!!。

コマンドライン操作が多いとはいえ、簡単なコマンドばかり(指示出す系のものしか無い)。

あとは商用に耐えうるのかどうかは今後また検証していきたいと思います。

以下に手順ごとに記載していきます。

今回実行したソースコード達は GitHub - noblejasper/gke-flask: GoogleContainerEngine で Flask アプリケーション動かす に置いておきました。

gcloud コマンド最新化

curl https://sdk.cloud.google.com | bash # gcloud インストール
gcloud components update kubectl # kubectl コマンド入れる
gcloud init # gcloud の設定初期化とか

GKE に コンテナーを作る

何回も使うのでプロジェクト名を変数に入れておく

PROJ_NAME=gke-flask

1:クラスター作成

gcloud container clusters create ${PROJ_NAME} --scopes "cloud-platform" --num-nodes 2

これは終わるまで結構時間かかった

2:認証情報をもってくる

gcloud container clusters get-credentials ${PROJ_NAME}

3:クラスターへのアクセス確認

kubectl cluster-info

こんな感じの出力が出れば良さそう

Kubernetes master is running at https://xxx.xxx.xxx.xxx
GLBCDefaultBackend is running at https://xxx.xxx.xxx.xxx/api/v1/proxy/namespaces/kube-system/services/default-http-backend
Heapster is running at https://xxx.xxx.xxx.xxx/api/v1/proxy/namespaces/kube-system/services/heapster
KubeDNS is running at https://xxx.xxx.xxx.xxx/api/v1/proxy/namespaces/kube-system/services/kube-dns
kubernetes-dashboard is running at https://xxx.xxx.xxx.xxx/api/v1/proxy/namespaces/kube-system/services/kubernetes-dashboard

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

Google Cloud Storage にバケット作る

1: バケット作成

gsutil mb gs://${PROJ_NAME}

2:バケットを全体がread出来る権限に

gsutil defacl set public-read gs://${PROJ_NAME}

設定ファイルを編集する

1:config.py 開く

2:PROJECT_ID を変更する(GKEのプロジェクト名)

3:CLOUD_STORAGE_BUCKET を変更する(さっき作ったバケット名)

アプリケーションをコンテナ化する

1:Dockerfile確認

  • 自分はpython2.7にしたりしちゃいました

2:application の Dockerイメージ を作る

project名見えてるけど消しちゃうのでいっかw

docker build -t gcr.io/nobjas-test-project-161209/gke-flask .

初回はベースのイメージとかダウンロードするので重い。(進捗見えるので不安感は少ない)

3:Google Container Registry にさっきのイメージをpush

始めに作ったクラスターはここにpushするとアクセス出来るようになるらしい

gcloud docker push gcr.io/nobjas-test-project-161209/gke-flask

ポッド(pods)を展開

アプリをdeployしてみます。

1:gke-flask-frontend.yaml を必要に応じて修正

  • project名は nobjas-test-project-161209 になってます

2:yamlで設定したリソースをクラスタに展開する

kubectl create -f gke-flask-frontend.yaml

控えめな報告

deployment "gke-flask-frontend" created

3:展開されているリソースの確認

kubectl get deployments

3個動いてるっぽい

NAME                 DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
gke-flask-frontend   3         3         3            0           36s

4:展開すると、pods てのが出来るらしい

確認してみる

kubectl get pods

なんかエラー出てるっぽいけど、、、CrashLoopBackOff とか不穏なSTATUS

NAME                                  READY     STATUS             RESTARTS   AGE
gke-flask-frontend-1842409802-3x0qr   0/1       CrashLoopBackOff   1          12s
gke-flask-frontend-1842409802-9wd2j   0/1       CrashLoopBackOff   1          12s
gke-flask-frontend-1842409802-oq368   0/1       CrashLoopBackOff   1          12s

(この時はこんなミスにハマってました honcho の Procfile に書く process type は - が使えなくて1時間以上ハマったので見せしめに書いておく。 - Qiita

こんな感じになると正解です。

NAME                                  READY     STATUS    RESTARTS   AGE
gke-flask-frontend-1106178333-4plnm   1/1       Running   0          14s
gke-flask-frontend-1106178333-exxq5   1/1       Running   0          14s
gke-flask-frontend-1106178333-ui59c   1/1       Running   0          14s

ちなみに止める時は下記方法で。

kubectl delete deployments gke-flask-frontend

ロードバランサーを展開

1:gke-flask-service.yaml を確認

2:起動はさっきと一緒

kubectl create -f gke-flask-service.yaml

3:公開IPを取得する

kubectl describe service gke-flask

こんな感じの出力

Name:                   gke-flask-frontend
Namespace:              default
Labels:                 app=gke-flask
                        tier=frontend
Selector:               app=gke-flask,tier=frontend
Type:                   LoadBalancer
IP:                     xxx.xxx.xxx.xxx
LoadBalancer Ingress:   xxx.xxx.xxx.xxx
Port:                   <unset> 80/TCP
NodePort:               <unset> 30924/TCP
Endpoints:              xxx.xxx.xxx.xxx:8080,xxx.xxx.xxx.xxx:8080,xxx.xxx.xxx.xxx:8080
Session Affinity:       None
Events:
  FirstSeen     LastSeen        Count   From                    SubobjectPath   TypeReason                  Message
  ---------     --------        -----   ----                    -------------   --------    ------                  -------
  59s           59s             1       {service-controller }                   Normal              CreatingLoadBalancer    Creating load balancer
  5s            5s              1       {service-controller }                   Normal              CreatedLoadBalancer     Created load balancer

アクセスしてみる

IP: の横にあるアドレスにブラウザからアクセスするとページが表示されました!

参考URL

やりたい事

  • MongoDB, SQL, memcached をつなぐ
  • 他の役割のサーバ作る
  • 負荷検証

そういえば、Google Container Engine て GKEって略すらしいですよ。 まだまだ奥は深いので試していきますー