前言
正文
最近發現一個東西,在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.
0 意見:
張貼留言