3. Kubernetes平台交付对象解析

用 Terraform 交付 Kubernetes 平台,本质上不是“装一个集群”,而是把一整套可被声明、可被版本化、可被复现的对象集合交给平台使用者。如果只把 Terraform 当成创建集群的工具,后续的命名空间、工作负载、网络策略、存储类和权限绑定就会散落在 kubectl、Helm 和手工脚本里,平台交付物失去统一入口。因此,本节先把交付对象按“基础设施层—集群层—平台服务层—租户层”梳理清楚,再说明每类对象在 Terraform 中由谁负责、以什么资源表达、交付后如何被验证。

一、交付对象的分层模型

Kubernetes 平台交付物可以按依赖方向分为四层。下层是上层的前提,上层是下层的消费方:

  • 基础设施层:VPC/子网、安全组、负载均衡、IAM 角色、镜像仓库、密钥管理服务。它们由云厂商 Provider 管理,是集群能创建和拉取镜像的前提。
  • 集群层:控制面、节点池、节点标签与污点、集群版本、网络插件(CNI)、集群访问入口。这一层决定“集群长什么样、有多少算力、谁能连进来”。
  • 平台服务层:命名空间、ResourceQuota、LimitRange、StorageClass、IngressClass、NetworkPolicy、ServiceAccount、RBAC 角色与绑定、CRD 与 Operator。这一层决定“平台提供哪些能力、以什么约束提供”。
  • 租户层:业务工作负载(Deployment、StatefulSet、Job、CronJob)、Service、Ingress、PVC、ConfigMap、Secret、HPA。这一层通常由业务团队维护,但平台必须为其准备好命名空间、配额、存储类和权限边界。

分层的关键判断是:越靠下的对象越应该由平台团队用 Terraform 固化,越靠上的对象越应该通过 GitOps 或应用流水线交付。Terraform 负责“把地基和规则建好”,而不是替业务团队发布每一次镜像更新。

Kubernetes 平台交付对象分层与 Terraform 职责边界 ① 基础设施层(云 Provider) VPC / 子网 安全组 负载均衡 IAM 角色 镜像仓库 KMS 密钥管理 ② 集群层(集群 Provider / Helm) 控制面 / 版本 节点池 + 标签/污点 CNI 网络插件 集群访问入口 节点自动扩缩 ③ 平台服务层(Kubernetes Provider) 命名空间 Quota / LimitRange StorageClass PV 动态供给 IngressClass 入口控制器 NetworkPolicy 默认拒绝 RBAC Role / Binding CRD / Operator ④ 租户层(业务 GitOps / 应用流水线) Deployment / StatefulSet Service / Ingress PVC / ConfigMap Secret / HPA Job / CronJob / 自定义资源

二、集群与节点池:算力交付的两种粒度

集群对象在 Terraform 中通常由云厂商的集群资源表达,例如 AWS 的 aws_eks_cluster、阿里云的 alicloud_cs_managed_kubernetes。它负责控制面版本、API Server 访问端点、集群日志、加密配置和集群 IAM 角色。集群本身不承载业务 Pod,真正承载业务的是节点池。

节点池是“同类节点的集合”,交付时要明确四组参数:

  • 规格与数量:实例类型、最小/最大/期望节点数、磁盘类型与容量。
  • 调度属性:节点标签(如 workload=general、gpu=true)和污点(如 dedicated=gpu:NoSchedule),用于把不同工作负载引导到不同节点池。
  • 网络与安全:所属子网、安全组、是否分配公网 IP。
  • 升级策略:最大不可用节点数、最大额外节点数、是否自动修复。

一个常见的交付约定是:通用节点池承载无状态服务,内存优化节点池承载缓存与中间件,GPU 节点池只允许带对应容忍度的 Pod 调度。这样后续做容量规划和成本归因时,可以直接按节点池标签聚合。

三、命名空间与配额:租户边界的第一道闸门

