Skip to content
On this page

📆 2016-11-22

Stackdriver Debugger for Golang on GKE

Google Container Engine(以下GKE)の中で動くGoアプリケーションを、Stackdriver Debuggerでデバッグする方法をまとめました。GKEクラスタの新規作成からデバッグまで記載します。

次のGoogle Compute Engine(以下GCE)向けのドキュメントを元にしています。

GKEクラスタの新規作成

gcloudコマンドのプロジェクト設定。以下、PROJECT_IDは適当に読み替えて下さい。

shell
$ gcloud config set projects PROJECT_ID

GKEクラスタを作成する。

shell
$ 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

クラスタを指定しておきます。

shell
$ 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します。

shell
$ git clone https://github.com/nshmura/golang-samples

source contextファイルなるものを生成します。source contextファイルについてはこちらに説明があります。

shell
$ 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

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イメージを作成。

shell
$ docker build -t asia.gcr.io/PROJECT_ID/debugger-sample:latest .

Container Registryへプッシュします。

shell
$ gcloud docker -- push asia.gcr.io/PROJECT_ID/debugger-sample:latest

ReplicationControllerService(LoadBalancer)を作成してhelloworldをGKE上で動かします。

shell
$ kubectl create -f gke-controller.yaml
$ kubectl create -f gke-serivce.yaml

gke-controller.yaml

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

yaml
apiVersion: v1
kind: Service
metadata:
  name: debugger-sample
spec:
  type: LoadBalancer
  ports: 
    - port: 80
      targetPort: 8080
  selector:
    app: debugger-sample

ServiceのIPを確認します。

shell
$ 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]/

スクリーンショット 2016-11-22 20.54.09.png

Cloud Source Repositoryに接続

GithubのソースコードをCloud Source Repositoryに接続します。 GCPコンソールの「メニュー > 開発」を選択し、ソースツールの開始をクリック。 スクリーンショット 2016-11-22 20.57.55.png

「GitHub または Bitbucket からの自動ミラーリング」を選択し、手順に従ってフォークしたgolang-samplesリポジトリを接続。接続できれば次のようにソースコードが表示されます。

スクリーンショット 2016-11-22 21.00.46.png

デバッグ

GCPコンソールの「メニュー > Stackdriver デバッグ」を選択し、デプロイした docs/managed_vms/helloworld/helloworld.go を選択。行番号をクリックしてスナップショットを取る箇所を指定できます。

スクリーンショット 2016-11-22 21.02.51.png

このページを開いたまま、別窓で http://[ServiceのIP]/ を閲覧すると、指定した行数に実行が移った時点での、変数とコールスタックのスナップショットが作成されます。 無事スナップショットをとることが出来ました。 スクリーンショット 2016-11-22 21.09.48.png

また、次のように記載があり、実行がストップするわけではないようです。

アプリケーションの停止や速度低下を引き起こすことなく、デバッグします。 スナップショットを作成しても、実行中のアプリケーションは停止しません。

不要ならサンプルアプリを削除します。

shell
$ gcloud container clusters delete debugger-sample

Released under the MIT License.