容器云平台
-
date_range 23/01/2020 12:16
点击量:次infosort网随云动label
P8 面试碰到”你怎么搭 CI 流水线”时,可以用这套结构答:
“我喜欢把构建流水线拆成三个层级:
Layer 1 构建环境:做出一个稳定的 builder 镜像(toolchain 镜像),保证所有人本地和 CI 用同一个编译环境; Layer 2 冒烟验证:挑一个最核心、依赖最全的组件先编,验证工具链通——失败立刻终止,不浪费后续 30 分钟; Layer 3 全量构建:冒烟通过后,并行编所有组件、打镜像、推 Registry。
TKEStack 的 hack/local-ci.sh 就是这种结构的典型实现——builder → smoke → image 三步,failfast + 隔离环境两个特征都做到了。”
二、为什么是 100 MB(不是几 MB) 100MB 对 Go 二进制来说算大但合理,因为 TKEStack 把整个 K8s + Helm + Docker SDK 全装进去了: 单纯的 Go HTTP 服务 ~10 MB kubectl ~50 MB 你这个 tke-platform-api ~100 MB ← 你在这 kubelet ~120 MB 100MB 里大致拆分(粗略): 内容占比K8s client-go + apimachinery~25 MBHelm v3 SDK~15 MBcontainerd + Docker SDK~15 MBOpenTelemetry 链路追踪~10 MBetcd client + grpc~10 MB业务代码 + 其他依赖~25 MB
源码(Go/TS) │ │ ./hack/local-ci.sh image-builder ← Step 1 ✅(完成) ▼ tke-builder:local(工具箱镜像) │ │ ./hack/local-ci.sh smoke ← Step 2 ✅(刚刚完成) ▼ tke-platform-api 二进制(100MB) │ │ ./hack/local-ci.sh image … ← Step 3(下一步) ▼ tkestack/tke-platform-api-amd64:v1.9.2.dirty(可部署镜像) │ │ docker push / kubectl apply ← Step 4(部署到 K8s) ▼ 跑起来的 Pod
P8 面试谈”复杂项目的 CI 设计”时,你今天的经历完全可以当例子:
“我最近调试了一个国内 K8s 项目的本地 CI 流水线,它的设计很经典:
第一层:builder 镜像——基于 Ubuntu 22.04 装 Go/Node/Docker CLI,保证编译环境跨开发者一致; 第二层:冒烟编译——挑核心组件先编,failfast; 第三层:镜像打包——把二进制塞进运行时镜像。
核心工程实践有几个:CGO_ENABLED=0 静态编译(产物可拷贝到任何 Linux)、-ldflags -X 注入版本信息(运维定位时方便)、Docker volume 持久化 Go mod 缓存(CI 重复跑提速)。 国内落地的坑是 GOPROXY——proxy.golang.org 被墙,必须切到 goproxy.cn 或国内镜像,这也是我们交付国产化客户时常踩的坑。”
1.2 业务流程(Business Process,以”新建一个 K8s 集群”为例)用户在 Console → 填表 → 点”创建” → …回到 Console 看到”运行中” ↓ ↑ 提交意图(声明式) ← 观察结果(异步) └──────平台后台异步执行 5-20 分钟────────┘1.3 为什么必须拆 api 和 controller —— 业务约束推导设计这一对组件时面对4 个不可调和的业务事实: 创建集群是分钟~小时级的长任务:SSH 拉机器、跑 kubeadm、装 CNI、装 addon。 用户点完按钮要立即得到响应:HTTP 等不了 30 分钟。 失败必须可恢复、可重试:网络抖、机器卡住、磁盘满;任意一步失败要能从断点续。 同一时刻多个用户在多个集群上做多种操作:并发、隔离、限流。 结论:必须把”接单”和”做活”两个角色拆开——
tke-platform-api 当前台:1 毫秒级响应,只写 etcd,立刻返回 202。 tke-platform-controller 当后厨:异步消费、限速重试、状态机推进。 这本质是 CQRS(命令查询职责分离)+ 工作流引擎 的具象,但用 K8s informer/workqueue 实现。
API 不直接操作业务集群,但提供 /clusters/{name}/proxy 反向代理路径,让前端能透传调用业务集群 API。 业务规则 3:SRE 关心的”集群”和 K8s 关心的”集群”不是同一抽象。 → TKE 的 Cluster CR 在 K8s 之上加了一层语义:节点准入、证书、addon 套餐、纳管模式。这个抽象需要一个自己的 API,不能复用 kube-apiserver。所以 platform-api 本身就是一个 aggregated API server。
评论:
技术文章推送
手机、电脑实用软件分享
微信公众号:AndrewYG的算法世界