k8s pod節點調度及k8s資源優化


一、k8s pod 在節點間調度控制

k8s起pod時,會通過調度器scheduler選擇某個節點完成調度,選擇在某個節點上完成pod創建。
當需要在指定pod運行在某個節點上時,可以通過以下幾種方式:

1. 在部署pod的yaml中,指定nodeName

指定了nodeName的Pod會直接跳過Scheduler的調度邏輯,直接寫入PodList列表,該匹配規則是強制匹配。
eg:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: tomcat-deploy
spec:
replicas: 1
template:
metadata:
labels:
app: tomcat-app
spec:
nodeName: k8s.node1 #指定調度節點為k8s.node1
containers:
- name: tomcat
image: tomcat:8.0
ports:
- containerPort: 8080

2. 在部署pod的yaml中,指定NodeSelector
通過kubernetes的label-selector機制進行節點選擇,由scheduler調度策略MatchNodeSelector進行label匹配,調度pod到目標節點,該匹配規則是強制約束。啟用節點選擇器的步驟為:
起pod步驟:

i. 先給node打上對應的label
#標記規則:kubectl label nodes <node-name> <label-key>=<label-value>
kubectl label nodes k8s.node1 cloudnil.com/role=dev

#確認標記
root@k8s.master1:~# kubectl get nodes k8s.node1 --show-labels
NAME STATUS AGE LABELS
k8s.node1 Ready 29d beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,cloudnil.com/role=dev,kubernetes.io/hostname=k8s.node1

ii. 起pod的時候,在yaml中指定nodeSelector

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: tomcat-deploy
spec:
replicas: 1
template:
metadata:
labels:
app: tomcat-app
spec:
nodeSelector:
cloudnil.com/role: dev #指定調度節點為帶有label標記為:cloudnil.com/role=dev的node節點
containers:
- name: tomcat
image: tomcat:8.0
ports:
- containerPort: 8080

3. 使用污點(Taint)
taint是k8s 1.6版本開始提供的功能,在k8s同樣用於節點調度的,還有一個容忍(Tolerations)功能
污點的組成為
key=value:effect

effect支持的類型包括一下三類:
NoSchedule:表示k8s將不會將Pod調度到具有該污點的Node上
PreferNoSchedule:表示k8s將盡量避免將Pod調度到具有該污點的Node上
NoExecute:表示k8s將不會將Pod調度到具有該污點的Node上,同時會將Node上已經存在的Pod驅逐出去
當希望起pod的時候,某個node不參與調度,可以給這個node加上一個NoSchedule的污點,eg:

# 設置污點
kubectl taint nodes kube-node1 key1=value1:NoSchedule

# 去除污點
kubectl taint nodes kube-node1 key1:NoSchedule-
此污點可以通過kubectl describe node <xxx-node> 查看

4. 容忍(tolerance)
當參與taint給node打算NoSchedule的污點之后,pod無法調度到該節點上運行,但有時我們希望某些pod仍然能運行到該node上時,可以通過在部署pod的yaml中添加tolerance,使pod能跳過污點,調度到對應節點上:

eg:
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
tolerationSeconds: 3600
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoExecute"
- key: "key2"
operator: "Exists"
effect: "NoSchedule"

其中:
operator為Equal時,key, vaule, effect要與Node上設置的taint保持一致
operator為Exist時,將會忽略value的值
tolerationSeconds指當pod需要被驅逐時,仍能在node上保留運行的時間
當tolerance不指定effect時,將容忍污點的所有作用
tolerations:
- key: "key"
operator: "Exists"

5. cordon/uncordon/drain
這幾個命令用於k8s節點維護,用法:
kubectl cordon <xxx-node>
此時通過

kubectl get node -o wide
可以看到node的狀態為scheduleDisable,即該節點為不可調度狀態。

可以通過uncordon來恢復node狀態:
kubectl uncordon <xxx-node>
當cordon node之后,原來運行在node上的pod,當超過保活周期之后,將會重新調度在其他node上運行。如果想讓pod馬上實現遷移,可以使用drain完成。

drain:標記節點為不可調度,並驅逐節點上的pod,用法:
kubectl drain <xxx-node>
注意:drain不只是當node被cordon時才適用,其實當node正常運行時,也可以用drain將運行在該node的pod驅趕出去

 

二、k8s(node節點資源)優化設置

在k8s節點中通過ExecStart=/usr/bin/kubelet設置系統保留資源來提高node節點的穩定行。

涉及到的參數:1.--system-reserved
                  2.--kube-reserved

vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
添加參數:
1:設置預留系統服務的資源
--system-reserved=cpu=200m,memory=1G


2:設置預留給k8s組件的資源(主要組件)
--kube-reserved=cpu=200m,memory=1G
系統內存--sytem-reserved --kube-reserved就是可以分配給pod的內存


3.驅逐條件
--eviction-hard=memory.available<500Mi,nodefs.available<1Gi,imagefsavailable<100Gi


4.最小驅逐
--eviction-minimum-reclaim="memory.available<0Mi,nodefs.available<500Mi,imagefsavailable<2Gi"


5.節點狀態更新時間
--node-status-update-frequency=10s


6.驅逐等待時間
--eviction-pressure-transition-period=20s


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM