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 件のコメント:
コメントを投稿