Google Container Engine(以下GKE)の中で動くGoアプリケーションを、Stackdriver Debuggerでデバッグする方法をまとめました。GKEクラスタの新規作成からデバッグまで記載します。
次のGoogle Compute Engine(以下GCE)向けのドキュメントを元にしています。
- Setting Up Stackdriver Debugger for Go applications on Google Compute Engine
英語版と日本語版とで内容が少し違います。(2016/11/17現在)
GKEクラスタの新規作成
gcloudコマンドのプロジェクト設定。以下、PROJECT_IDは適当に読み替えて下さい。
$ gcloud config set projects PROJECT_ID
GKEクラスタを作成する。
$ gcloud container clusters create debugger-sample \
--num-nodes 1 \
--machine-type g1-small \
--scopes compute-rw,storage-rw,https://www.googleapis.com/auth/cloud-platform \
--zone asia-east1-a
GCE向け日本語ドキュメントには次のような記載があり、--scopesを指定してCloud Platform OAuth スコープを有効にする必要があるようです。
gcloud compute instances create コマンドを使用して、コマンドラインからインスタンスを作成することもできます。かならず --scopes パラメータを --scopes compute-rw,storage-rw,https://www.googleapis.com/auth/cloud-platform に設定してください。これにより、Cloud Platform バックエンドへのアクセスに必要な Cloud Platform OAuth スコープとその他のスコープが有効化されます。
GCE向け英語ドキュメントにはこの記載はないのですが、指定しないと認証エラーが発生します。
Debuglet controller server error: googleapi: Error 403: Request had insufficient authentication scopes., forbidden
クラスタを指定しておきます。
$ gcloud config set container/cluster debugger-sample
$ gcloud container clusters get-credentials debugger-sample
Goサンプルアプリケーションのビルド
ここでは、ソースコードはGithubにあがっていることを前提にしていますが、Cloud Source Repository 、またはそこに接続されている GitHub または Bitbucket のリポジトリであれば問題ありません。
Goサンプルをforkします。 https://github.com/GoogleCloudPlatform/golang-samples
Goサンプルをcloneします。
$ git clone https://github.com/nshmura/golang-samples
source contextファイルなるものを生成します。source contextファイルについてはこちらに説明があります。
$ cd golang-samples
$ gcloud beta debug source gen-repo-info-file
$ mv source-context.json ../
$ mv source-contexts.json ../
$ cd ../
helloworld.go
をビルドします。
$ GOOS=linux GOARCH=amd64 go build golang-samples/docs/managed_vms/helloworld/helloworld.go
GKEへデプロイ
GKEにプッシュするDockerイメージを作成します。次がDockerfile。 「# for Stackdriver Debugger」とコメントを入れている箇所でStackdriver Debugger エージェントを有効化しています。
Dockerfile
FROM ubuntu:15.10
RUN apt-get update
RUN apt-get install -y ca-certificates
COPY helloworld /usr/local/bin/
# for Stackdriver Debugger
RUN apt-get install -y wget
RUN wget -O go-cloud-debug https://storage.googleapis.com/cloud-debugger/compute-go/go-cloud-debug
RUN chmod 0755 go-cloud-debug
RUN mv ./go-cloud-debug /usr/local/bin/go-cloud-debug
COPY source-context.json /
COPY source-contexts.json /
CMD go-cloud-debug -sourcecontext=/source-context.json -appmodule=main -appversion=lastest -- /usr/local/bin/helloworld
EXPOSE 8080
Dockerイメージを作成。
$ docker build -t asia.gcr.io/PROJECT_ID/debugger-sample:latest .
Container Registryへプッシュします。
$ gcloud docker -- push asia.gcr.io/PROJECT_ID/debugger-sample:latest
ReplicationController
とService(LoadBalancer)
を作成してhelloworld
をGKE上で動かします。
$ kubectl create -f gke-controller.yaml
$ kubectl create -f gke-serivce.yaml
gke-controller.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: debugger-sample
spec:
replicas: 1
selector:
app: debugger-sample
template:
metadata:
labels:
app: debugger-sample
spec:
containers:
- name: debugger-sample
image: asia.gcr.io/PROJECT_ID/debugger-sample:latest
ports:
- containerPort: 8080
gke-serivce.yaml
apiVersion: v1
kind: Service
metadata:
name: debugger-sample
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 8080
selector:
app: debugger-sample
ServiceのIPを確認します。
$ kubectl get services
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
debugger-sample ----------- [ServiceのIP] 80/TCP 52s
kubernetes ----------- <none> 443/TCP 7m
デプロイしたアプリケーションがブラウザから閲覧できるか確認します。 http://[ServiceのIP]/
Cloud Source Repositoryに接続
GithubのソースコードをCloud Source Repositoryに接続します。 GCPコンソールの「メニュー > 開発」を選択し、ソースツールの開始をクリック。
「GitHub または Bitbucket からの自動ミラーリング」を選択し、手順に従ってフォークしたgolang-samplesリポジトリを接続。接続できれば次のようにソースコードが表示されます。
デバッグ
GCPコンソールの「メニュー > Stackdriver デバッグ」を選択し、デプロイした docs/managed_vms/helloworld/helloworld.go
を選択。行番号をクリックしてスナップショットを取る箇所を指定できます。
このページを開いたまま、別窓で http://[ServiceのIP]/ を閲覧すると、指定した行数に実行が移った時点での、変数とコールスタックのスナップショットが作成されます。 無事スナップショットをとることが出来ました。
また、次のように記載があり、実行がストップするわけではないようです。
アプリケーションの停止や速度低下を引き起こすことなく、デバッグします。 スナップショットを作成しても、実行中のアプリケーションは停止しません。
不要ならサンプルアプリを削除します。
$ gcloud container clusters delete debugger-sample