kubectl plugin マネージャの krew を Windows 10 で利用するときの注意点
kubectl plugin 機構について前回のブログにまとめていた際に、プラグインマネージャである krew について触れてなかった。
なので触ってみようと思って、インストールしてみたらちょっとハマったところがあったので、krew のことをざっくりと触れつつまとめおきたいと思う。
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をあげて、この変更の影響に比べたら取るに足らないことだよみたいなことを言ってたりして、マージされていた。
krew のインストーラとしては以下の箇所で os.Symlink関数 が利用されている。
krew 自体をインストールするときだけではなくて、他のプラグインをインストールするときにもこの実装が利用されるので、プラグインをインストールするときには管理者権限で実行するか、開発者モードを有効にしないといけない。
まとめ
kubectl plugin や krew も最近出てきたものなので色々と改善する余地があるものの、自分で機能を拡張できたりするのは非常に面白いし自分も何かしらの形で貢献していきたい。
参考リンク
時間があるときに読んでおきたい。 blogs.windows.com
Windows API
SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE
というフラグを Go の方でデフォルトで有効にした。
docs.microsoft.com