4. 配置文件结构:YAML 配置文件的设计原则

在 Kubernetes 环境容量压测巡检脚本中,YAML 配置文件是连接脚本逻辑与集群环境的“契约”。一个设计良好的配置文件应当遵循可读性优先、职责分离、默认值兜底三大原则。本章将围绕集群信息、压测参数、巡检阈值三个核心模块,拆解 YAML 配置的结构设计与调试要点。

设计原则速览:
  • 可读性优先:使用清晰的键名、合理的缩进、必要的注释,避免过度嵌套。
  • 职责分离:集群连接信息、压测执行参数、巡检判定阈值分属不同区块,互不耦合。
  • 默认值兜底:脚本内部为每个参数提供安全默认值,YAML 中缺失时自动回退,避免空指针或异常中断。

4.1 配置文件整体结构

一个标准的压测巡检 YAML 配置文件包含三个顶级字段:cluster、stress、inspection。以下为完整结构示例:

# kubernetes-stress-inspection-config.yaml
# 版本: v2.1
# 用途: 集群容量压测与巡检参数配置

cluster:
  name: "production-cluster-01"
  kubeconfig: "/home/sre/.kube/config"
  context: "prod-context"
  namespace: "stress-test"
  timeout: 30s

stress:
  mode: "deployment"          # 可选: deployment / job / statefulset
  replicas: 10
  cpu_limit: "500m"
  memory_limit: "512Mi"
  duration: "5m"
  concurrency: 3
  image: "registry.example.com/stress-ng:latest"
  node_selector:
    kubernetes.io/hostname: "node-01"

inspection:
  interval: 10s
  thresholds:
    cpu_usage_percent: 80
    memory_usage_percent: 85
    pod_restart_count: 3
    node_disk_pressure: false
    api_server_latency_ms: 500
    etcd_db_size_mb: 100
关键点:YAML 中不要使用 Tab 缩进,统一使用两个空格。字符串值如果包含特殊字符(如冒号、#),建议使用双引号包裹。

4.2 集群信息模块(cluster)

cluster 区块负责定义脚本如何连接目标 Kubernetes 集群。它不包含任何压测或巡检逻辑,只提供连接上下文。

字段 类型 必填 说明 默认值
name string 是 集群标识名,用于日志和告警 无
kubeconfig string 否 kubeconfig 文件路径;若为空则使用环境变量 KUBECONFIG ~/.kube/config
context string 否 指定 kubeconfig 中的 context;若为空则使用当前 context 当前 context
namespace string 是 压测资源部署的目标命名空间 default
timeout duration 否 API Server 连接超时时间 30s
避坑提示:如果 kubeconfig 和 context 同时缺失,脚本会尝试使用默认 kubeconfig 和当前 context。在多集群环境下,务必显式指定 context,避免误操作到非目标集群。

4.3 压测参数模块(stress)

stress 区块控制压测任务的执行方式。它决定了脚本创建什么样的工作负载、运行多长时间、以及如何调度到节点上。

字段 类型 必填 说明 默认值
mode string 是 工作负载类型:deployment / job / statefulset deployment
replicas int 是 副本数,决定压测并发规模 1
cpu_limit string 否 每个 Pod 的 CPU 资源上限 500m
memory_limit string 否 每个 Pod 的内存资源上限 512Mi
duration duration 是 压测持续时长,例如 5m、1h 5m
concurrency int 否 同时创建 Pod 的并发数,控制 API 请求速率 1
image string 否 压测容器镜像地址 registry.example.com/stress-ng:latest
node_selector map 否 将压测 Pod 调度到指定节点 无
调试建议:首次压测时,建议将 replicas 设为 1、concurrency 设为 1,先验证镜像拉取和 Pod 启动是否正常,再逐步增加并发规模。

4.4 巡检阈值模块(inspection)

inspection 区块定义脚本在压测过程中持续监控哪些指标,以及触发告警的阈值。阈值设置过高会漏报,过低则导致误报,需要根据集群基线反复校准。

字段 类型 必填 说明 默认值
interval duration 否 巡检轮询间隔 10s
cpu_usage_percent int 否 节点 CPU 使用率告警阈值(百分比) 80
memory_usage_percent int 否 节点内存使用率告警阈值(百分比) 85
pod_restart_count int 否 单个 Pod 重启次数告警阈值 3
node_disk_pressure bool 否 是否检测节点磁盘压力状态 false
api_server_latency_ms int 否 API Server 响应延迟告警阈值(毫秒) 500
etcd_db_size_mb int 否 etcd 数据库大小告警阈值(MB) 100
校准建议:阈值不应一次性设置到位。建议先运行一次无压测的“基线巡检”,记录集群空闲时的指标值,然后在此基础上上浮 30%~50% 作为初始阈值。

4.5 配置文件结构关系图

下图展示了 YAML 配置文件中三个模块之间的数据流向与依赖关系:

YAML 配置文件模块关系图 cluster kubeconfig context / namespace stress replicas / duration cpu_limit / memory_limit inspection interval / thresholds cpu / memory / etcd 连接上下文 触发巡检 压测巡检脚本执行器 读取 YAML → 连接集群 → 执行压测 → 持续巡检 巡检报告 / 告警 / 日志 YAML 配置 热加载 / 版本管理

4.6 参数调试与校验流程

在将配置文件投入正式压测前,建议按以下步骤进行调试与校验:

  1. 语法校验:使用 python -c "import yaml; yaml.safe_load(open('config.yaml'))" 检查 YAML 格式是否正确。
  2. 字段完整性检查:脚本启动时自动校验必填字段是否存在,缺失时打印错误并退出。
  3. 集群连通性测试:脚本先执行 kubectl cluster-info 验证 cluster 模块配置是否有效。
  4. 压测参数合理性检查:例如 replicas 不能为 0,duration 不能小于 30 秒。
  5. 阈值范围检查:百分比阈值应在 0~100 之间,延迟阈值应为正数。
调试脚本片段示例:
import yaml
import sys

def validate_config(path):
    with open(path, 'r') as f:
        config = yaml.safe_load(f)
    
    required = ['cluster', 'stress', 'inspection']
    for key in required:
        if key not in config:
            raise ValueError(f"缺少顶级字段: {key}")
    
    # 校验 cluster 必填字段
    cluster = config['cluster']
    if 'name' not in cluster or 'namespace' not in cluster:
        raise ValueError("cluster 模块缺少 name 或 namespace")
    
    # 校验 stress 必填字段
    stress = config['stress']
    if 'mode' not in stress or 'replicas' not in stress or 'duration' not in stress:
        raise ValueError("stress 模块缺少 mode/replicas/duration")
    
    print("配置文件校验通过")
    return config

if __name__ == "__main__":
    validate_config(sys.argv[1])

4.7 多环境配置管理建议

在实际 SRE 工作中,通常需要管理开发、测试、预发、生产等多套环境的配置。推荐以下管理策略:

  • 环境变量覆盖:YAML 中支持 ${ENV_VAR} 占位符,脚本在加载时自动替换。例如 namespace: "stress-${ENV}"。
  • 配置分层:将公共参数放在 base.yaml,环境差异参数放在 dev.yaml / prod.yaml,脚本启动时合并。
  • 版本控制:所有 YAML 配置文件纳入 Git 仓库,每次修改附带变更记录。
  • 配置热加载:巡检脚本支持 SIGHUP 信号重新加载配置文件,无需重启进程即可调整阈值。
最佳实践:生产环境的巡检阈值建议比开发环境严格 10%~20%。例如开发环境 CPU 阈值设为 85%,生产环境设为 75%,提前发现资源瓶颈。