从 ECS 到 EKS:把“会部署”升级成“懂它为什么扛得住”
你已经走过“不懂容器 → ECS 企业级部署轻车熟路”。K8s 不是另一套命令,而是一套控制循环:你声明期望状态,一堆控制器不停地把现实拉向它。大企业扛巨量流量靠的,正是这些控制器在调度、网络、伸缩、发布上的精确配合。
这个站点本身就跑在 k8s-lab 这个 EKS 集群里——流量经过 Route 53 → ALB(由 AWS Load Balancer Controller 创建)→ Pod。你正在访问的这一页,由 Pod portal-67dcb77dd4-79fgz 提供。
你的 ECS 经验,在 EKS 里对应什么
| ECS 里你熟悉的 | EKS / K8s 里的对应 | 企业里真正的差异 |
|---|---|---|
| Task Definition | Pod spec(嵌在 Deployment 里) | requests/limits 决定调度和 QoS,不只是“分配多少” |
| ECS Service(desired count) | Deployment + ReplicaSet | 滚动策略、PDB、拓扑分布都要你自己声明 |
| Capacity Provider / ASG | Karpenter / Cluster Autoscaler | Karpenter 直接按 Pending Pod 的需求挑机型,秒级到分钟级出节点 |
| Service Auto Scaling | HPA / KEDA | 按 requests 的百分比算利用率;可按队列长度、QPS 伸缩 |
| ALB Target Group | Ingress / Service + AWS LB Controller | target-type: ip 直达 Pod,发布时要配合优雅下线 |
| Task Role | Pod Identity / IRSA(ServiceAccount ↔ IAM Role) | 还多一层 K8s RBAC:IAM 认证 ≠ 集群授权 |
| awsvpc 网络模式 | VPC CNI(Pod 拿 VPC 真实 IP) | 大集群最常见事故:子网 IP 耗尽、单节点 Pod 上限 |
| Service Connect / Cloud Map | Service + CoreDNS(+ 可选 Service Mesh) | CoreDNS 在高 QPS 下会成为瓶颈,需要 NodeLocal DNSCache |
| 部署 = 更新 Service | GitOps(Argo CD / Flux) | 集群从 Git 持续拉取并自动纠偏,几百个服务靠这个管 |
摸底测试
24 道场景题,8 个维度 × 3 个难度(L1 基础 / L2 实战 / L3 企业级)。不会就选最接近你直觉的,别查资料——测的是你现在的心智模型。提交后会显示解析,并生成你的个人学习路线。
学习路线
还没做摸底测试——下面是默认路线。做完测试后,每个阶段会标注 重点攻克 补基础 快速过。
毕业项目:在 k8s-lab 上把一个电商扛到 10 倍流量
用 AWS 官方的 retail-store-sample-app(见“真实项目”)完成:Argo CD 部署 → Karpenter + HPA 弹性 → k6 压测从 100 RPS 打到 1000+ RPS → 压测中滚动发布 零 5xx → 杀掉一个 AZ 的节点,服务不中断 → 用 Grafana 讲清楚每一秒发生了什么。能讲清楚这条链路,就是企业面试里“有 EKS 实战”的样子。
真实项目与真实事故
说实话:没有哪家大厂会公开它的生产集群配置。但下面这些是最接近真实企业的材料——官方维护的微服务应用、大厂公开的扩容复盘、以及真实的故障报告。企业级能力 = 在这些项目上亲手复现“流量打进来时每个组件在做什么”。
A. 动手部署的项目(按推荐顺序)
1. aws-containers/retail-store-sample-app 首选
AWS 官方的多语言电商(Java / Go / Node.js),UI、商品、购物车、订单、结算 5 个服务 + MySQL / DynamoDB / Redis / RabbitMQ。自带 Helm chart 和 Terraform,也是 EKS Workshop 的底座。为什么首选:它的依赖拓扑和真实电商一样,适合练 HPA、Karpenter、优雅下线、Pod Identity 访问 DynamoDB。
2. EKS Workshop 官方教程
AWS 容器团队维护,基于上面的电商应用,覆盖 Karpenter、VPC CNI 前缀委派、NetworkPolicy、可观测性、GitOps、安全。照着做,但每一步都问自己“这个控制器在做什么”。
3. GoogleCloudPlatform/microservices-demo(Online Boutique)
11 个 gRPC 服务 + 自带 Locust 压测器。适合练服务间调用链、超时与重试风暴、Service Mesh。云无关,在 EKS 上直接跑。
4. open-telemetry/opentelemetry-demo
CNCF 官方的可观测性演示,内置 feature flag 故障注入(让某个服务变慢 / 报错 / 内存泄漏)。练“出事时怎么在 5 分钟内定位到 Pod 和代码行”。
5. aws-ia/terraform-aws-eks-blueprints + EKS Best Practices Guide
企业平台团队怎么用 IaC 批量建集群、装 add-on、做多团队隔离。Best Practices Guide 是 AWS 写给大客户的 checklist(可靠性、安全、成本、网络、扩展到上千节点)。
B. 读大厂的扩容复盘(理解“巨量流量”到底卡在哪)
- OpenAI《Scaling Kubernetes to 7,500 nodes》:大集群里 etcd、API Server、DNS、监控各自怎么成为瓶颈。
- Kubernetes 官方案例库(kubernetes.io/case-studies):Spotify、Pinterest、Airbnb 等迁移到 K8s 的动机和收益。
- AWS re:Invent 容器分会场(YouTube 搜 “re:Invent EKS CON3” / “CON4”):大量客户讲 Karpenter、多集群、单集群上千节点的实践,400 级是深水区。
- KubeCon 演讲:搜 “at scale”、“lessons learned”、“postmortem”,选 300+ 浏览量的。
C. 读真实事故(这是最被低估的学习材料)
- Kubernetes Failure Stories(k8s.af):几十家公司的公开 K8s 事故复盘合集。CPU limit 节流、DNS 超时、OOM 连锁、Admission Webhook 拖垮集群……企业里踩的坑基本都在这里。
- 读法:每篇只回答三个问题——触发条件是什么?哪个控制器 / 组件放大了故障?在 k8s-lab 上能不能复现?能复现的,就写进你的实验笔记。
实验集群 k8s-lab
| 集群 | k8s-lab · EKS 1.37 · ap-southeast-2(悉尼) |
|---|---|
| 网络 | 默认 VPC 公有子网(为省钱不建 NAT 网关;企业里节点应放私有子网) |
| 节点 | 托管节点组 spot-general:t3a.medium / t3.medium / t3a.large Spot,2 台(0–4) |
| 已装组件 | VPC CNI · CoreDNS · kube-proxy · metrics-server · Pod Identity Agent · AWS Load Balancer Controller · ExternalDNS |
| 认证 | Access Entries(API 模式),Pod 用 Pod Identity 拿 IAM 权限 |
| 本站 | namespace portal:nginx Deployment ×2 + ConfigMap + Ingress(ALB + ACM 证书) |
连上集群
aws eks update-kubeconfig --name k8s-lab --region ap-southeast-2 kubectl get nodes -L topology.kubernetes.io/zone,node.kubernetes.io/instance-type,eks.amazonaws.com/capacityType kubectl -n portal get deploy,pod,svc,ingress -o wide
第一个练习:拆解你正在看的这个页面
# 1. 流量入口:ALB 是谁建的?看 Ingress 上的事件和注解 kubectl -n portal describe ingress portal # 2. DNS 是谁写的?看 ExternalDNS 的日志 kubectl -n kube-system logs deploy/external-dns --tail=20 # 3. ALB 直接打到 Pod IP(target-type: ip)——对比一下 kubectl -n portal get pod -o wide aws elbv2 describe-target-health --target-group-arn $(aws elbv2 describe-target-groups \ --query "TargetGroups[?contains(TargetGroupName,'portal')].TargetGroupArn" --output text) # 4. 删一个 Pod,刷新页面看“由 Pod xxx 提供”是否变化,ALB 目标如何变化 kubectl -n portal delete pod -l app=portal --wait=false | head -1
省钱开关
控制面 $0.10/小时(约 $73/月)不管有没有节点都收;Spot 节点约 $0.02/小时/台;ALB 约 $20/月。不学的时候把节点缩到 0(本站会暂时打不开):
# 暂停(节点缩到 0) eksctl scale nodegroup --cluster k8s-lab --name spot-general --nodes 0 # 恢复 eksctl scale nodegroup --cluster k8s-lab --name spot-general --nodes 2 # 彻底删除(先删 Ingress 让 ALB 被回收,再删集群) kubectl delete ingress -A --all && eksctl delete cluster -f cluster.yaml