3. 节点池配置模型
节点池(Node Pool)是集群中一组具有相同配置的工作节点集合。在云原生环境中,节点池抽象了底层 IaaS 资源的创建、扩缩容与配置管理,是 OPA 策略实施合规巡检的核心对象。理解节点池的定义与常见配置项,是编写精准 Rego 约束的前提。
3.1 节点池定义与核心属性
节点池通常包含以下核心属性,这些属性直接决定了工作负载的运行环境与资源边界:
| 属性类别 | 属性名称 | 说明 | 合规关注点 |
|---|---|---|---|
| 标识 | 名称 / ID | 节点池的唯一标识 | 命名规范、环境标签 |
| 计算 | 实例规格 | CPU、内存、GPU 等资源配比 | 是否允许高规格、成本控制 |
| 调度 | 标签 (Labels) | 用于 Pod 调度匹配的键值对 | 是否包含强制合规标签 |
| 调度 | 污点 (Taints) | 阻止不容忍的 Pod 调度到该节点 | 是否误用关键污点 |
| 弹性 | 自动伸缩 | 根据负载自动调整节点数量 | 伸缩范围、冷却时间 |
| 存储 | 系统盘 | 操作系统与系统日志存储 | 磁盘类型、大小、加密 |
| 存储 | 数据盘 | 容器运行时、镜像、持久化数据 | 磁盘类型、挂载路径、加密 |
巡检视角:OPA 策略通常以节点池的
spec 或 template 字段作为 input 对象。在 Rego 中,input.spec.instanceType、input.spec.labels、input.spec.taints 是常见的访问路径。
3.2 常见配置项详解
3.2.1 实例规格
实例规格决定了节点的计算能力。合规策略通常关注:
- 规格白名单/黑名单:是否允许使用 GPU 实例、裸金属实例或特定系列(如 ecs.g7.2xlarge)。
- 资源配额:CPU 与内存的比例是否合理,防止资源碎片。
- 架构一致性:同一节点池内是否混用不同架构(如 x86 与 ARM)。
3.2.2 标签与污点
标签用于标识节点属性,污点用于控制 Pod 调度。合规策略需检查:
- 强制标签:如
environment: production、team: platform是否存在。 - 标签值约束:值是否符合正则表达式(如只允许小写字母与连字符)。
- 污点误用:是否设置了
node.kubernetes.io/unschedulable等关键污点导致节点不可用。 - 污点效果:是否只允许
NoSchedule,禁止NoExecute用于非系统节点。
3.2.3 自动伸缩
自动伸缩配置决定了集群的弹性能力与成本风险:
- 最小/最大节点数:防止缩容到 0 导致关键服务不可用,或扩容过大产生巨额费用。
- 伸缩策略:是否启用按量付费与 Spot 实例混合策略。
- 冷却时间:防止频繁伸缩导致震荡。
3.2.4 系统盘与数据盘
磁盘配置直接影响节点稳定性与数据安全:
- 系统盘:通常建议最小 40GB,类型为 SSD(如 cloud_ssd 或 cloud_essd)。
- 数据盘:用于容器运行时(如 Docker/containerd)与镜像存储,建议挂载到
/var/lib/containerd或/var/lib/docker。 - 加密:是否启用云盘加密(如使用 KMS 密钥)。
- 快照策略:是否配置自动快照以支持数据恢复。
常见合规风险:数据盘未挂载或挂载路径错误会导致容器运行时写满系统盘,引发节点故障。OPA 策略应强制检查
dataDisks 列表是否包含指定挂载点。
3.3 节点池配置模型关系图
下图展示了节点池配置模型的核心组件及其关联关系,帮助理解 OPA 策略的覆盖范围:
3.4 节点池配置的 Rego 策略示例
以下是一个简单的 Rego 策略片段,用于检查节点池是否配置了强制标签 environment 且数据盘挂载路径正确:
package node_pool_compliance
# 检查是否包含强制标签
deny[msg] {
input.spec.labels.environment == ""
msg := "节点池必须包含 environment 标签"
}
# 检查数据盘挂载路径
deny[msg] {
data_disk := input.spec.dataDisks[_]
data_disk.mountPath != "/var/lib/containerd"
msg := sprintf("数据盘挂载路径应为 /var/lib/containerd,当前为 %v", [data_disk.mountPath])
}
# 检查实例规格是否在白名单内
allowed_instance_types := {"ecs.g7.2xlarge", "ecs.g7.4xlarge", "ecs.r7.2xlarge"}
deny[msg] {
not allowed_instance_types[input.spec.instanceType]
msg := sprintf("实例规格 %v 不在允许列表中", [input.spec.instanceType])
}
策略要点:
- 使用
input.spec访问节点池配置。 - 使用
_遍历数组,检查所有数据盘。 - 使用
sprintf动态生成错误消息,便于审计定位。
3.5 配置项合规巡检清单
下表总结了节点池各配置项的合规巡检要点,可直接用于编写 OPA 策略:
| 配置项 | 巡检要点 | 合规条件 | 违规示例 |
|---|---|---|---|
| 实例规格 | 白名单、成本控制 | 规格在允许列表中 | ecs.g7.8xlarge 未在白名单 |
| 标签 | 强制标签、值格式 | environment 存在且值匹配 | environment 缺失或值为空 |
| 污点 | 关键污点、效果限制 | 未设置 node.kubernetes.io/unschedulable | 误设关键污点导致节点不可调度 |
| 自动伸缩 | 范围、策略 | 最小节点数 >= 1,最大节点数 <= 100 | 最小节点数为 0 |
| 系统盘 | 类型、大小、加密 | 类型为 cloud_essd,大小 >= 40GB | 系统盘类型为 cloud_efficiency |
| 数据盘 | 挂载路径、加密 | 挂载路径为 /var/lib/containerd | 挂载路径为 /data |
通过上述模型与策略示例,可以系统化地对节点池配置进行合规巡检与审计,确保集群基础设施符合企业安全与运维标准。