grasys blog

goのkubernetesモジュールをGKEバージョンに合わせて更新

文● yosshi/grasys 編集● ASCII

  • この記事をはてなブックマークに追加
  • 本文印刷

本記事はgrasys が提供する「grasys blog」に掲載されたgo の kubernetes モジュールを GKE バージョンに合わせて更新」を再編集したものです。

ゲーム専用サーバで使っていたAgones、Open Matchをバージョンアップしたので、GKEもバージョンアップしたらエラー発生! なんとかしましょー

 はじめまして、エンジニアのよっしーです。ゲーム専用サーバで開発していたアプリの最新環境対応のためにGKE、Agones、Open Matchを最新版に更新したところ、kubernetes client-goモジュールで関数argumentの不整合エラーが発生!

 GKE、Agones、Open Matchのバージョンアップ時に遭遇しがちなgoモジュールバージョン不整合の解決方法についてお話しします。

1. GKE、Agones、Open Matchを最新バージョンにしてみる(2021/06/16現在)

 それぞれの最新バージョンが

・GKE : “1.19.9-gke1900” - Regularチャンネルのデフォルトバージョン
・Agones : “release-1.15.0”
・Open Macth : “release-1.2”

 と確認できたので、それぞれバージョンアップを実行し、Agones、Open MatchをGKEクラスタにデプロイ。すると、 Open Matchを使用するアプリ起動時にclient-goモジュールのwatch.NewStreamWatcher関数呼び出しでargumentの不整合エラーが発生!


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

2. GKE、Agones、Open Matchそれぞれのgoの設定について調べてみる。

 まずはgoバージョン

・GKE


$ kubectl version | grep Server | awk -F ',' '{print $3 $7}'
GitVersion:"v1.19.9-gke.1900" GoVersion:"go1.15.8b5"

・Agones


$ cat agones/go.mod | grep "^go "
go 1.14

・Open Match


$ cat open-match/go.mod | grep "^go "
go 1.14

 GKEはgo1.15であり、Agones、Open Matchはgo1.14を指定していた。

 しかし、goの公式サイト(golang.org)では、go version 1のマイナーバージョン間では ソースレベルの互換性を約束しているため、1.14と1.15間では、ほとんど全てのGoプログラムを 再コンパイルすれば、goアプリを実行できると考えられる。

 また、go 公式サイトにはこうも書かれている。

“The APIs may grow, acquiring new packages and features, but not in a way that breaks existing Go 1 code.”
(既存のgo 1コードを破壊するほどではないが、APIは新しいパッケージや機能を取得することがある。)

 ということで、kubernetes APIに関するモジュール指定を確認すると、

・Agones


$ cat agones/go.mod | grep "k8s.io"
k8s.io/api v0.18.15
k8s.io/apiextensions-apiserver v0.18.15
k8s.io/apimachinery v0.18.15
k8s.io/client-go v0.18.15
k8s.io/kube-openapi v0.0.0-20200410163147-594e756bea31 // indirect
k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89

・Open Match


$ cat open-match/go.mod | grep "k8s.io"
k8s.io/api v0.0.0-20191004102349-159aefb8556b // kubernetes-1.14.10
k8s.io/apimachinery v0.0.0-20191004074956-c5d2f014d689 // kubernetes-1.14.10
k8s.io/client-go v11.0.1-0.20191029005444-8e4128053008+incompatible // kubernetes-1.14.10
k8s.io/klog v1.0.0 // indirect
k8s.io/utils v0.0.0-20200729134348-d5654de09c73 // indirect

 特にOpen Matchではkubernetes-1.14.10をサポートするモジュールを指定している。ということで、エラーの出ている client-goとapi関連のモジュールをkubernets-1.19.9対応バージョンに更新しよう。

3. モジュールの更新

 モジュールの更新には“go get”コマンドを使用する。

 kubernetes-1.19.9対応のモジュールを指定するには、モジュール名の後に"@kubernetes-1.19.9"を付与する。

実行例


$ go get k8s.io/client-go@kubernetes-1.19.9
go: k8s.io/client-go kubernetes-1.19.9 => v0.19.9

$ go get k8s.io/apimachinery@kubernetes-1.19.9
go: k8s.io/apimachinery kubernetes-1.19.9 => v0.19.10-rc.0

$ go get k8s.io/api@kubernetes-1.19.9
go: k8s.io/api kubernetes-1.19.9 => v0.19.9
go build k8s.io/api: no non-test Go files in /usr/local/gopath/1.15.1/pkg/mod/k8s.io/api@v0.19.9

$ go get k8s.io/apiextensions-apiserver@kubernetes-1.19.9
go: k8s.io/apiextensions-apiserver kubernetes-1.19.9 => v0.19.9

 “go.mod”ファイルの存在するディレクトリで実行すると、go.mod内の該当モジュールのバージョンも自動的に書き換えてくれる。

・Agones


$ cat agones/go.mod | grep "k8s.io"
k8s.io/api v0.19.9
k8s.io/apiextensions-apiserver v0.19.9
k8s.io/apimachinery v0.19.10-rc.0
k8s.io/client-go v0.19.9
k8s.io/klog v1.0.0 // indirect
k8s.io/utils v0.0.0-20200729134348-d5654de09c73

・Open Match


$ cat open-match/go.mod | grep "k8s.io"
k8s.io/api v0.19.9
k8s.io/apimachinery v0.19.10-rc.0
k8s.io/client-go v0.19.9
k8s.io/klog v1.0.0 // indirect
k8s.io/utils v0.0.0-20200729134348-d5654de09c73 // indirect

Agones、Open Match以外にも該当goモジュールを使用しているアプリがあれば、モジュールの更新を勧める。

 goモジュールのバージョン指定は“@kubernetes-1.19.9”以外にも指定方法があるので、下記サイトを参照のこと。

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

 モジュール更新後のAgones、Open MatchをGKEクラスタに再デプロイし、アプリを起動するとエラーは解消した。

終わりに

 kubernetes環境では各ツールのバージョン間の互換性が問題になることが多いと思われますが、問題解決の救済処置がしっかりしているツールもあります。多くのエンジニアがハマりそうな有用な情報は、是非共有を進めて行きましょう!

■関連サイト

過去記事アーカイブ

2021年
03月
04月
05月
06月
07月
08月
09月
10月
2020年
04月
05月
08月
09月
10月
11月
12月
2018年
09月
2017年
06月
2014年
07月