こんにちは、ご無沙汰しています。 しばらくブログを書いていなかったら冬になりました。
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-evictやrajatjindal/kubectl-evict-podがすでにあります。
自分の kubectl-evict プラグインは、kubectl logs
や kubectl 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
を使ってください。