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 负责“把地基和规则建好”,而不是替业务团队发布每一次镜像更新。
二、集群与节点池:算力交付的两种粒度
集群对象在 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_group | kubectl get nodes 查看就绪与标签 |
| 平台服务 | 命名空间、Quota、LimitRange | kubernetes_namespace / _resource_quota | kubectl describe quota 查看已用/硬限制 |
| 平台服务 | StorageClass、IngressClass | kubernetes_storage_class / _ingress_class | kubectl get sc,ingressclass 查看默认标记 |
| 平台服务 | NetworkPolicy、RBAC | kubernetes_network_policy / _role_binding | kubectl auth can-i 验证权限 |
| 租户 | 工作负载、Service、PVC | 由 GitOps 或应用流水线交付 | kubectl get deploy,svc,pvc 查看状态 |