容量规划和监控
容量规划和监控
容量规划是确保集群稳定运行的关键,需要平衡成本和性能。
节点规格建议
生产环境节点配置
Master 节点
最小配置:
CPU: 4 核
内存: 8GB
磁盘: 100GB SSD
推荐配置:
CPU: 8 核
内存: 16GB
磁盘: 200GB SSD
说明:
- Master 节点建议 3 个(奇数)
- 不运行业务 Pod(使用 taint)
- etcd 独立部署更佳
Worker 节点
小规模集群(< 50 Pods/节点):
CPU: 8 核
内存: 32GB
磁盘: 200GB SSD
中等规模(50-100 Pods/节点):
CPU: 16 核
内存: 64GB
磁盘: 500GB SSD
大规模(100+ Pods/节点):
CPU: 32 核
内存: 128GB
磁盘: 1TB SSD
说明:
- 保留 10-20% 资源给系统组件
- 网络密集型应用需要更好的网卡
- 存储密集型应用考虑本地 SSD
etcd 节点
配置:
CPU: 4-8 核
内存: 8-16GB
磁盘: 100GB+ SSD(IOPS > 3000)
说明:
- etcd 对磁盘 I/O 敏感
- 必须使用 SSD
- 网络延迟 < 50ms
- 建议独立部署
Pod 密度规划
单节点 Pod 数量
# Kubernetes 默认限制
最大 Pod 数:110/节点
# 实际建议
小型节点(8C 32G):30-50 Pods
中型节点(16C 64G):50-80 Pods
大型节点(32C 128G):80-110 Pods
计算公式
可用 Pod 数 = min(
节点 CPU / 平均 Pod CPU,
节点内存 / 平均 Pod 内存,
最大 Pod 数限制
)
示例:
节点:16C 64G
平均 Pod:0.2C 512Mi
系统保留:2C 8G
可用资源:14C 56G
理论 Pod 数:min(70, 112, 110) = 70
建议 Pod 数:50-60(留 20% buffer)
资源配额规划
Namespace 级别配额
apiVersion: v1
kind: ResourceQuota
metadata:
name: production-quota
namespace: production
spec:
hard:
# 计算资源
requests.cpu: "100"
requests.memory: 200Gi
limits.cpu: "200"
limits.memory: 400Gi
# 存储资源
requests.storage: 1Ti
persistentvolumeclaims: "50"
# 对象数量
pods: "500"
services: "100"
configmaps: "100"
secrets: "100"
# 特殊资源
services.loadbalancers: "5"
services.nodeports: "10"
LimitRange 配置
apiVersion: v1
kind: LimitRange
metadata:
name: production-limits
namespace: production
spec:
limits:
# Pod 限制
- type: Pod
max:
cpu: "4"
memory: 8Gi
min:
cpu: "50m"
memory: 64Mi
# Container 限制
- type: Container
default:
cpu: "500m"
memory: 512Mi
defaultRequest:
cpu: "100m"
memory: 128Mi
max:
cpu: "2"
memory: 4Gi
min:
cpu: "50m"
memory: 64Mi
maxLimitRequestRatio:
cpu: "4"
memory: "4"
# PVC 限制
- type: PersistentVolumeClaim
max:
storage: 100Gi
min:
storage: 1Gi
集群容量监控
关键指标
节点级别
# CPU 使用率
100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# 内存使用率
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100
# 磁盘使用率
(1 - (node_filesystem_avail_bytes / node_filesystem_size_bytes)) * 100
# 网络带宽
rate(node_network_receive_bytes_total[5m])
rate(node_network_transmit_bytes_total[5m])
# 磁盘 IOPS
rate(node_disk_reads_completed_total[5m])
rate(node_disk_writes_completed_total[5m])
集群级别
# 总节点数
count(kube_node_info)
# 可调度节点数
count(kube_node_status_condition{condition="Ready",status="true"})
# 总 Pod 数
sum(kube_pod_info)
# Running Pod 数
count(kube_pod_status_phase{phase="Running"})
# CPU 分配率
sum(kube_pod_container_resource_requests{resource="cpu"}) /
sum(kube_node_status_allocatable{resource="cpu"})
# 内存分配率
sum(kube_pod_container_resource_requests{resource="memory"}) /
sum(kube_node_status_allocatable{resource="memory"})
Pod 级别
# Pod CPU 使用率
sum(rate(container_cpu_usage_seconds_total[5m])) by (pod)
# Pod 内存使用
sum(container_memory_usage_bytes) by (pod)
# Pod 网络流量
sum(rate(container_network_receive_bytes_total[5m])) by (pod)
sum(rate(container_network_transmit_bytes_total[5m])) by (pod)
Grafana Dashboard
{
"dashboard": {
"title": "Kubernetes Capacity Planning",
"panels": [
{
"title": "Cluster CPU Allocation",
"targets": [{
"expr": "sum(kube_pod_container_resource_requests{resource=\"cpu\"}) / sum(kube_node_status_allocatable{resource=\"cpu\"}) * 100"
}],
"thresholds": [
{"value": 70, "color": "yellow"},
{"value": 85, "color": "red"}
]
},
{
"title": "Node CPU Usage",
"targets": [{
"expr": "100 - (avg by (instance) (irate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100)"
}]
},
{
"title": "Pod Distribution by Node",
"targets": [{
"expr": "count(kube_pod_info) by (node)"
}]
}
]
}
}
容量告警
Prometheus 告警规则
groups:
- name: capacity
rules:
# 节点 CPU 使用率过高
- alert: NodeHighCPUUsage
expr: |
100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
for: 10m
labels:
severity: warning
annotations:
summary: "节点 {{ $labels.instance }} CPU 使用率过高"
description: "CPU 使用率 {{ $value | humanize }}%"
# 节点内存使用率过高
- alert: NodeHighMemoryUsage
expr: |
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 85
for: 10m
labels:
severity: warning
annotations:
summary: "节点 {{ $labels.instance }} 内存使用率过高"
# 集群 CPU 分配率过高
- alert: ClusterHighCPUAllocation
expr: |
sum(kube_pod_container_resource_requests{resource="cpu"}) /
sum(kube_node_status_allocatable{resource="cpu"}) > 0.85
for: 30m
labels:
severity: warning
annotations:
summary: "集群 CPU 分配率过高"
description: "建议扩容节点"
# Pod 数量接近限制
- alert: NodePodCountNearLimit
expr: |
count(kube_pod_info) by (node) /
kube_node_status_capacity{resource="pods"} > 0.85
for: 10m
labels:
severity: warning
annotations:
summary: "节点 {{ $labels.node }} Pod 数量接近限制"
# 磁盘空间不足
- alert: DiskSpaceLow
expr: |
(1 - (node_filesystem_avail_bytes / node_filesystem_size_bytes)) * 100 > 85
for: 10m
labels:
severity: warning
annotations:
summary: "节点 {{ $labels.instance }} 磁盘空间不足"
# etcd 数据库大小过大
- alert: EtcdDatabaseSizeHigh
expr: |
etcd_mvcc_db_total_size_in_bytes / etcd_server_quota_backend_bytes > 0.85
for: 10m
labels:
severity: warning
annotations:
summary: "etcd 数据库大小接近配额"
扩容决策
何时扩容
触发条件:
节点 CPU 使用率:
- 平均 > 70%,持续 1 小时
- 峰值 > 85%,频繁出现
节点内存使用率:
- 平均 > 75%,持续 1 小时
- 可用内存 < 2GB
集群资源分配率:
- CPU 请求 > 80%
- 内存请求 > 80%
Pod 密度:
- 单节点 Pod 数 > 80
- 频繁出现 Pending
网络带宽:
- 持续 > 80% 利用率
- 延迟明显增加
扩容方式
垂直扩容(Scale Up)
# 优点:
- 简单直接
- 减少网络跳转
# 缺点:
- 单点故障风险
- 成本高
- 有物理限制
# 适用场景:
- 单体应用
- 有状态应用
- 需要大内存/CPU 的应用
水平扩容(Scale Out)
# 优点:
- 高可用
- 灵活
- 成本效益
# 缺点:
- 复杂度增加
- 网络开销
# 适用场景:
- 无状态应用
- 微服务
- 需要高可用
自动扩容
Cluster Autoscaler
# 安装 Cluster Autoscaler
# 支持 AWS、GCP、Azure 等云平台
apiVersion: apps/v1
kind: Deployment
metadata:
name: cluster-autoscaler
namespace: kube-system
spec:
template:
spec:
containers:
- name: cluster-autoscaler
image: k8s.gcr.io/autoscaling/cluster-autoscaler:v1.28.0
command:
- ./cluster-autoscaler
- --cloud-provider=aws
- --namespace=kube-system
- --nodes=1:10:my-asg # min:max:asg-name
- --scale-down-enabled=true
- --scale-down-delay-after-add=10m
- --scale-down-unneeded-time=10m
容量优化
资源使用优化
# 1. 查找过度分配的资源
kubectl top pods --all-namespaces | sort -k3 -h
# 2. 查找未使用的资源
kubectl get pods --all-namespaces -o json | \
jq -r '.items[] | select(.spec.containers[].resources.requests == null) |
"\(.metadata.namespace)/\(.metadata.name)"'
# 3. 使用 VPA 推荐
kubectl get vpa --all-namespaces
Vertical Pod Autoscaler (VPA)
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: myapp-vpa
spec:
targetRef:
apiVersion: apps/v1
kind: Deployment
name: myapp
updatePolicy:
updateMode: "Auto" # Off、Initial、Recreate、Auto
resourcePolicy:
containerPolicies:
- containerName: '*'
minAllowed:
cpu: 100m
memory: 128Mi
maxAllowed:
cpu: 2
memory: 2Gi
controlledResources: ["cpu", "memory"]
成本优化
# 1. 使用 Spot/Preemptible 实例
# 成本节省:50-90%
# 适用:无状态、可中断的工作负载
# 2. 混合节点池
# - 关键应用:按需实例
# - 批处理:Spot 实例
# - 开发环境:Spot 实例
# 3. 资源打包优化
# - CPU 密集型和内存密集型 Pod 混合部署
# - 提高节点利用率
# 4. 定期清理
# - 未使用的 PV
# - 已完成的 Job
# - 旧的 ReplicaSet
性能基准测试
使用 Kubemark 压测
# Kubemark 模拟大规模集群
# 测试调度器、API Server 性能
# 1. 创建空壳节点
kubectl scale deployment hollow-node --replicas=1000
# 2. 创建测试负载
kubectl create deployment test-load --image=nginx --replicas=10000
# 3. 监控性能指标
kubectl top nodes
API Server 性能测试
# 使用 kube-burner 压测
kube-burner init \
--config=config.yml \
--uuid=test-1 \
--log-level=info
# 监控 API Server 延迟
kubectl get --raw /metrics | grep apiserver_request_duration
小结
本节介绍了容量规划和监控:
✅ 节点规格:Master、Worker、etcd 节点配置建议
✅ Pod 密度:单节点 Pod 数量规划
✅ 资源配额:ResourceQuota、LimitRange
✅ 容量监控:节点、集群、Pod 关键指标
✅ 容量告警:CPU、内存、磁盘告警规则
✅ 扩容决策:触发条件、扩容方式、自动扩容
✅ 容量优化:资源优化、VPA、成本优化
下一节:备份与恢复。