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

1、k8s pod 在節點間調度控制node

k8s起pod時,會經過調度器scheduler選擇某個節點完成調度,選擇在某個節點上完成pod建立。
當須要在指定pod運行在某個節點上時,能夠經過如下幾種方式:linux

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

指定了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: 8080api

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

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中指定nodeSelectorapp

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: 8080ide

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驅趕出去

 

2、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

相關文章
相關標籤/搜索