$30 off During Our Annual Pro Sale. View Details »

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

Ryuma Yoshida

June 13, 2020
Tweet

More Decks by Ryuma Yoshida

Other Decks in Technology

Transcript

  1. KubeFest Tokyo 2020
    Ryuma Yoshida @ryysud
    kubectl のプラグイン機構を活⽤して
    オペレーションを効率化しよう

    View Slide

  2. Ryuma Yoshida @ryysud
    Software Engineer at Z Lab Corporation

    View Slide

  3. 突然ですが...

    View Slide

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

    View Slide

  5. こういったご経験ありませんか?
    “kubectl exec” で指定するコンテナを忘れた... “kubectl get pods app -o yaml” で
    出⼒したマニフェストが⾒づらくて
    得たい情報を探すのが難しい

    View Slide

  6. こういったご経験ありませんか?
    “kubectl exec” で指定するコンテナを忘れた... “kubectl get pods app -o yaml” で
    出⼒したマニフェストが⾒づらくて
    得たい情報を探すのが難しい
    Secret を参照するのに “kubectl get secret something -o yaml” の
    出⼒結果をコピペして Base64 デコードするの⾯倒くさい!

    View Slide

  7. こういったご経験ありませんか?
    “kubectl exec” で指定するコンテナを忘れた... “kubectl get pods app -o yaml” で
    出⼒したマニフェストが⾒づらくて
    得たい情報を探すのが難しい
    この Kubernetes クラスタで
    動いてる Pod にはどれぐらいの
    Resource Request/Limit が
    割り当てられているんだろう
    Secret を参照するのに “kubectl get secret something -o yaml” の
    出⼒結果をコピペして Base64 デコードするの⾯倒くさい!

    View Slide

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

    View Slide

  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 デコードするの⾯倒くさい!

    View Slide

  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 を実⾏するのは⾮常に⾯倒...

    View Slide

  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 のプラグイン機構を活⽤することで
    複雑なオペレーションを効率化できるかも?

    View Slide

  12. kubectl のプラグイン機構について

    View Slide

  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 コマンドから参照可能
    + 実⾏権限が付与されていないなど何か問題が発⽣している場合には警告が出⼒される

    View Slide

  14. View Slide

  15. krew について

    View Slide

  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

    View Slide

  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 を参照

    View Slide

  18. View Slide

  19. おすすめプラグイン

    View Slide

  20. とてもよく使うプラグイン
    ▶ kubectl ctx(コンテキストを簡単に切り替え)
    ▶ kubectl ns(Namespace を簡単に切り替え)
    ▶ kubectl iexec(インタラクティブな kubectl exec)
    ▶ kubectl status(リソースのステータスをわかりやすく表⽰)
    ▶ kubectl neat(マニフェストから冗⻑な情報を削除して表⽰)

    View Slide

  21. よく使うプラグイン
    ▶ kubectl view-secret(Secret を Base64 デコードして表⽰)
    ▶ kubectl images(Pod が使⽤しているコンテナイメージの⼀覧表⽰)
    ▶ kubectl rolesum(指定した Subject の RBAC ロールをサマリー表⽰)
    ▶ kubectl open-svc(ClusterIP な Service にクラスタ外から簡単にアクセス)
    ▶ kubectl tree(ownerReference ベースでリソースをツリー表⽰)

    View Slide

  22. まとめ

    View Slide

  23. まとめ
    ▶ kubectl のプラグイン機構を利⽤することで kubectl に    
    任意のサブコマンドを追加できる
    ▶ krew を使⽤することでプラグインを簡単にインストールできる
    ▶ よく実施するオペレーションで⾮効率だと感じているものが  
    あればプラグインを開発して効率化しよう!

    View Slide

  24. WE ARE HIRING!
    https://zlab.co.jp

    View Slide

  25. Thank you!

    View Slide

  26. 補⾜

    View Slide

  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 に対する操作で警告を促してくれる, 事故防⽌に良い)

    View Slide

  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

    View Slide

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

    View Slide

  30. Krew プラグインマニフェストの例

    View Slide

  31. kubectx, krew などの開発者である @ahmetb さんが数週間前から YouTube で
    kubectl プラグインと krew に関する情報の発信を始められたので興味ある⽅は観てみるのも良いかも

    View Slide

  32. kubectl の補完機能でプラグインもサポートするかは Issue で議論中

    View Slide