k8sのクラスタが反応しなくなったのでインスタンスタイプをアップグレードした件

最近自前のk8sの上に載っているNextCloudに頻繁に画像・動画を同期させる機会が増えた。Mac用のNextCloud同期ツールを利用しているが、頻繁にエラーになってしまう。

CPUかメモリの使用率が上がっているのだろうと思ってkubectlで確認しようとしたが、確認すらできない。。kubeletが死んでいる…?

➜  ~ k top node
Error from server (ServiceUnavailable): the server is currently unable to handle the request (get nodes.metrics.k8s.io)
➜  ~ k top pod
Error from server (ServiceUnavailable): the server is currently unable to handle the request (get pods.metrics.k8s.io)

GKEの管理画面からメトリクスを確認しようとしたがこれもエラーで見えなかった…

もともとマシンタイプにしょぼいg1-smallを利用していたのでこの機会にマシンタイプのスペック上げることにしたのでその手順を残しておく

基本的にはこちらの手順に沿っている

GKEから新ノードの作成

マシンタイプをn2d-highcpu-2(2vCPU/メモリ2GB)にしてノード数を1台、他はいじらずに作成。

GKEで該当のノードプールのstatusがProvisioningからOKになるまで待つ

既存ノードプールの処分

本来ならPodDisruptionBudgetという設定を行うことで、最低限保持して欲しいpodの数と最大限退避されるpodの数を調整することができるらしいが僕の環境では1ノードで運用しているのであんまり細かいことは気にせずに進める。

https://qiita.com/tkusumi/items/946b0f31931d21a78058

➜  ~ k get pod -o wide
NAME                         READY   STATUS    RESTARTS   AGE   IP         NODE                                          NOMINATED NODE   READINESS GATES
blog-app-67fd67974-dt4th     1/1     Running   0          27m   10.0.0.2   gke-standard-cluster-1-pool-4-4153a57b-gph3   <none>           <none>
nextcloud-stateful-0         1/1     Running   0          27m   10.0.0.5   gke-standard-cluster-1-pool-4-4153a57b-gph3   <none>           <none>
static-app-64b55b8c4-w27wn   1/1     Running   0          27m   10.0.0.3   gke-standard-cluster-1-pool-4-4153a57b-gph3   <none>           <none>

まずは新規作成されるPodが旧ノードにスケジューリングされないように止める

# 旧ノードにスケジューリングしないように設定
➜  ~ k cordon gke-standard-cluster-1-pool-4-4153a57b-gph3
node/gke-standard-cluster-1-pool-4-4153a57b-gph3 cordoned

# statusに`SchedulingDisabled`が反映されているか確認
➜  ~ k get node -o wide
NAME                                          STATUS                     ROLES    AGE   VERSION             INTERNAL-IP     EXTERNAL-IP      OS-IMAGE                             KERNEL-VERSION   CONTAINER-RUNTIME
gke-standard-cluster-1-pool-4-4153a57b-gph3   Ready,SchedulingDisabled   <none>   25m   v1.17.17-gke.2800   10.146.15.196   35.200.103.197   Container-Optimized OS from Google   4.19.150+        docker://19.3.6
gke-standard-cluster-1-pool-5-924298a0-fhvd   Ready                      <none>   79s   v1.17.17-gke.2800   10.146.15.197   34.84.30.3       Container-Optimized OS from Google   4.19.150+        docker://19.3.6

旧ノードに存在してるPodを安全に停止させる、1,2分ほどかかった

➜  ~ k drain --ignore-daemonsets gke-standard-cluster-1-pool-4-4153a57b-gph3
node/gke-standard-cluster-1-pool-4-4153a57b-gph3 already cordoned
WARNING: ignoring DaemonSet-managed Pods: kube-system/fluentbit-gke-7g6jp, kube-system/gke-metrics-agent-wk2vz, kube-system/prometheus-to-sd-tdspn
evicting pod "kube-dns-autoscaler-5c78d65cd9-qffpg"
evicting pod "nextcloud-stateful-0"
evicting pod "stackdriver-metadata-agent-cluster-level-5599c87f9c-sgffq"
evicting pod "static-app-64b55b8c4-w27wn"
evicting pod "event-exporter-gke-666b7ffbf7-5grds"
evicting pod "blog-app-67fd67974-dt4th"
evicting pod "l7-default-backend-5b76b455d-j9rt9"
evicting pod "metrics-server-v0.3.6-547dc87f5f-2kn5c"
evicting pod "kube-dns-c9488f9fb-7fjtr"
pod/kube-dns-autoscaler-5c78d65cd9-qffpg evicted
pod/blog-app-67fd67974-dt4th evicted
pod/stackdriver-metadata-agent-cluster-level-5599c87f9c-sgffq evicted
pod/static-app-64b55b8c4-w27wn evicted
pod/l7-default-backend-5b76b455d-j9rt9 evicted
pod/nextcloud-stateful-0 evicted
pod/metrics-server-v0.3.6-547dc87f5f-2kn5c evicted
pod/kube-dns-c9488f9fb-7fjtr evicted
pod/event-exporter-gke-666b7ffbf7-5grds evicted
node/gke-standard-cluster-1-pool-4-4153a57b-gph3 evicted

--ignore-daemonsetsをつけないと、daemonsetも退避させようとしてエラーが出てしまう

➜  ~ k drain gke-standard-cluster-1-pool-4-4153a57b-gph3
node/gke-standard-cluster-1-pool-4-4153a57b-gph3 already cordoned
error: unable to drain node "gke-standard-cluster-1-pool-4-4153a57b-gph3", aborting command...

There are pending nodes to be drained:
 gke-standard-cluster-1-pool-4-4153a57b-gph3
error: cannot delete DaemonSet-managed Pods (use --ignore-daemonsets to ignore): kube-system/fluentbit-gke-7g6jp, kube-system/gke-metrics-agent-wk2vz, kube-system/prometheus-to-sd-tdspn

Podが新ノードに配置されているか確認

➜  ~ k get pod -o wide
NAME                         READY   STATUS              RESTARTS   AGE   IP         NODE                                          NOMINATED NODE   READINESS GATES
blog-app-67fd67974-fn5rj     1/1     Running             0          84s   10.0.1.4   gke-standard-cluster-1-pool-5-924298a0-fhvd   <none>           <none>
nextcloud-stateful-0         0/1     ContainerCreating   0          76s   <none>     gke-standard-cluster-1-pool-5-924298a0-fhvd   <none>           <none>
static-app-64b55b8c4-r774w   1/1     Running             0          84s   10.0.1.6   gke-standard-cluster-1-pool-5-924298a0-fhvd   <none>           <none>
tech  k8s 

See also