centos k8s资源分配
导读:CentOS 上 Kubernetes 资源分配实操指南 一 前置条件与系统优化 关闭 Swap:临时执行 swapoff -a,并在 /etc/fstab 中注释 swap 行;内核参数设置 vm.swappiness=0,避免影响 k...
CentOS 上 Kubernetes 资源分配实操指南
一 前置条件与系统优化
- 关闭 Swap:临时执行
swapoff -a,并在/etc/fstab中注释 swap 行;内核参数设置vm.swappiness=0,避免影响 kubelet 调度与 OOM 行为。 - 关闭或放行安全组件:常见做法是
systemctl disable --now firewalld;SELinux 可设为SELINUX=permissive或disabled(生产请评估安全策略)。 - 内核网络参数:启用桥接流量进入 iptables/IP6tables
modprobe br_netfilter- 写入
/etc/sysctl.d/k8s.conf:net.bridge.bridge-nf-call-iptables = 1net.bridge.bridge-nf-call-ip6tables = 1
- 执行
sysctl -p /etc/sysctl.d/k8s.conf生效。
- 时钟同步:建议启用 chrony 或
timedatectl set-ntp true,避免证书校验与调度异常。 - 容器运行时与 kubelet:安装 Docker CE 或 containerd,部署 kubelet/kubeadm/kubectl,并
systemctl enable --now kubelet。 - 初始化与网络:
kubeadm init --pod-network-cidr=10.244.0.0/16(示例使用 Flannel)- 安装网络插件:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml - 配置 kubectl:
mkdir -p $HOME/.kube & & sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config & & sudo chown $(id -u):$(id -g) $HOME/.kube/config
以上为在 CentOS 上开展资源分配的必要基础环境。
二 核心机制与关键概念
- 资源请求与限制
- requests:调度依据,保证容器至少获得指定资源。
- limits:运行上限,超限会被限流或终止(内存 OOMKilled)。
- 建议为所有容器显式设置 requests/limits,避免“无请求”导致调度不均与资源抢占。
- QoS 等级(由 requests/limits 推导)
- Guaranteed:requests == limits(CPU/内存均设且相等),关键业务优先保障。
- Burstable:仅部分资源设限或 requests < limits。
- BestEffort:未设任何 requests/limits,最易被驱逐。
- 命名空间配额与 LimitRange
- ResourceQuota:限制命名空间总资源(如
requests.cpu、requests.memory、limits.cpu、limits.memory)。 - LimitRange:为 Namespace 内对象设置默认/最小/最大 requests/limits,防止“漏配”。
- ResourceQuota:限制命名空间总资源(如
- 调度与拓扑感知
- nodeSelector / nodeAffinity / podAffinity / podAntiAffinity:定向与亲和/反亲和调度,提升稳定性与资源隔离。
- 拓扑分散:如
podTopologySpreadConstraints,均衡分布关键服务副本。
- 自动扩缩容
- HPA:基于 CPU/内存或自定义指标 自动增减副本数。
- VPA(可选):基于历史使用自动建议/更新 requests/limits(通常与滚动更新配合)。
- 设备与专用资源
- GPU/NPU:通过设备插件暴露为扩展资源(如
nvidia.com/gpu),在 Pod 中以 limits 申请。
- GPU/NPU:通过设备插件暴露为扩展资源(如
- 动态资源分配 DRA
- DRA(Dynamic Resource Allocation) 仍处于演进阶段,面向更灵活的外设/专用资源分配,生产落地需评估特性成熟度与集群版本支持。
三 配置示例
-
- 容器资源请求与限制(Pod/Deployment 通用)
apiVersion: v1
kind: Pod
metadata:
name: app
spec:
containers:
- name: app
image: nginx:1.25
resources:
requests:
memory: "128Mi"
cpu: "250m"
limits:
memory: "256Mi"
cpu: "500m"
要点:为所有容器设置 requests/limits;CPU 为可压缩资源,内存为不可压缩资源,OOM 风险更高。
-
- 命名空间配额(ResourceQuota)
apiVersion: v1
kind: ResourceQuota
metadata:
name: team-a-quota
namespace: team-a
spec:
hard:
requests.cpu: "4"
requests.memory: "8Gi"
limits.cpu: "8"
limits.memory: "16Gi"
-
- HPA 基于 CPU 利用率扩缩容
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: app-hpa
namespace: team-a
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60
-
- GPU 资源申请(NVIDIA)
apiVersion: v1
kind: Pod
metadata:
name: gpu-demo
spec:
containers:
- name: cuda
image: nvidia/cuda:12.2.0-base
resources:
limits:
nvidia.com/gpu: 1 # 申请 1 张 GPU
前置:部署 NVIDIA Device Plugin(如 kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.13.0/nvidia-device-plugin.yml)。
四 容量规划与调优建议
- 节点容量与系统预留
- 预留 kube-reserved / system-reserved(CPU/内存),避免系统组件与内核 OOM 竞争;为 kubelet 设置
--eviction-threshold与--eviction-hard(如内存压力阈值)。 - 控制 DaemonSet(如日志、监控、网络插件)资源,计入节点可分配资源基线。
- 预留 kube-reserved / system-reserved(CPU/内存),避免系统组件与内核 OOM 竞争;为 kubelet 设置
- 请求与限制的设定方法
- 以压测/线上观测为依据,requests 取“常态稳定需求”,limits 取“峰值并留有余量”;避免将 limits 设置过低导致频繁限流或 OOM。
- 调度策略
- 关键服务使用 podAntiAffinity 分散到不同节点;有状态/数据密集服务优先绑定高性能节点(nodeAffinity)。
- 弹性与成本
- 常态流量用 HPA 水平扩展;季节性/大促活动可结合 VPA 做“右-sizing”,并配合灰度/金丝雀发布降低风险。
- 监控与持续优化
- 建立 Prometheus + Grafana 监控,关注节点 Allocatable/Allocated、Pod OOMKilled/Throttled、HPA 触发与扩缩容时延;定期复盘配额与请求/限制。
- 设备资源管理
- GPU 等专用资源按卡粒度申请与隔离,结合节点标签与污点/容忍度实现队列化与共享策略。
五 常用验证与排障命令
- 查看节点资源与可分配量:
kubectl describe node < node-name>(关注 Capacity/Allocatable/Allocations 与污点/条件)。 - 查看集群资源使用:
kubectl top nodes/kubectl top pods -A。 - 检查 Pod 事件与状态:
kubectl describe pod < pod-name> -n < ns>(排查 OOMKilled/FailedScheduling/Throttled)。 - 验证配额与限制生效:
kubectl get resourcequota -n < ns> -o yaml、kubectl get limitrange -n < ns> -o yaml。 - 快速校验 HPA:
kubectl get hpa < hpa-name> -n < ns>,观察指标与副本变化。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: centos k8s资源分配
本文地址: https://pptw.com/jishu/749924.html
