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 と同じ名前を付けることをおすすめします。とのことなので、プロジェクトIDの
https://cloud.google.com/go/docs/tutorials/bookshelf-on-kubernetes-engine?hl=ja#creating_a_cloud_storage_bucket
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 件のコメント:
コメントを投稿