特定PodをEvictionするkubectlプラグイン

特定PodをEvictionするkubectlプラグイン

こんにちは、ご無沙汰しています。 しばらくブログを書いていなかったら冬になりました。

Kubernetes は高機能で柔軟なスケジューリングの仕組みがあります。 Kubernetes クラスタの管理者は、kubectl CLI でクラスタや Pod の管理ができます。 しかし特定の Pod を Eviction する機能がなかったので、それを実現できる kubectl プラグインを作ったので紹介します。

Pod Eviction

Kubernetes には、Pod を終了させて Node から退避する Eviction という機能があります。 この機能は、Node がシャットダウンするときや、Node がローリングリスタートするときに、サービスのダウンタイムを最小にするために利用されます。 kubectl drain は指定した Node 上のすべての Pod を退避し、Node を新たな Pod がスケジューリングされないようにするサブコマンドです。

$ kubectl drain your-node

kubectl-evict

kubectl は特定の Pod のみを Eviction する機能を提供しません。 特定 Pod のみの Eviction は、PodDisruptionBudget のテストなどに使いたくなる場面があります。 Pod を Eviction できるEviction APIは提供されているので、特定の Pod を Eviction できる kubectl プラグインを作りました。

類似のプラグインにdwradcliffe/kubectl-evictrajatjindal/kubectl-evict-podがすでにあります。 自分の kubectl-evict プラグインは、kubectl logskubectl exec と似たようなコマンドラインインターフェイスで利用できます。 具体的には以下のような機能があります。

  • ラベルセレクタによる Pod の絞り込み
  • Deployment や DaemonSet が作る Pod の Eviction
  • --dry-run--grace-period オプションのサポート

プラグインは go install でインストールできます。

$ go install github.com/ueokande/kubectl-evict@latest

使い方

特定の Pod を Eviction するには以下のように Pod 名を渡します。

$ kubectl evict nginx-abcd-1234

ラベルによる Pod 名の絞り込みもできます。以下の例はapp=nginx というラベルを持つ Pod を Eviction します。

$ kubectl evict -l app=nginx

Deployment などの Pod を作成するリソースも Eviction できます。

$ kubectl evict deployment/nginx

もちろん drain と同じように、特定の Node 上の Pod も Eviction できます。

$ kubectl evict node/worker-1

kubectl evict は Node にスケジューリングされないようにする機能(Cordon)はないので、もし明示的にスケジューリングを止めたい場合は、kubectl cordon または kubectl drain を使ってください。


Profile picture

Shin'ya Ueoka

B2B向けSaaSを提供する会社の、元Webエンジニア。今はエンジニアリング組織のマネジメントをしている。