re:annkara

日々学んだことを書き留めておく。

kubectl plugin マネージャの krew を Windows 10 で利用するときの注意点

kubectl plugin 機構について前回のブログにまとめていた際に、プラグインマネージャである krew について触れてなかった。

なので触ってみようと思って、インストールしてみたらちょっとハマったところがあったので、krew のことをざっくりと触れつつまとめおきたいと思う。

reannkara.hatenablog.com

krew とは

kubectl plugin を管理するプラグインマネージャのことで、kubectl plugin 機構を利用して Go で実装されている。

GitHub - kubernetes-sigs/krew: 📦 Package manager for kubectl plugins

kubectl krew help で実行可能なコマンドを見てみると、プラグインの検索やインストール、削除、krew でインストールされたプラグインの一覧などを見ることができ一通りの操作がサポートされている。

$ kubectl krew help
krew is the kubectl plugin manager.
You can invoke krew through kubectl: "kubectl krew [command]..."

Usage:
  krew [command]

Available Commands:
  help        Help about any command
  info        Show information about a kubectl plugin
  install     Install kubectl plugins
  list        List installed plugins
  remove      Uninstall plugins
  search      Discover kubectl plugins
  update      Update the local copy of the plugin index
  upgrade     Upgrade installed plugins to newer versions
  version     Show krew version and diagnostics

Flags:
  -h, --help      help for krew
  -v, --v Level   log level for V logs

Use "krew [command] --help" for more information about a command.

ハマったところ

krew をインストールするときに Windows の開発者モードを有効にしておくか、管理者権限でインストールコマンドを実行しないと以下のようなエラーが発生する。

$ ./krew-windows_amd64.exe install --manifest=./krew.yaml --archive=./krew.zip
Installing plugin: krew
...
A required privilege is not held by the client.
F0811 16:39:00.732515   23444 root.go:52] failed to install some plugins: [krew]

これは krew 自体の問題というよりは、Windows が開発者モードを有効にしていないと、管理者権限を持たないユーザにシンボリックリンクを作成させないという仕様のためらしい。

具体的には以下の issue で golang/go で議論されていた。

どうやら Windows 10 Creators Update で非管理者権限でもシンボリックリンクを作成できるようになったことに合わせて、Go の方でも対応を入れようという話だったらしい。

話の本旨からはそれてしまうけど、issue を眺めていると、今まで動いてなかったものがいきなり動いてしまい当時の仕様を変更してしまうことへの懸念だったり、セキュリティへのリスクなどいろいろと議論されていて、非常に興味深かった。

結局は、Go はマルチプラットフォームをサポートを目指す言語であり、Windows だけ挙動が異なるのを避けたい思いだったり、別のissueをあげて、この変更の影響に比べたら取るに足らないことだよみたいなことを言ってたりして、マージされていた。

github.com

krew のインストーラとしては以下の箇所で os.Symlink関数 が利用されている。

krew 自体をインストールするときだけではなくて、他のプラグインをインストールするときにもこの実装が利用されるので、プラグインをインストールするときには管理者権限で実行するか、開発者モードを有効にしないといけない。

github.com

まとめ

kubectl plugin や krew も最近出てきたものなので色々と改善する余地があるものの、自分で機能を拡張できたりするのは非常に面白いし自分も何かしらの形で貢献していきたい。

参考リンク

時間があるときに読んでおきたい。 blogs.windows.com

Windows API
SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE というフラグを Go の方でデフォルトで有効にした。
docs.microsoft.com

たまたま見つけた、Windows 向けの低レベルなAPI を提供する準標準ライブラリなのかな?? godoc.org