Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

Ryuma Yoshida @ryysud Software Engineer at Z Lab Corporation

Slide 3

Slide 3 text

突然ですが...

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

こういったご経験ありませんか? “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 デコードするの⾯倒くさい!

Slide 10

Slide 10 text

こういったご経験ありませんか? “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 を実⾏するのは⾮常に⾯倒...

Slide 11

Slide 11 text

こういったご経験ありませんか? “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 のプラグイン機構を活⽤することで 複雑なオペレーションを効率化できるかも?

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

krew について

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

おすすめプラグイン

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

まとめ

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

Thank you!

Slide 26

Slide 26 text

補⾜

Slide 27

Slide 27 text

紹介できなかったプラグイン ▶ たまに使うプラグイン + 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 に対する操作で警告を促してくれる, 事故防⽌に良い)

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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