kubectl のプラグイン機構を活用してオペレーションを効率化しよう / Let's use the kubectl plugin!

kubectl のプラグイン機構を活用してオペレーションを効率化しよう / Let's use the kubectl plugin!

KubeFest Tokyo 2020 で発表したスライドとなります。
https://k8sjp.github.io/kubefest-2020/sessions/23/

発表時の録画は以下を参照ください。
https://youtu.be/bEP4FwBEjfA?list=PLm3Ufa7bsgpyN_UGH7TnOfg-XynZHRlqL

9fdb6e5b532d7fa8687faebc4e70a865?s=128

Ryuma Yoshida

June 13, 2020
Tweet

Transcript

  1. 5.

    こういったご経験ありませんか? “kubectl exec” で指定するコンテナを忘れた... “kubectl get pods app -o yaml”

    で 出⼒したマニフェストが⾒づらくて 得たい情報を探すのが難しい
  2. 6.

    こういったご経験ありませんか? “kubectl exec” で指定するコンテナを忘れた... “kubectl get pods app -o yaml”

    で 出⼒したマニフェストが⾒づらくて 得たい情報を探すのが難しい Secret を参照するのに “kubectl get secret something -o yaml” の 出⼒結果をコピペして Base64 デコードするの⾯倒くさい!
  3. 7.

    こういったご経験ありませんか? “kubectl exec” で指定するコンテナを忘れた... “kubectl get pods app -o yaml”

    で 出⼒したマニフェストが⾒づらくて 得たい情報を探すのが難しい この Kubernetes クラスタで 動いてる Pod にはどれぐらいの Resource Request/Limit が 割り当てられているんだろう Secret を参照するのに “kubectl get secret something -o yaml” の 出⼒結果をコピペして Base64 デコードするの⾯倒くさい!
  4. 8.

    こういったご経験ありませんか? “kubectl exec” で指定するコンテナを忘れた... “kubectl get pods app -o yaml”

    で 出⼒したマニフェストが⾒づらくて 得たい情報を探すのが難しい この Kubernetes クラスタで 動いてる Pod にはどれぐらいの Resource Request/Limit が 割り当てられているんだろう Secret を参照するのに “kubectl get secret something -o yaml” の 出⼒結果をコピペして Base64 デコードするの⾯倒くさい! この Pod で起動してる コンテナのイメージをサクッと知りたい
  5. 9.

    こういったご経験ありませんか? “kubectl exec” で指定するコンテナを忘れた... この Pod で起動してる コンテナのイメージをサクッと知りたい この Subject

    に紐付いてる RBAC ロールって何だっけ? 紐付いてる RBAC ロールはわかったけど どんな操作が許可されてるんだっけ? この Kubernetes クラスタで 動いてる Pod にはどれぐらいの Resource Request/Limit が 割り当てられているんだろう “kubectl get pods app -o yaml” で 出⼒したマニフェストが⾒づらくて 得たい情報を探すのが難しい Secret を参照するのに “kubectl get secret something -o yaml” の 出⼒結果をコピペして Base64 デコードするの⾯倒くさい!
  6. 10.

    こういったご経験ありませんか? “kubectl exec” で指定するコンテナを忘れた... この Pod で起動してる コンテナのイメージをサクッと知りたい この Subject

    に紐付いてる RBAC ロールって何だっけ? 紐付いてる RBAC ロールはわかったけど どんな操作が許可されてるんだっけ? この Kubernetes クラスタで 動いてる Pod にはどれぐらいの Resource Request/Limit が 割り当てられているんだろう “kubectl get pods app -o yaml” で 出⼒したマニフェストが⾒づらくて 得たい情報を探すのが難しい Secret を参照するのに “kubectl get secret something -o yaml” の 出⼒結果をコピペして Base64 デコードするの⾯倒くさい! 何度も kubectl を実⾏するのは⾮常に⾯倒...
  7. 11.

    こういったご経験ありませんか? “kubectl exec” で指定するコンテナを忘れた... この Pod で起動してる コンテナのイメージをサクッと知りたい この Subject

    に紐付いてる RBAC ロールって何だっけ? 紐付いてる RBAC ロールはわかったけど どんな操作が許可されてるんだっけ? この Kubernetes クラスタで 動いてる Pod にはどれぐらいの Resource Request/Limit が 割り当てられているんだろう “kubectl get pods app -o yaml” で 出⼒したマニフェストが⾒づらくて 得たい情報を探すのが難しい Secret を参照するのに “kubectl get secret something -o yaml” の 出⼒結果をコピペして Base64 デコードするの⾯倒くさい! kubectl のプラグイン機構を活⽤することで 複雑なオペレーションを効率化できるかも?
  8. 13.

    kubectl のプラグイン機構について ▶ kubectl のプラグイン機構を利⽤することで kubectl に任意のサブコマンドを追加できる ▶ $PATH 内の

    kubectl- で始まる名前の実⾏可能ファイルがプラグインとして認識される + ハイフン(-) 区切りでサブコマンド名が決定される + kubectl-foo ファイルを kubectl foo で実⾏できる + kubectl-foo-bar ファイルを kubectl foo bar で実⾏できる + kubectl-foo-bar-baz ファイルを kubectl foo bar baz で実⾏できる + サブコマンド名にハイフン(-) を含めたい場合にはアンダースコア(_)を利⽤する + kubectl-piyo_poyo ファイルを kubectl piyo-poyo で実⾏できる + kubectl piyo_poyo でも実⾏できる ▶ プラグインのインストールは $PATH に含まれるディレクトリに実⾏可能ファイルを配置するだけ + インストール済みプラグインの⼀覧は kubectl plugin list コマンドから参照可能 + 実⾏権限が付与されていないなど何か問題が発⽣している場合には警告が出⼒される
  9. 14.
  10. 16.

    krew について ▶ kubectl プラグインマネージャー + Kubernetes の SIG-CLI によってメンテナンスされている

    + krew ⾃体も kubectl プラグインとして機能する + macOS, Linux, Windows などプラットフォーム毎に互換性があるバイナリを配布する + https://github.com/kubernetes-sigs/krew ▶ krew を使⽤することでオープンソースで利⽤可能なプラグインを簡単にインストールできる + 2020年6⽉12⽇時点で利⽤可能なプラグインは約100個! ▶ krew でインストール可能なプラグインは krew-index で管理されている + ⾃作プラグインも krew-index に追加することで krew での管理が可能になる + https://github.com/kubernetes-sigs/krew-index
  11. 17.

    krew の利⽤⽅法 ▶ kubectl krew search(利⽤可能なプラグインの検索) ▶ kubectl krew info

    <プラグイン名>(プラグイン情報の表⽰) ▶ kubectl krew install <プラグイン名>(プラグインのインストール) ▶ kubectl krew uninstall <プラグイン名>(プラグインのアンインストール) ▶ kubectl krew list(インストール済みプラグインの⼀覧表⽰) ▶ kubectl krew upgrade(インストール済みプラグインのアップグレード) ▶ kubectl krew update(ローカルの krew-index 更新) ※ krew のインストール⽅法は https://krew.sigs.k8s.io/docs/user-guide/setup/install を参照
  12. 18.
  13. 20.

    とてもよく使うプラグイン ▶ kubectl ctx(コンテキストを簡単に切り替え) ▶ kubectl ns(Namespace を簡単に切り替え) ▶ kubectl

    iexec(インタラクティブな kubectl exec) ▶ kubectl status(リソースのステータスをわかりやすく表⽰) ▶ kubectl neat(マニフェストから冗⻑な情報を削除して表⽰)
  14. 21.

    よく使うプラグイン ▶ kubectl view-secret(Secret を Base64 デコードして表⽰) ▶ kubectl images(Pod

    が使⽤しているコンテナイメージの⼀覧表⽰) ▶ kubectl rolesum(指定した Subject の RBAC ロールをサマリー表⽰) ▶ kubectl open-svc(ClusterIP な Service にクラスタ外から簡単にアクセス) ▶ kubectl tree(ownerReference ベースでリソースをツリー表⽰)
  15. 22.
  16. 23.

    まとめ ▶ kubectl のプラグイン機構を利⽤することで kubectl に     任意のサブコマンドを追加できる ▶ krew を使⽤することでプラグインを簡単にインストールできる

    ▶ よく実施するオペレーションで⾮効率だと感じているものが   あればプラグインを開発して効率化しよう!
  17. 26.
  18. 27.

    紹介できなかったプラグイン ▶ たまに使うプラグイン + kubectl exec-as(ユーザーを指定して kubectl exec) + kubectl

    modify-secret(Base64 エンコード/デコードを気にせずに Secret の直接編集) + kubectl view-serviceaccount-kubeconfig(指定された ServiceAccount ベースの Kubeconfig ⽣成) + kubectl get-all(kubectl get all で表⽰できないものも含んだリソース⼀覧を表⽰) + kubectl node-shell(Kubernetes クラスタの Node にログイン) + kubectl ca-cert(Kubernetes クラスタの CA証明書 を表⽰) + kubectl who-can(指定した Verb と Resource を実⾏可能な Subject を表⽰) ▶ 使ってないけど便利そうなプラグイン + kubectl outdated(Kubernetes クラスタ内の古いイメージを表⽰) + kubectl df-pv(Persistent Volume の空き容量を表⽰) + kubectl resource-capacity(リソース毎に Resource Request/Limit を⼀覧表⽰ ) + kubectl fleet(Kubeconfig 内のクラスタに関する情報を⼀覧表⽰) + kubectl prompt(特定のクラスタや Namespace に対する操作で警告を促してくれる, 事故防⽌に良い)
  19. 28.

    kubectl プラグインの開発⽅法 ▶ 任意のプログラミング⾔語で開発が可能 + kubectl- で始まる名前の実⾏可能ファイルという制約のみ + シェルスクリプトでも全く問題ない ▶

    Go で開発する際には cli-runtime ライブラリを使⽤することで kubectl コマンドで提供されているフラ グ(例: --kubeconfig, —namespace)や Kubernetes API REST クライアントなどを⾃作プラグインでも 利⽤できるようになる + cli-runtime は kubectl コマンドの実装にも利⽤されている + https://github.com/kubernetes/cli-runtime ▶ 開発に役⽴つサンプルコードもいくつか公開されている + cli-runtime を使⽤したプラグインのサンプル + https://github.com/kubernetes/sample-cli-plugin + krew でプラグインを公開するための基本的なコードが揃っているテンプレートリポジトリ + https://github.com/replicatedhq/krew-plugin-template
  20. 29.

    ⾃作 kubectl プラグインを krew で配布する流れ 1. プラグインを開発する + プラグイン名は公式の命名ガイドが参考にする +

    プラグイン実装時は公式ベストプラクティスを参考にする 2. プラグインのバイナリをライセンスと⼀緒に .tar.gz や .zip でアーカイブして公開する + GitHub でソースコードと併せてリリースでアーカイブファイルを公開している⼈が多数 3. Krew プラグインマニフェストを作成する + プラグイン名、説明⽂、プラットフォーム毎の配布物情報などを定義する必要がある + ローカルで作成したマニフェストでのインストールをテストすることも可能 4. krew-index に作成した Krew プラグインマニフェストを追加するプルリクエストを投げる 5. マージされたら krew でプラグインを配布できるようになる
  21. 31.

    kubectx, krew などの開発者である @ahmetb さんが数週間前から YouTube で kubectl プラグインと krew

    に関する情報の発信を始められたので興味ある⽅は観てみるのも良いかも