集羣信息
- master節點:3臺,slaver節點:9臺
- etcd運行在三臺master節點上
遇到的問題
- 在每天pod的啓動時,發現pod從Pending --> CreateContainer --> Running所花費的時間很長,一般會用到6-10Min。
- 刪除節點的時候也是需要花費3-5分鐘才能完成一個pod的刪除。
- 在master節點上面啓動或者刪除一個pod都會花費更長的時間。
排查
統計pod在節點的分配情況
我把
kubectl describe pod -n namespace | grep Node:
的輸出重定向到一個文件裏面,再對文件進行簡單的k-v統計之後,發現所有節點的調度都集中在三個節點上[可能有master節點,可能都不是master節點]。
查看yaml文件
查看yaml文件之後,發現:
- 在containers裏面,對於每一個container都沒有聲明資源相關的配置。
- 沒有對於pod的親和性設置。
解決問題
對於遇到的問題中的前兩個,我感覺應該是pod集中分配到幾個節點上面,造成那幾個節點壓力太大。一方面需要不能讓pod分配到master節點上面,另一方面需要把pod均分到其他節點。
不讓pod分配到master節點
這個可以在yaml文件裏面設置node親和性:
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: NotIn
values:
- master01
- master02
- master03
這個親和性的設置,可以在官方文檔上面看到詳細的設置方法。這個親和性可以避免pod分配到相關的節點上面。
均分pod到非master節點
這個需要設置一下資源的使用,讓master節點自己去選取合適的節點放置pod:
containers:
- name: container_first_name
...
...
...
resources:
requests:
memory: xxx
cpu: xxx
limits:
memory: xxx
cpu: xxx
相關的文檔在:官方文檔
結果
添加這兩個配置之後,發現現在的pod會均分到非master節點上面了,並且啓動時間縮短到了1分鐘之內,節省了很多的時間。