ヤフー株式会社は、2023年10月1日にLINEヤフー株式会社になりました。LINEヤフー株式会社の新しいブログはこちらです。LINEヤフー Tech Blog

テクノロジー

kubectlのプラグイン機構とおすすめプラグインのご紹介 〜 Kubernetes制御用コマンド #k8sjp

こんにちは。ヤフーの子会社であるゼットラボ株式会社の吉田(@ryysud)です。2018年12月よりゼットラボ株式会社でKubernetesをベースとしたインフラ基盤の研究開発を行っており、現在はCloud Nativeなアクセス制御システム(認証、認可)の研究開発を担当しています。

今回は2020年6月13日(土)に開催されたKubeFest Tokyo 2020でのセッション “kubectl のプラグイン機構を活用してオペレーションを効率化しよう”をベースに、Kubernetes制御用コマンドラインツールであるkubectlのプラグイン機構とおすすめプラグインをご紹介します。スライドとビデオは以下で公開されていますのでご興味ある方は参照ください。

ヤフーにおけるKubernetes

ゼットラボではヤフー向けにKubernetes as a Service(以下KaaS)の開発・提供を行っており、ヤフーではKaaSを利用してさまざまなサービスやプラットフォームでKubernetesが大規模に利用されています。2020年8月時点でのヤフーにおけるKubernetesの規模はこちらです。

  • Kubernetesを利用している開発チーム数: 210+
  • Kubernetesクラスタ数: 680+
  • Kubernetesクラスタ用の Node 数: 13000+
  • Pod数: 120K+

このようなヤフーでの大規模なKubernetes運用が気になる方は以下を、ゼットラボでの取り組みが気になる方はゼットラボ社ホームページの Newsを参照ください。

ゼットラボでの業務はKaaS開発やKubernetesに関連する研究開発がメインとなるため、業務の中でKubernetesクラスタに対してkubectlを利用してオペレーションを行うことがとても多いです。それらのオペレーションを行う中でkubectlの標準サブコマンドだけでは痒いところに手が届かず、複雑なオペレーションが必要となり面倒だなと感じることが多々あります。

このような課題に対してはkubectlのプラグイン機構を活用してオペレーションの効率化を図ることが効果的なので、ここからkubectlのプラグイン機構とおすすめプラグインをご紹介していきます。

コマンドラインツールkubectlのプラグイン機構について

kubectlのプラグイン機構(Extend kubectl with plugins)を利用することでkubectlに任意のサブコマンドを追加できます。

仕組みは非常に簡単で $PATH 内の kubectl- で始まる名前の実行可能ファイルがプラグイン(サブコマンド)として認識される仕様になっています。サブコマンド名はハイフン(-)区切りで決定されます。$PATH 内の kubectl-foo ファイルは kubectl foo で、kubectl-foo-bar ファイルは kubectl foo bar で実行できるイメージです。

以下は kubectl-foo プラグインを作成して kubectl foo で実行するまでの例です。

# プラグインの作成
$ echo -e '#!/bin/bash\n\necho "My first command-line argument was $1"' > kubectl-foo
$ chmod +x ./kubectl-foo

# プラグインのインストール
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
$ mv ./kubectl-foo /usr/local/bin

# プラグインの実行
$ kubectl foo hello
My first command-line argument was hello

プラグインのインストールは $PATH に含まれるディレクトリに配置するだけなので非常に簡単です。インストール済みのプラグイン一覧は以下のように kubectl plugin list コマンドから参照できます。なお、実行権限が付与されていないなど何か問題が発生している場合には警告が出力されるので警告に応じた対応が必要です。

$ kubectl plugin list
The following compatible plugins are available:

/Users/ryumyosh/.krew/bin/kubectl-ctx
/Users/ryumyosh/.krew/bin/kubectl-iexec
/Users/ryumyosh/.krew/bin/kubectl-images
/Users/ryumyosh/.krew/bin/kubectl-krew
/Users/ryumyosh/.krew/bin/kubectl-modify_secret
/Users/ryumyosh/.krew/bin/kubectl-neat
/Users/ryumyosh/.krew/bin/kubectl-ns
/Users/ryumyosh/.krew/bin/kubectl-open_svc
/Users/ryumyosh/.krew/bin/kubectl-rolesum
/Users/ryumyosh/.krew/bin/kubectl-status
/Users/ryumyosh/.krew/bin/kubectl-tree
/Users/ryumyosh/.krew/bin/kubectl-view_secret
/Users/ryumyosh/.krew/bin/kubectl-view_serviceaccount_kubeconfig
...

プラグインマネージャーKrewについて

KrewはKubernetesのSIG-CLIコミュニティでメンテナンスされているkubectlプラグインマネージャーです。

Krew自体もkubectlプラグインとして機能する仕様(kubectl krew コマンドでKrewを利用可能)になっており、Krewを使用することでオープンソースで利用可能なプラグインを簡単にインストールできます。Krewでインストール可能なプラグインはkrew-indexというGitHubリポジトリで管理されており、2020年8月時点で約110個のプラグインが利用可能になっています。

Krewの利用方法は以下のようになっており、非常に簡単にkubectlプラグインを管理できます。

  • 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 を参照ください。

おすすめプラグイン

私が個人的にオススメしたい、Krew でインストール可能なおすすめのプラグインを紹介します。

オススメ度:大

