k8s在centos上的资源分配如何
K8s在CentOS上的资源分配实践指南
在CentOS系统上部署Kubernetes(K8s)集群后,资源分配是保障应用性能、集群稳定的核心环节,主要涉及节点资源准备、Pod资源请求与限制、QoS级别划分、调度策略优化及特殊资源(如GPU)管理五大维度。
一、节点资源准备:系统级配置
在CentOS节点上部署K8s前,需完成以下基础配置,确保资源分配的基础环境合规:
- 关闭Swap分区:K8s要求节点禁用Swap以避免内存资源过度占用(Swap会影响Pod的内存限制执行)。执行
swapoff -a
临时关闭,注释/etc/fstab
中的Swap行永久生效。 - 禁用SELinux:SELinux会限制容器对节点资源的访问,需修改
/etc/selinux/config
文件,将SELINUX=enforcing
改为SELINUX=disabled
,并重启系统。 - 关闭防火墙:避免防火墙拦截K8s组件间的通信(如kubelet与kube-apiserver),执行
systemctl stop firewalld & & systemctl disable firewalld
。 - 配置静态网络:编辑
/etc/sysconfig/network-scripts/ifcfg-ens33
(网卡名以实际为准),设置固定IP、网关、DNS,确保节点间网络互通。 - 安装必要工具:安装Docker(或其他CRI兼容容器运行时,如Containerd)作为容器引擎,安装
kubelet
、kubeadm
、kubectl
用于集群管理。
二、Pod资源分配:核心参数(Requests与Limits)
Pod是K8s资源分配的最小单位,通过requests(请求)和limits(限制)两个参数控制资源使用:
- requests:容器启动时申请的最小资源量,K8s调度器会优先将Pod调度到“剩余资源≥Pod requests”的节点,确保Pod能获得足够的资源启动。
- limits:容器运行时允许使用的最大资源量,当容器尝试突破limits时,Kubelet会采取限制措施(如CPU节流)或驱逐Pod(内存超出)。
示例配置(以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
配置原则:
- requests:基于应用实际基准测试的平均资源消耗,略低10%-20%(如应用平均使用350m CPU,设置为300m),避免因requests过高导致节点资源浪费。
- limits:高于应用峰值资源消耗(如峰值使用800m CPU,设置为1000m),防止应用因突发流量被误杀,同时避免占用过多节点资源。
三、QoS级别:资源优先级划分
K8s根据Pod的requests与limits关系,将Pod划分为三个QoS(服务质量)级别,影响资源紧张时的驱逐顺序:
- Guaranteed:
requests == limits
(且CPU为整数,如cpu: "1"
),优先级最高,仅在节点资源完全耗尽时才会被驱逐。适用于关键业务(如数据库)。 - Burstable:
requests != limits
(或CPU为小数,如cpu: "0.5"
),优先级中等,当节点资源紧张时,会优先驱逐Burstable Pod(但高于BestEffort)。适用于大多数普通应用(如Web服务)。 - BestEffort:未设置requests/limits,优先级最低,当节点资源不足时,会最先被驱逐。适用于无状态、可容忍中断的应用(如测试任务)。
示例:
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调度器通过节点亲和性、污点/容忍度、拓扑感知调度等策略,实现资源的精准分配:
- 节点亲和性(Node Affinity):将Pod调度到带有特定标签的节点(如
disk=ssd
),提升I/O密集型应用的性能。affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: disk operator: In values: - ssd
- 污点(Taints)与容忍度(Tolerations):通过给节点打污点(如
kubectl taint nodes node1 key=value:NoSchedule
),限制普通Pod调度到该节点;若Pod需调度到污点节点,需配置对应的容忍度。适用于维护节点(如升级内核)或专用节点(如GPU节点)。 - 拓扑感知调度(Topology-Aware Scheduling):利用K8s的CPU Manager功能,根据节点的NUMA拓扑结构分配CPU,减少CPU跨NUMA访问的延迟(适用于CPU密集型应用)。需在kubelet配置中启用
--cpu-manager-policy=static
。
五、特殊资源管理:GPU资源分配
若需在CentOS节点上运行GPU应用(如深度学习训练),需安装NVIDIA Device Plugin并配置GPU资源:
- 安装NVIDIA Device Plugin:通过DaemonSet部署插件,自动发现节点上的GPU设备并注册到K8s集群。
kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.13.0/nvidia-device-plugin.yml
- 配置Pod使用GPU:在Pod的
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 nodes
- 查看Pod资源使用:
kubectl top pods
- 调整Pod资源:通过
kubectl edit pod < pod-name>
修改requests/limits,或使用kubectl patch
命令动态调整(如增加CPU请求)。
通过以上步骤,可在CentOS上实现K8s资源的合理分配,保障应用性能与集群稳定性。需根据实际业务场景(如CPU密集型、内存密集型、GPU加速型)调整配置,遵循“基于测量、留有余地”的原则,避免资源浪费或不足。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: k8s在centos上的资源分配如何
本文地址: https://pptw.com/jishu/714926.html