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加速型)调整配置,遵循“基于测量、留有余地”的原则,避免资源浪费或不足。