これらのプラグインで多くの人が日々の運用を楽にできるかと思います。是非インストールしてみてください。

  • kubectl ctx(コンテキストを簡単に切り替え、定番プラグイン)
  • kubectl ns(Namespace を簡単に切り替え、定番プラグイン)
  • kubectl iexec(インタラクティブな kubectl exec、Pod 名や Pod 内のコンテナ名を把握する必要がなくなる)
  • kubectl status(リソースのステータスをわかりやすく表示)
  • kubectl neat(マニフェストから冗長な情報を削除して表示、マニフェストが読みやすくなる)
  • kubectl view-secret(SecretをBase64デコードして表示)
  • kubectl images(Podが使用しているコンテナイメージの一覧表示)
  • kubectl rolesum(指定したSubjectのRBACロールをサマリー表示)
  • kubectl open-svc(ClusterIPなServiceにクラスタ外から簡単にアクセス)

Krewをインストールした後で以下をコピペしてお試しください。

kubectl krew install ctx
kubectl krew install ns
kubectl krew install iexec
kubectl krew install status
kubectl krew install neat
kubectl krew install view-secret
kubectl krew install images
kubectl krew install rolesum
kubectl krew install open-svc

オススメ度:中

万人向けではないかもしれませんが、意外と役立つ場面が多いです。

Krewをインストールした後で以下をコピペしてお試しください。

kubectl krew install tree
kubectl krew install exec-as
kubectl krew install modify-secret
kubectl krew install view-serviceaccount-kubeconfig
kubectl krew install get-all
kubectl krew install node-shell
kubectl krew install ca-cert
kubectl krew install who-can

オススメ度:小

出番は少ないかもしれませんが、インストールしておくといざというときに役に立つかと思います。

  • kubectl outdated(Kubernetesクラスタ内の古いイメージを表示)
  • kubectl df-pv(Persistent Volumeの空き容量を表示)
  • kubectl resource-capacity(NodeやPodごとにResource Request/Limitを一覧表示)
  • kubectl fleet(Kubeconfig内のクラスタに関する情報を一覧表示、マルチクラウド環境で役立ちそう)
  • kubectl prompt(特定のクラスタやNamespaceに対する操作で警告を促してくれる、事故防止に良い)

Krewをインストールした後で以下をコピペしてお試しください。

kubectl krew install outdated
kubectl krew install df-pv
kubectl krew install resource-capacity
kubectl krew install fleet
kubectl krew install prompt

kubectl プラグインの開発方法

先述のとおりkubectlプラグインには kubectl- で始まる名前の実行可能ファイルという制約があるだけなので、任意のプログラミング言語で開発が可能になっています。もちろんシェルスクリプトでも問題はありません。

但しGoで開発する場合にはkubectl自体の実装にも利用されているcli-runtimeライブラリを使用することでkubectlコマンドで提供されているフラグ(例: —kubeconfig, —namespace)やKubernetes API RESTクライアントなどを自作プラグインでも利用できるので、他の言語と比べてGoで開発するメリットが大きいかもしれません。

cli-runtimeを使用したプラグインのサンプルであるsample-cli-pluginや、Krewでプラグインを公開するための基本的なコードが揃っているテンプレートリポジトリであるkrew-plugin-templateなど、開発に役立つサンプルコードもいくつか公開されているのでこれらも非常に参考になるかと思います。

自作kubectlプラグインをKrewで公開する流れ

Krewで自作のプラグインを公開することも可能になっており、公開までの流れは以下のようになります。

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

以下は 3. のKrewプラグインマニフェストの例です。

apiVersion: krew.googlecontainertools.github.com/v1alpha2
kind: Plugin
metadata:
  # 'name' must match the filename of the manifest.
  name: restart
spec:
  # 'version' is a valid semantic version string (see semver.org)
  version: "v0.0.1"
  # 'homepage' usually links to the GitHub repository of the plugin
  homepage: https://github.com/achanda/kubectl-restart
  # 'shortDescription' explains what the plugin does in only a few words
  shortDescription: "Restarts a pod with the given name"
  description: |
    Restarts a pod with the given name. The existing pod
    will be deleted and created again, not a true restart.
  # 'platforms' specify installation methods for various platforms (os/arch)
  platforms:
  - selector:
      matchExpressions:
      - key: "os"
        operator: "In"
        values:
        - darwin
        - linux
    # 'uri' specifies .zip or .tar.gz archive URL of a plugin
    uri: https://github.com/achanda/kubectl-restart/archive/v0.0.3.zip
    # 'sha256' is the sha256sum of the url above
    sha256: d7079b79bf4e10e55ded435a2e862efe310e019b6c306a8ff04191238ef4b2b4
    # 'files' lists which files should be extracted out from downloaded archive
    files:
    - from: "kubectl-restart-*/restart.sh"
      to: "./restart.sh"
    - from: "LICENSE"
      to: "."
    # 'bin' specifies the path to the the plugin executable among extracted files
    bin: restart.sh

詳細はKrewのDeveloper Guideを参照ください。

さいごに

今回はKubeFest Tokyo 2020でのセッションをベースに、kubectlのプラグイン機構とおすすめプラグインをご紹介しました。オンプレミス・パプリッククラウド問わず、アプリケーションのプラットフォームとしてKubernetesを利用している企業はここ数年で増えてきたように感じます。そのような環境で、日々Kubernetesに対して実施しているオペレーションで非効率だと感じているものがあれば、kubectlのプラグイン機構を活用して効率化すると良いでしょう。

冒頭で説明したとおり、ヤフーでは大規模にKubernetesが利用されています。そのような環境で働くことに興味がある方は以下からご応募いただけると幸いです。

こちらの記事のご感想を聞かせください。

  • 学びがある
  • わかりやすい
  • 新しい視点

ご感想ありがとうございました


吉田 龍馬
ゼットラボ株式会社 ソフトウェアエンジニア
Kubernetes をベースとしたインフラ基盤の研究開発の一環で Cloud Native なアクセス制御システム(認証, 認可)の研究開発を担当しています。

このページの先頭へ