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

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プラグインを作りました。

ueokande/kubectl-evict A kubectl plugin to evict pods github.com

類似のプラグインに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 を使ってください。