Agonesを使った実装でgo buildできなかったので、go modulesでk8s関連のバージョンを揃えたらなおった話

Agonesを使ってGoからゲーム用サーバーの割当をしてみようと思って、GoでAgones Client APIを使ったものを組んでみた それで早速 go run してみたら、次のようなビルドエラーが出てしまった。

# k8s.io/client-go/rest
../../go/pkg/mod/k8s.io/client-go@v11.0.0+incompatible/rest/request.go:598:31: not enough arguments in call to watch.NewStreamWatcher
    have (*versioned.Decoder)
    want (watch.Decoder, watch.Reporter)

どうやらk8s client libraryのコードの定義が合わないみたい。

k8s.io/client-go だけを色々バージョン変えてみたけど、それだけだと別のエラーになってしまった

build command-line-arguments: cannot load k8s.io/api/admissionregistration/v1alpha1: module k8s.io/api@latest found (v0.17.0), but does not contain package k8s.io/api/admissionregistration/v1alpha1

解決策:ライブラリのバージョンを揃える

使っているAgonesは v1.1.0 なので、ドキュメントによるとKubernetesバージョンは v1.12

Usage Requirements Kubernetes cluster version 1.12

ということで、k8s関連のGoライブラリ( client-goapimachinery )のバージョンをKubernetes v1.12系に揃えた。

$ go get k8s.io/client-go@kubernetes-1.12.9
$ go get k8s.io/apimachinery@kubernetes-1.12.9

これでビルドエラーは消えて動いた!!🎉

Kubernetesライブラリは大規模なので、一瞬「やばい。Go Modulesはよくトラブル起きるし、これは厄介な問題な気がする・・」と焦ったのだけど、 client-goのドキュメントにしっかり書いてあったのでよかった。

client-go/INSTALL.md at master · kubernetes/client-go · GitHub