命名空间是平台向业务团队交付的“逻辑租户单元”。在 Terraform 中,它通常由 kubernetes_namespace 创建,并配套交付三类对象:

  • ResourceQuota:限制命名空间内可申请的 CPU、内存、Pod 数量、PVC 数量和 LoadBalancer 数量。例如 requests.cpu: "20"、requests.memory: 40Gi、pods: "80"。
  • LimitRange:为未显式声明资源的容器设置默认 requests/limits,避免单个 Pod 无限制占用节点资源。
  • 标签与注解:如 tenant=payment、cost-center=cc-1024、env=prod,用于策略匹配、成本分摊和审计。

配额值不是拍脑袋定的。可以先按“命名空间峰值 CPU 请求 × 1.3 安全系数”估算,再结合节点池总可分配资源校验。例如通用节点池 6 台 8C16G 节点,扣除系统组件后单节点可分配约 6.5C、13Gi,总可分配约 39C、78Gi;若三个业务命名空间各申请 20C、40Gi,总和已超过节点池容量,说明配额之和必须小于等于节点池可分配总量,否则会出现 Pod 长期 Pending。

四、网络、存储与 RBAC:平台能力的三个支柱

网络交付物包括 CNI 插件、Service CIDR、Pod CIDR、IngressClass、NetworkPolicy 和 DNS 配置。其中 NetworkPolicy 建议按“默认拒绝、按需放行”交付:先创建拒绝所有入站流量的默认策略,再为每个命名空间开放必要的端口和来源命名空间。Terraform 中可用 kubernetes_network_policy 表达,策略的 pod_selector 与 namespace_selector 要和命名空间标签保持一致。

存储交付物的核心是 StorageClass。它要声明 provisioner、reclaimPolicy、volumeBindingMode 和允许的扩容行为。例如生产环境常用 reclaimPolicy: Retain 防止误删 PVC 导致数据丢失,volumeBindingMode: WaitForFirstConsumer 让卷在 Pod 调度后再创建,避免跨可用区绑定失败。StorageClass 还应设置 allowVolumeExpansion: true,为后续在线扩容留出空间。

RBAC 交付物包括 ServiceAccount、Role/ClusterRole、RoleBinding/ClusterRoleBinding。平台团队通常交付三类角色:集群管理员(ClusterRoleBinding 到运维组)、命名空间管理员(RoleBinding 到业务负责人)、只读观察者(Role 仅含 get/list/watch)。交付时要遵循最小权限原则,避免把 cluster-admin 直接绑定给业务团队。

五、交付物清单与验证方式

把上述对象整理成一份可核对的交付清单,有助于在 terraform apply 后逐项验证。下表给出一个示例结构,字段可根据实际平台调整:

层级交付物Terraform 资源示例验证方式
基础设施VPC、子网、安全组aws_vpc / aws_subnet控制台或 CLI 查询网段与路由
集群集群、节点池aws_eks_cluster / aws_eks_node_groupkubectl get nodes 查看就绪与标签
平台服务命名空间、Quota、LimitRangekubernetes_namespace / _resource_quotakubectl describe quota 查看已用/硬限制
平台服务StorageClass、IngressClasskubernetes_storage_class / _ingress_classkubectl get sc,ingressclass 查看默认标记
平台服务NetworkPolicy、RBACkubernetes_network_policy / _role_bindingkubectl auth can-i 验证权限
租户工作负载、Service、PVC由 GitOps 或应用流水线交付kubectl get deploy,svc,pvc 查看状态
验证顺序建议自下而上:先确认节点 Ready 且标签正确,再确认命名空间与配额生效,最后验证 StorageClass 能成功动态供给 PVC、NetworkPolicy 能按预期放行或拒绝流量。任何一层未通过,都不要继续向上交付。
常见误区是把命名空间、RBAC 和 NetworkPolicy 留给业务团队自行创建。这样会导致租户边界不一致、权限漂移和网络策略缺失。平台团队应至少把命名空间、配额、默认网络策略和基础 RBAC 作为 Terraform 交付物固化下来。