容量规划和监控

容量规划和监控

容量规划是确保集群稳定运行的关键,需要平衡成本和性能。

节点规格建议

生产环境节点配置

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、成本优化

下一节:备份与恢复。