Multicluster-Scheduler環境でK8sクラスターレベルのdrainを試す

5 min読了の目安(約5000字TECH技術記事

※本記事はブログからの移行記事のため、一部内容が古くなっている場合があります(また時間があるときに改稿するかもしれません)


https://zenn.dev/gosarami/articles/0d0b6830514954ffbc91

前回の続き。
Multicluster-Scheduler v0.8.0のCHANGELOGに以下のような文言が記載されていました。

There's now one virtual node per target, making it possible to drain clusters, e.g., for blue/green cluster upgrades.

どうやらBlue/GreenなCluster Updateを行うために、Clusterレベルのdrainができるようです。
が、ドキュメントは特にないようなので、試しにProxy PodがスケジュールされているVirtual Nodeをdrainしてみることにしました。

環境

  • MacOS: Catalina
  • kind: v0.8.1
  • Kubernetes: v1.18.2
  • Multicluster-Scheduler: v0.8.0

手順

今回は前回構築したTargetクラスターであるc2クラスターをdrainします。
結果的にc2で動作しているDelegate Podがc1で起き上がればOKです。

  • 事前確認

c1のSource ClusterにProxy Pod、c2に以下のようなDelegate Podが稼働していることを確認(以下は一部抜粋)。

# Proxy Pod
$ kubectl --context "$CLUSTER1" get pods -o wide -n default |grep nginx-5466f8ddf7-vqsgk
nginx-5466f8ddf7-vqsgk         1/1     Running   0          22h   10.244.0.15   admiralty-c2       <none>           <none>

# Delegate Pod
$ kubectl --context "$CLUSTER2" get pods -o wide -n default |grep nginx-5466f8ddf7-vqsgk
nginx-5466f8ddf7-vqsgk-kbhdf   1/1     Running   0          22h   10.244.0.15   c2-control-plane   <none>           <none>
  • Virtual Nodeをdrain

admiralty-c2(Virtual Node)<->c2(実クラスター)
が対応しているため、admiralty-c2をdrainします。

$ kubectl --context "$CLUSTER1" drain admiralty-c2
node/admiralty-c2 cordoned
evicting pod "nginx-5466f8ddf7-gp2gl"
evicting pod "nginx-5466f8ddf7-xrtvt"
evicting pod "nginx-5466f8ddf7-8wwhb"
evicting pod "nginx-5466f8ddf7-lwj7k"
evicting pod "nginx-5466f8ddf7-vqsgk"
pod/nginx-5466f8ddf7-8wwhb evicted
pod/nginx-5466f8ddf7-lwj7k evicted
pod/nginx-5466f8ddf7-xrtvt evicted
pod/nginx-5466f8ddf7-vqsgk evicted
pod/nginx-5466f8ddf7-gp2gl evicted
node/admiralty-c2 evicted

# cordon確認
$ kubectl get no 
NAME               STATUS                     ROLES    AGE   VERSION
admiralty-c1       Ready                      agent    22h   
admiralty-c2       Ready,SchedulingDisabled   agent    22h   
c1-control-plane   Ready                      master   25h   v1.18.2
  • drain確認

Proxy Podはadmiralty-c1だけ、Delegate Podもc1だけにスケジュールされました!

# 20個のPodがc1だけにスケジュールされている
$ kubectl --context "$CLUSTER1" get pods -o wide -n default -o wide
NAME                           READY   STATUS    RESTARTS   AGE    IP            NODE               NOMINATED NODE   READINESS GATES
nginx-5466f8ddf7-4knlk         1/1     Running   0          22h    10.244.0.15   admiralty-c1       <none>           <none>
nginx-5466f8ddf7-4knlk-c7jxn   1/1     Running   0          22h    10.244.0.15   c1-control-plane   <none>           <none>
nginx-5466f8ddf7-4m589         1/1     Running   0          22h    10.244.0.18   admiralty-c1       <none>           <none>
nginx-5466f8ddf7-4m589-vn2l2   1/1     Running   0          22h    10.244.0.18   c1-control-plane   <none>           <none>
nginx-5466f8ddf7-9xvr9         1/1     Running   0          2m5s   10.244.0.20   admiralty-c1       <none>           <none>
nginx-5466f8ddf7-9xvr9-pnxnp   1/1     Running   0          2m4s   10.244.0.20   c1-control-plane   <none>           <none>
nginx-5466f8ddf7-cwr45         1/1     Running   0          2m4s   10.244.0.22   admiralty-c1       <none>           <none>
nginx-5466f8ddf7-cwr45-zpnr4   1/1     Running   0          2m2s   10.244.0.22   c1-control-plane   <none>           <none>
nginx-5466f8ddf7-d29d2         1/1     Running   0          22h    10.244.0.17   admiralty-c1       <none>           <none>
nginx-5466f8ddf7-d29d2-rtxtc   1/1     Running   0          22h    10.244.0.17   c1-control-plane   <none>           <none>
nginx-5466f8ddf7-gn6kv         1/1     Running   0          2m4s   10.244.0.24   admiralty-c1       <none>           <none>
nginx-5466f8ddf7-gn6kv-jdxn5   1/1     Running   0          119s   10.244.0.24   c1-control-plane   <none>           <none>
nginx-5466f8ddf7-j6v4c         1/1     Running   0          2m5s   10.244.0.21   admiralty-c1       <none>           <none>
nginx-5466f8ddf7-j6v4c-hh5z8   1/1     Running   0          2m3s   10.244.0.21   c1-control-plane   <none>           <none>
nginx-5466f8ddf7-msnc7         1/1     Running   0          22h    10.244.0.16   admiralty-c1       <none>           <none>
nginx-5466f8ddf7-msnc7-6qb8p   1/1     Running   0          22h    10.244.0.16   c1-control-plane   <none>           <none>
nginx-5466f8ddf7-pc7qk         1/1     Running   0          22h    10.244.0.19   admiralty-c1       <none>           <none>
nginx-5466f8ddf7-pc7qk-nksc2   1/1     Running   0          22h    10.244.0.19   c1-control-plane   <none>           <none>
nginx-5466f8ddf7-vhj88         1/1     Running   0          2m4s   10.244.0.23   admiralty-c1       <none>           <none>
nginx-5466f8ddf7-vhj88-j2svj   1/1     Running   0          2m1s   10.244.0.23   c1-control-plane   <none>           <none>

# c2のPodは正常にdrainされた
$ kubectl --context "$CLUSTER2" get pods -o wide -n default
No resources found in default namespace.

まとめ

通常のノード感覚で簡単にクラスターレベルのメンテナンス切り替えができるので、かなり斬新な体験でした。
仮にIn-Place Updateでクラスターが全断しても影響を受けない状態にでき、
Cluster Updateのハードルが一気に下がりそうなのは魅力的です。