こんにちは、ご無沙汰しています。 しばらくブログを書いていなかったら冬になりました。
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-nodekubectl-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=nginxDeployment などの Pod を作成するリソースも Eviction できます。
$ kubectl evict deployment/nginxもちろん drain と同じように、特定の Node 上の Pod も Eviction できます。
$ kubectl evict node/worker-1kubectl evict は Node にスケジューリングされないようにする機能(Cordon)はないので、もし明示的にスケジューリングを止めたい場合は、kubectl cordon または kubectl drain を使ってください。
