お世話になっております。
しゃまとんです。
KubernetesでGoを使いたいのですが、そのままコードを配置みたいな感じではなく、Dockerの様にコンテナイメージを作成してPodとして配置するような形式をとります。
(勿論、やり方はコレ以外にもありそう?)
GCPにはDockerhubのようなコンテナのホスティングサービス(Container Registry)があり、yamlからアップロード済みイメージを利用することができるようになっています。
イメージを作成して、それを配置するだけとなると運用も楽ですしデプロイもRollingUpdateをいい感じにしてくれるみたいなので、それを前提にして考えたいと思います。
まずは簡単にテスト用のコードを用意します。
アドレスで簡単な返答をするサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package main import ( "fmt" "net/http" ) type String string func (s String) ServeHTTP(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, s) } func main() { http.Handle("/", String("ok")) http.Handle("/sample", String("sample")) http.ListenAndServe("localhost:9999", nil) } |
次にこれをコンテナイメージにしていきます。
Dockerfileを下記のような感じで作成しておきます。
これをビルドしてイメージが作成されたら、Container Registryにアップロードしましょう。(your-project-idは置き換えてください)
1 2 3 4 5 6 7 8 9 10 11 |
FROM golang:1.9.2-alpine MAINTAINER shamaton # copy source COPY main.go main.go # port EXPOSE 9999 CMD ["go", "run", "main.go"] |
1 2 3 4 5 6 7 8 |
# イメージ作成 docker build -t sample-web-app:ver1.0.0 . # タグつけ docker tag sample-web-app:ver1.0.0 asia.gcr.io/your-project-id/sample-web-app:ver1.0.0 # container registryにpush gcloud docker -- push asia.gcr.io/your-project-id/sample-web-app:ver1.0.0 |
イメージが存在しているかコンソールから確認してみましょう。
以下のようにsample-web-appが追加されていますね。
試しにローカルにpullして確認してみます。一応手元のビルドしたものを削除してしまいます。
1 2 3 4 5 6 7 8 9 |
# 手元のイメージを削除 docker rmi sample-web-app:ver1.0.0 docker rmi gcr.io/your-project-id/sample-web-app:ver1.0.0 # container registryから取得 gcloud docker -- pull gcr.io/your-project-id/sample-web-app:ver1.0.0 # コンテナ起動 docker run --name sample-app --rm -p 9999:9999 -t gcr.io/your-project-id/sample-web-app:ver1.0.0 |
アクセスすると…
同じように使えますね!Kubernetesからも同じように動作して使えますが、Dockerと一緒で使い捨てされることを考慮しておかないといけないので、運用の際には用途を決めておく必要がありそうです。
以上です。
■ 参考
【GCP入門編・第8回】 Container Registry での Docker イメージの使用方法!