2018/12/31

BookshelfサンプルでもっとGKEを使ってみますʕ◔ϖ◔ʔ

GCPの公式チュートリアルネ申すぎぃ


前回の記事を書いた後に「Google Cloud Platform での Go」を見つけました。Go言語でGCPを使いたい私のようなGopherにとって欲しい情報がぎゅっと詰まった感のある素敵ページです。

今回はこのGo言語クイックスタートの中でGKE用に用意されている「Kubernetes Engine での Go Bookshelf の実行」を実践していきたいと思いますʕ◔ϖ◔ʔ



まずは準備します


チュートリアルの以下の記載がわかりやすかったのでメモします。
通常、GCP プロジェクトのリソースの管理には gcloud を使用し、Kubernetes Engine クラスタ内のリソースの管理には kubectl を使用します。
https://cloud.google.com/go/docs/tutorials/bookshelf-on-kubernetes-engine?hl=ja#creating_a_kubernetes_engine_cluster

プロジェクトを作って設定しておきます。プロジェクトIDはmybookshelf-226812です。
gcloud config set project mybookshelf-226812

クラスタを作る

ゾーンにasia-northeast1-aを使ってクラスタを作ります。
gcloud container clusters create bookshelf \
--scopes "cloud-platform" \
--num-nodes 2 \
--enable-basic-auth \
--issue-client-certificate \
--enable-ip-alias \
--zone asia-northeast1-a

確認してみると、指定どおり2つできていることがわかります。
ʕ◔ϖ◔ʔ >  kubectl get nodes
NAME                                       STATUS    ROLES     AGE       VERSION
gke-bookshelf-default-pool-252b80f5-j28c   Ready     <none>    6m        v1.10.9-gke.5
gke-bookshelf-default-pool-252b80f5-v98d   Ready     <none>    6m        v1.10.9-gke.5

Cloud Datastoreを作る

書籍情報を格納するために使用するNoSQLデータベースとしてCloud Datastoreを使います。

ブラウザ上のGCPコンソールで対象プロジェクトの「Datastore」ページを開くと、以下のような画面が表示されるので「Cloud Datastore」を選択します。

ロケーションを質問されるので東京asia-northeast1を選択して進みます。

以下のような画面が出たら作成完了です。

Cloud Storageを作る

注記によると
バケットにはプロジェクト ID と同じ名前を付けることをおすすめします。
https://cloud.google.com/go/docs/tutorials/bookshelf-on-kubernetes-engine?hl=ja#creating_a_cloud_storage_bucket
とのことなので、プロジェクトIDのmybookshelf-226812を指定してバケットを作ります。
gsutil mb gs://mybookshelf-226812

自分でアップした画像を見られるようにアクセス権限の設定をします。
gsutil defacl set public-read gs://mybookshelf-226812

サンプルコードの書き換え

GCP用のGo言語サンプルはGitHubの「GoogleCloudPlatform/golang-samples」リポジトリにあります。

リビジョン 74ac2f3ではgoogle.golang.org/appengine/internal.mustGetMetadataがアクセスするhttp://metadata/computeMetadata/v1/instance/attributes/gae_projectが存在せずHTTP Status 404となるため、panicが発生してフロントエンドが動作しません。修正案を作ってプルリクをだしてみました
※2019/01/10追記: 無事マージしてもらえました!ʕ◔ϖ◔ʔ

このリポジトリをクローンして「getting-started」ディレクトリの「bookshelf」をお好みのエディタで開きます。config.goでの変更箇所は以下の3箇所です。

まずはDatastore。プロジェクトIDはmybookshelf-226812を使います。

Storageも。バケット名もmybookshelf-226812にしたので以下のように変更します。

最後にPub/Subも。

ビルドとデプロイ

GKE用のDockerfileをコピーしてビルドします。
cp gke_deployment/Dockerfile .
docker build -t gcr.io/mybookshelf-226812/bookshelf .

先に認証情報の設定をしておきましょう。詳しくは「認証方法 | Container Registry | Google Cloud」を参照。
gcloud auth configure-docker

GCPのContainer Registerにプッシュ。
gcloud docker -- push gcr.io/mybookshelf-226812/bookshelf

ブラウザで確認するとこんな感じ。

フロントエンドをデプロイします


bookshelfのappディレクトリ内にあるGo言語実装のWebサービスがフロントエンドです。ルーティングには「github.com/gorilla」を使っており、レンダリングのためのテンプレートエンジンはGo言語標準のパッケージを使うスタイルですね。

gke_deployment/bookshelf-frontend.yamlにプロジェクトIDを書き込みます。

バシッとワークロードを作りましょう。
kubectl create -f bookshelf-frontend.yaml

できました。相変わらず簡単でいいですね(*´ω`*)

次はバックエンド


bookshelfのpubsub_workerディレクトリ内になるGo言語実装のサーバーサービスがバックエンドです。

gke_deployment/bookshelf-worker.yamlにプロジェクトIDを書き込みます。

こちらもサクッとワークロードを作ります。
kubectl create -f bookshelf-worker.yaml

最後にロードバランサー


ロードバランサーはGKEのサービス機能で実現するんですね。
Bookshelf サービスにより、単一の IP アドレスから Bookshelf フロントエンド ポッドにアクセスできます。
https://cloud.google.com/go/docs/tutorials/bookshelf-on-kubernetes-engine#creating_the_bookshelf_service

では作りましょう。
kubectl create -f bookshelf-service.yaml

外部公開されたIPアドレスを確認しましょう。
kubectl describe service bookshelf

以下のように実行結果が表示されるので、LoadBalancer Ingressで公開されたアクセスポイントを確認してブラウザで開きましょう。便宜上、該当箇所を書き換えています。
ʕ◔ϖ◔ʔ >  kubectl describe service bookshelf
Name:                     bookshelf-frontend
Namespace:                default
Labels:                   app=bookshelf
                          tier=frontend
Annotations:              
Selector:                 app=bookshelf,tier=frontend
Type:                     LoadBalancer
IP:                       10.0.5.233
LoadBalancer Ingress:     {External IP Address}
Port:                       80/TCP
TargetPort:               http-server/TCP
NodePort:                   32541/TCP
Endpoints:                10.8.0.9:8080,10.8.1.14:8080,10.8.1.15:8080
Session Affinity:         None
External Traffic Policy:  Cluster
Events:
  Type    Reason                Age   From                Message
  ----    ------                ----  ----                -------
  Normal  EnsuringLoadBalancer  3m    service-controller  Ensuring load balancer
  Normal  EnsuredLoadBalancer   2m    service-controller  Ensured load balancer

ブラウザ上で実際に使ってみたのが以下の動画ですʕ◔ϖ◔ʔ


まとめ


作ったDockerイメージを元にレプリケーションを行いながら簡単にバックエンド、フロントエンド、ロードバランサーを実現できました。次回はもう少し違った方向性でGCPに習熟してゆきたいと思います。

最近集中的にGCPを使っているのですが、本当に楽しいです(*´ω`*)

0 件のコメント: