gashirar's blog

ウイスキーがすき/美味しいものがすき/k8sがすき

Minikubeに自分のコードがMergeされReleaseされるまでの流れ

はじめに

Minikubeのlogviewer addonの不具合をみつけたので、それを修正し6月頭くらいにPull Requestを送りました。
それが取り込まれてリリースされたようなので流れをまとめておきます。

不具合について

どんな不具合だったかというと、

  • Minikubeに同梱されたlogviewer addonが動かない

といった不具合でした。
試しにaddonを有効化する際にログを出してみます。

gashirar:~/minikube$ minikube addons enable logviewer --alsologtostderr
I0605 00:33:35.753131   69149 addons.go:50] Setting logviewer=true in profile "minikube"
I0605 00:33:35.753227   69149 addons.go:92] Writing out "minikube" config to set logviewer=true...
🌟  The 'logviewer' addon is enabled

動いていそうなのですが、metrics-serverのaddonでは下記のような出力がされているので、もろもろ処理が抜けてそうな感じです。

gashirar:~/minikube$ minikube addons enable metrics-server --alsologtostderr
I0605 00:33:51.684479   69212 addons.go:50] Setting metrics-server=true in profile "minikube"
I0605 00:33:51.684507   69212 addons.go:126] Setting addon metrics-server=true in "minikube"
I0605 00:33:51.684519   69212 host.go:65] Checking if "minikube" exists ...
I0605 00:33:51.684942   69212 cli_runner.go:108] Run: docker container inspect minikube --format={{.State.Status}}
I0605 00:33:51.728813   69212 addons.go:233] installing /etc/kubernetes/addons/metrics-apiservice.yaml
I0605 00:33:51.728862   69212 ssh_runner.go:215] scp deploy/addons/metrics-server/metrics-apiservice.yaml.tmpl --> /etc/kubernetes/addons/metrics-apiservice.yaml (401 bytes)
I0605 00:33:51.728996   69212 cli_runner.go:108] Run: docker container inspect -f "'{{(index (index .NetworkSettings.Ports "22/tcp") 0).HostPort}}'" minikube
I0605 00:33:51.764021   69212 sshutil.go:44] new ssh client: &{IP:127.0.0.1 Port:32775 SSHKeyPath:/home/gashirar/.minikube/machines/minikube/id_rsa Username:docker}
I0605 00:33:51.865560   69212 addons.go:233] installing /etc/kubernetes/addons/metrics-server-deployment.yaml
I0605 00:33:51.865596   69212 ssh_runner.go:215] scp memory --> /etc/kubernetes/addons/metrics-server-deployment.yaml (699 bytes)
I0605 00:33:51.880245   69212 addons.go:233] installing /etc/kubernetes/addons/metrics-server-service.yaml
I0605 00:33:51.880287   69212 ssh_runner.go:215] scp deploy/addons/metrics-server/metrics-server-service.yaml.tmpl --> /etc/kubernetes/addons/metrics-server-service.yaml (401 bytes)
I0605 00:33:51.895699   69212 ssh_runner.go:148] Run: sudo KUBECONFIG=/var/lib/minikube/kubeconfig /var/lib/minikube/binaries/v1.18.3/kubectl apply -f /etc/kubernetes/addons/metrics-apiservice.yaml -f /etc/kubernetes/addons/metrics-server-deployment.yaml -f /etc/kubernetes/addons/metrics-server-service.yaml
I0605 00:33:52.042574   69212 addons.go:92] Writing out "minikube" config to set metrics-server=true...
🌟  The 'metrics-server' addon is enabled

不具合の原因を追う

Addons | minikube

MinikubeのAddon開発は主に3つのステップがあります。

  1. YAMLリポジトリの特定のディレクトリに配置する
  2. pkg/minikube/assets/addons.goを修正する
  3. pkg/addons/config.goを修正する

下記でMinikube Addonを作ってたので流れはなんとなくわかってました。(遊んでおいてよかった) MinikubeのAddonを作る - gashirar's blog

1. YAML

deploy/addons/logviewerを覗く。

gashirar:~/minikube$ ls deploy/addons/logviewer
logviewer-dp-and-svc.yaml.tmpl  logviewer-rbac.yaml.tmpl

これと言って問題はなさそうです。

2. pkg/minikube/assets/addons.go

次はYAMLファイルの関連付けを行っているソースを見てみます。
下記がlogviewerの部分。

   "logviewer": NewAddon([]*BinAsset{
        MustBinAsset(
            "deploy/addons/logviewer/logviewer-dp-and-svc.yaml.tmpl",
            vmpath.GuestAddonsDir,
            "logviewer-dp-and-svc.yaml",
            "0640",
            false),
        MustBinAsset(
            "deploy/addons/logviewer/logviewer-rbac.yaml.tmpl",
            vmpath.GuestAddonsDir,
            "logviewer-rbac.yaml",
            "0640",
            false),
    }, false, "logviewer"),

こちらも問題はなさそうです。

3. pkg/addons/config.go

最後はこちら。

   {
        name:      "kubevirt",
        set:       SetBool,
        callbacks: []setFn{enableOrDisableAddon},
    },
    {
        name: "logviewer",
        set:  SetBool,
    },
    {
        name:      "metrics-server",
        set:       SetBool,
        callbacks: []setFn{enableOrDisableAddon},
    },

kubevirtとmetrics-serverのaddonと比較してすぐにわかりました。callbacksの指定がされていません。
これが原因の可能性が高いので修正してテストしてバイナリ作ってうごかしてみます。

(今回は上記のような修正だったので追加のテストコードは書きませんでした。が、本当は同じような不具合が発生した時にチェックできるようなテストケースを追加するのがベストだと思います…。)

疎通

gashirar:~/minikube$ ./out/minikube addons enable logviewer --alsologtostderr
I0605 00:36:28.749859   75196 addons.go:50] Setting logviewer=true in profile "minikube"
I0605 00:36:28.749894   75196 addons.go:126] Setting addon logviewer=true in "minikube"
I0605 00:36:28.749930   75196 host.go:65] Checking if "minikube" exists ...
I0605 00:36:28.750352   75196 cli_runner.go:108] Run: docker container inspect minikube --format={{.State.Status}}
I0605 00:36:28.787287   75196 addons.go:233] installing /etc/kubernetes/addons/logviewer-dp-and-svc.yaml
I0605 00:36:28.787326   75196 ssh_runner.go:215] scp deploy/addons/logviewer/logviewer-dp-and-svc.yaml.tmpl --> /etc/kubernetes/addons/logviewer-dp-and-svc.yaml (1942 bytes)
I0605 00:36:28.787445   75196 cli_runner.go:108] Run: docker container inspect -f "'{{(index (index .NetworkSettings.Ports "22/tcp") 0).HostPort}}'" minikube
I0605 00:36:28.822276   75196 sshutil.go:44] new ssh client: &{IP:127.0.0.1 Port:32779 SSHKeyPath:/home/gashirar/.minikube/machines/minikube/id_rsa Username:docker}
I0605 00:36:28.917038   75196 addons.go:233] installing /etc/kubernetes/addons/logviewer-rbac.yaml
I0605 00:36:28.917092   75196 ssh_runner.go:215] scp deploy/addons/logviewer/logviewer-rbac.yaml.tmpl --> /etc/kubernetes/addons/logviewer-rbac.yaml (1064 bytes)
I0605 00:36:28.933421   75196 ssh_runner.go:148] Run: sudo KUBECONFIG=/var/lib/minikube/kubeconfig /var/lib/minikube/binaries/v1.18.3/kubectl apply -f /etc/kubernetes/addons/logviewer-dp-and-svc.yaml -f /etc/kubernetes/addons/logviewer-rbac.yaml
I0605 00:36:29.125240   75196 addons.go:92] Writing out "minikube" config to set logviewer=true...
🌟  The 'logviewer' addon is enabled

直っていそうです。
PR投げる前にContributor License Agreement(CLA)に同意する必要があるので、それをやっていきます。

MinikubeのContributor Guideを読む

github.com

Linux Foundationのシステムを利用してCNCFのCLAを提出すれば認可されます。
ほぼ上記の手順で入力していけばOK。

このあとPRを投げましょう。

PR~Merge

github.com

実際のPRを見ていくと、k8s-ci-robotによって先ほど同意したCLAのチェックが行われているようです。

f:id:gashirar:20200626142105p:plain

レビュアーもbotによって決まる模様。すごい。

f:id:gashirar:20200626142113p:plain

ローカルではテストして通ったことは確認できていたのですが、Travisによるtestは失敗していました。
が、レビュアのmedyagh氏の判断によるのかmergeされることに。

f:id:gashirar:20200626142302p:plain

どういたしまして。

以降は適当なタイミングでリリースされるはずなので気長に待ちます。

1.12.0-beta.0

1.12.0-beta.0 Releaseで取り込まれた模様。

github.com

f:id:gashirar:20200626142712p:plain

下から3番目に載ってました。わーい。

まとめ

ほんの少しの修正でしたが、いつも利用しているOSSにコントリビュートできてよかったです。
あと何の縁かMinikube Addon作って遊んだりしてたのもよかったですね。不思議なものです。