kubectlコマンドで特定のnodeからpodを排出（移動）する

メンテナンスなどで特定のnodeから予めpodを他のnodeに移しておきたいことがあります。
スケジューリングをyamlに定義して適用しても良いのですが、コマンド一発でサクッと済ませたいな、、と思いました。

# まとめ
- `drain`で排出（他へ移動）
- `--ignore-daemonsets`オプションは付ける
- 元に戻すには`uncordon`

# 実際にやってみた
`microk8s-0`～`microk8s-5`まで6nodesある中で、`microk8s-1`を対象に作業してみる。
## まずは現状確認
nodeのSTATUSは`Ready`。
```bash
ubuntu@k8s:~$ kubectl get nodes
NAME             STATUS   ROLES    AGE   VERSION
microk8s-3   Ready    <none>   13d   v1.25.4
microk8s-2   Ready    <none>   13d   v1.25.4
microk8s-4   Ready    <none>   13d   v1.25.4
microk8s-5   Ready    <none>   13d   v1.25.4
microk8s-1   Ready    <none>   13d   v1.25.4
microk8s-0   Ready    <none>   26d   v1.25.4
```
`microk8s-1`に配置されているpods。
```bash
ubuntu@k8s:~$ kubectl get pods -A -o wide | grep microk8s-1
kube-system      fluentd-5rmfh                             1/1     Running   0             9d      10.1.211.143   microk8s-1   <none>           <none>
logging          elasticsearch-89d7968d7-dsskn             1/1     Running   0             9d      10.1.211.144   microk8s-1   <none>           <none>
metallb-system   speaker-rlv76                             1/1     Running   3 (8d ago)    13d     172.17.0.91    microk8s-1   <none>           <none>
kube-system      calico-node-dgc6x                         1/1     Running   0             8d      172.17.0.91    microk8s-1   <none>           <none>
```
## drainの実行
`--ignore-daemonsets`を付けないとエラーになる。
`microk8s-1`が閉鎖（cordoned）され、daemonsetsではない`elasticsearch`のみが排出された。
`--delete-emptydir-data`のオプションが必要になるときもある。←ローカルデータは削除される。
```bash
ubuntu@k8s:~$ kubectl drain microk8s-1 --ignore-daemonsets 
node/microk8s-1 cordoned
Warning: ignoring DaemonSet-managed Pods: kube-system/fluentd-5rmfh, metallb-system/speaker-rlv76, kube-system/calico-node-dgc6x
evicting pod logging/elasticsearch-89d7968d7-dsskn
pod/elasticsearch-89d7968d7-dsskn evicted
node/microk8s-1 drained
```
## drain後の状態確認
nodeのSTATUSは`Ready,SchedulingDisabled`。
```bash
ubuntu@k8s:~$ kubectl get nodes
NAME             STATUS                     ROLES    AGE   VERSION
microk8s-5   Ready                      <none>   13d   v1.25.4
microk8s-0   Ready                      <none>   26d   v1.25.4
microk8s-3   Ready                      <none>   13d   v1.25.4
microk8s-2   Ready                      <none>   13d   v1.25.4
microk8s-1   Ready,SchedulingDisabled   <none>   13d   v1.25.4
microk8s-4   Ready                      <none>   13d   v1.25.4
```
`elasticsearch`が`microk8s-1`から消え、`microk8s-2`に移動している。
```bash
ubuntu@k8s:~$ kubectl get pods -A -o wide | grep microk8s-1
kube-system      fluentd-5rmfh                             1/1     Running   0             9d      10.1.211.143   microk8s-1   <none>           <none>
metallb-system   speaker-rlv76                             1/1     Running   3 (8d ago)    13d     172.17.0.91    microk8s-1   <none>           <none>
kube-system      calico-node-dgc6x                         1/1     Running   0             8d      172.17.0.91    microk8s-1   <none>           <none>
ubuntu@k8s:~$ 
ubuntu@k8s:~$ kubectl get pods -A -o wide | grep logging | grep elasticsearch
logging          elasticsearch-89d7968d7-wqf47             1/1     Running   0             2m3s    10.1.36.243    microk8s-2   <none>           <none>
```
これで`microk8s-1`を停止したり様々なメンテナンスがしやすくなった。

## 元に戻してみる（uncordon）
`microk8s-1`を指定して`uncordon`を実行
```bash
ubuntu@k8s:~$ kubectl uncordon microk8s-1 
node/microk8s-1 uncordoned
```
nodeのSTATUSが`Ready`に戻った！
```bash
ubuntu@k8s:~$ kubectl get nodes
NAME             STATUS   ROLES    AGE   VERSION
microk8s-4   Ready    <none>   12d   v1.25.4
microk8s-2   Ready    <none>   12d   v1.25.4
microk8s-3   Ready    <none>   12d   v1.25.4
microk8s-0   Ready    <none>   12d   v1.25.4
microk8s-1   Ready    <none>   12d   v1.25.4
microk8s-5   Ready    <none>   12d   v1.25.4
```
元々あった`elasticsearch`は自動では戻らない。
※nodeAffinity設定してたら戻ると思いますが未確認。
```bash
ubuntu@k8s:~$ kubectl get pods -A -o wide | grep microk8s-1
kube-system      fluentd-2w7fn                              1/1     Running   4 (112s ago)    12d     10.1.189.144   microk8s-1   <none>           <none>
metallb-system   speaker-vkb9z                              1/1     Running   4 (112s ago)    12d     10.9.6.41      microk8s-1   <none>           <none>
kube-system      calico-node-4hxxx                          1/1     Running   4 (112s ago)    8d      10.9.6.41      microk8s-1   <none>           <none>
```