Pages - Menu

2021年11月27日 星期六

[GKE]GKE節點無法自動縮小

前言

果然東西穩定之後,上面的都會想要costDown,
不過這也算是當初建立的人沒設定好,
會發生這個情況,後續也查明了,當初在每個節點上只允許放64個pod,
所以就算放滿,也吃不到那麼多。
但沒有自動縮小,這其實也是個問題,但要自動縮小,
還要看這個服務是否合適...。
反正我之後反而沒在糾結這個狀況了。

正文

最近發現一個東西,在GKE上面的節點,cpu分配很奇怪。

(fig.1)


每個node的節點都只佔了一半的CPU就去開新的節點了。
本來懷疑是自動擴展有問題,
後來發現應該是自動縮小有問題。

這個狀況在新建一個叢集,然後設定節點自動伸縮就會發生了。

一般來說,節點只要沒有pod在裡面,大約只要十分鐘就會把多餘的節點移除了。

ref. 集群自動擴縮程序的工作原理

但新建了一個節點池,裡面都空的。他並沒有縮小到最小節點。

詢問後得知,須先看一下log才能知道為什麼沒有自動縮小。

首先開啟 GCP的日誌查看器,
a. 資源選擇 Kubernetes Cluster
b. 日誌類型列表選擇

container.googleapis.com/cluster-autoscaler-visibility

c. 再選擇要查看的cluster name



(fig.2)

d. 展開 noDecisionStatus

(fig.3)


看到錯誤了,就是這個害得pod無法自動縮減。
這邊的錯誤訊息是
node.pod.has.local.storage,
新建節點無法縮減會出現的錯誤訊息通常是
node.kube.system.unmovable



(fig.4)

碰到 node.pod.has.local.storage的解法是在deploy的yaml上面加上註釋,位置位於 metadata底下

annotations:
    cluster-autoscaler.kubernetes.io/safe-to-evict: "true"


(fig.5)

ref.

至於碰到 node.kube.system.unmovable 的解法,
需建立 PDB ,讓在 namespace 的 kube-system可以被驅逐。PDB是什麼可參考 .k8s PDB(pod中斷預算)

kubectl create poddisruptionbudget <pdb name> --namespace=kube-system --selector app=<app name> --max-unavailable 1

要注意,selector的label不一定是app開頭,
要看各deploy裡面的設定。
最近碰到在GKE的kube-system裡面pod label,
反而是叫 k8s-app:kube-dns,selector可以隨意選擇,只要有辦法對到deploy即可



(fig.6)

How to set PDBs to enable CA to move kube-system pods?

但後來有發現一個問題,當解了一個 node.kube.system.unmovable ,後續可能會出現 node.pod.has.local.storage的問題,
這樣會變成必須針對每個deploy都額外做設定。

所以最後我選擇了,直接手動驅逐節點內的pod,
但pdb的設定要先看一下,
istio在安裝時,ingressgateway會同時設定pdb,
當pod只有1個的時候,是沒辦法驅逐的,
所以最好是預設ingressgateway 為 2個pod,這樣才能避免pdb的干擾,而導致無法驅逐。

kubectl drain [node-name] --force --ignore-daemonsets --delete-local-data

drain的參數

--force
當一些pod不是經 ReplicationController, ReplicaSet, Job, DaemonSet 或者 StatefulSet 管理時
就需要用--force來強制執行 (例如:kube-proxy)

--ignore-daemonsets
無視DaemonSet管理下的Pod

--delete-local-data
如果有mount local volumn的pod,會強制殺掉該pod並把資料清除掉
另外如果跟本身的配置訊息有衝突時,drain就不會執行

ref.

沒有留言:

張貼留言