Go言語で作ったプログラムをKubernetes のコンテナにおいて実行する(デバッグ用)

概要

Kubernetes(またはDocker)のコンテナ内でGoのプログラムをデバッグする時に使う方法の自分用のメモ

活用ケース

Kubernetesにデプロイしたけど、Goのプログラムが予想通り動いていない! というときに、またDocker ImageのbuildしてからKubernetes deployという手順を踏むのは時間がかかっていやだった。

直接Kubernetesのコンテナに入って、プログラムを修正させつつ動作確認できたら楽。

方法1.コンテナにGoの実行環境がある場合

Docker のbase Imageがgolangだったりgolang-alpineだったら直接~.goプログラムを実行できる

例えば、開発環境で作ったmain.goをコンテナに持って行って実行したいのであれば以下でいい (alpineを想定しているので/bin/ashを指定している。通常のLinuxなら/bin/bashとか)

$kubectl cp main.go <pod名>:/

$kubectl exec -it <pod名>  /bin/ash

/go# go run main.go

方法2.コンテナにGoの実行環境がない場合

コンテナにGo言語の環境がないとき、コンテナ内でGo言語の開発環境を整えるのは面倒なので、Linuxで作ったバイナリをコンテナに送って実行してみるとデバッグが楽だった

$GOOS=linux GOARCH=amd64 go build -o hoge

$kubectl cp ./hoge <pod名>:/

$kubectl exec -it <pod名>  /bin/ash

/go# ./hoge

おまけ

自分はいちいちpod名を調べるのが面倒なので、以下のように指定している。 こうすればPod名が変わっても、Ctrl+Rの履歴からいつも同じコマンドを実行するだけでできるので楽

$kubectl cp main.go `kubectl get pods | awk '{print $1}' | tail -1`:/
$kubectl exec -it `kubectl get pods | awk '{print $1}'`  /bin/ash

また、Pod内にコンテナが複数存在する場合は以下のようにコンテナ名を指定する必要がある

$kubectl cp ./sample/sample.go `kubectl get pods | awk '{print $1}' | tail -1`:/  --container <container名> 

おわり