K8s在CentOS上的資源分配實踐指南
在CentOS系統上部署Kubernetes(K8s)集群后,資源分配是保障應用性能、集群穩定的核心環節,主要涉及節點資源準備、Pod資源請求與限制、QoS級別劃分、調度策略優化及特殊資源(如GPU)管理五大維度。
在CentOS節點上部署K8s前,需完成以下基礎配置,確保資源分配的基礎環境合規:
swapoff -a臨時關閉,注釋/etc/fstab中的Swap行永久生效。/etc/selinux/config文件,將SELINUX=enforcing改為SELINUX=disabled,并重啟系統。systemctl stop firewalld && systemctl disable firewalld。/etc/sysconfig/network-scripts/ifcfg-ens33(網卡名以實際為準),設置固定IP、網關、DNS,確保節點間網絡互通。kubelet、kubeadm、kubectl用于集群管理。Pod是K8s資源分配的最小單位,通過requests(請求)和limits(限制)兩個參數控制資源使用:
示例配置(以Nginx Pod為例):
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx:alpine
resources:
requests:
memory: "64Mi" # 請求64MB內存
cpu: "250m" # 請求0.25核CPU(1核=1000m)
limits:
memory: "128Mi" # 限制最大128MB內存
cpu: "500m" # 限制最大0.5核CPU
配置原則:
K8s根據Pod的requests與limits關系,將Pod劃分為三個QoS(服務質量)級別,影響資源緊張時的驅逐順序:
requests == limits(且CPU為整數,如cpu: "1"),優先級最高,僅在節點資源完全耗盡時才會被驅逐。適用于關鍵業務(如數據庫)。requests != limits(或CPU為小數,如cpu: "0.5"),優先級中等,當節點資源緊張時,會優先驅逐Burstable Pod(但高于BestEffort)。適用于大多數普通應用(如Web服務)。示例:
# Guaranteed(requests == limits,且CPU為整數)
resources:
requests:
cpu: "1"
memory: "1Gi"
limits:
cpu: "1"
memory: "1Gi"
# Burstable(requests != limits)
resources:
requests:
cpu: "0.5"
memory: "512Mi"
limits:
cpu: "1"
memory: "1Gi"
# BestEffort(未設置requests/limits)
resources: {}
K8s調度器通過節點親和性、污點/容忍度、拓撲感知調度等策略,實現資源的精準分配:
disk=ssd),提升I/O密集型應用的性能。affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disk
operator: In
values:
- ssd
kubectl taint nodes node1 key=value:NoSchedule),限制普通Pod調度到該節點;若Pod需調度到污點節點,需配置對應的容忍度。適用于維護節點(如升級內核)或專用節點(如GPU節點)。--cpu-manager-policy=static。若需在CentOS節點上運行GPU應用(如深度學習訓練),需安裝NVIDIA Device Plugin并配置GPU資源:
kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.13.0/nvidia-device-plugin.yml
resources.limits中指定GPU數量(如nvidia.com/gpu: 1)。resources:
limits:
nvidia.com/gpu: 1 # 請求1個GPU
注意:GPU資源為集群級資源,需確保節點有足夠的GPU可用(通過kubectl describe node <node-name>查看GPU總量)。
資源分配并非一成不變,需通過監控工具(如Prometheus+Granafa)實時觀察節點和Pod的資源使用情況(CPU、內存、GPU利用率),并根據業務增長調整requests/limits:
kubectl top nodeskubectl top podskubectl edit pod <pod-name>修改requests/limits,或使用kubectl patch命令動態調整(如增加CPU請求)。通過以上步驟,可在CentOS上實現K8s資源的合理分配,保障應用性能與集群穩定性。需根據實際業務場景(如CPU密集型、內存密集型、GPU加速型)調整配置,遵循“基于測量、留有余地”的原則,避免資源浪費或不足。