Multicluster-Scheduler環境でK8sクラスターレベルのdrainを試す
※本記事はブログからの移行記事のため、一部内容が古くなっている場合があります(また時間があるときに改稿するかもしれません)
前回の続き。
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のハードルが一気に下がりそうなのは魅力的です。
Discussion