☸ EKS 学习园地

从 ECS 到 EKS:把“会部署”升级成“懂它为什么扛得住”

你已经走过“不懂容器 → ECS 企业级部署轻车熟路”。K8s 不是另一套命令,而是一套控制循环:你声明期望状态,一堆控制器不停地把现实拉向它。大企业扛巨量流量靠的,正是这些控制器在调度、网络、伸缩、发布上的精确配合。

这个站点本身就跑在 k8s-lab 这个 EKS 集群里——流量经过 Route 53 → ALB(由 AWS Load Balancer Controller 创建)→ Pod。你正在访问的这一页,由 Pod portal-67dcb77dd4-79fgz 提供。

先做 15 分钟摸底测试 →

你的 ECS 经验,在 EKS 里对应什么

ECS 里你熟悉的EKS / K8s 里的对应企业里真正的差异
Task DefinitionPod spec(嵌在 Deployment 里)requests/limits 决定调度和 QoS,不只是“分配多少”
ECS Service(desired count)Deployment + ReplicaSet滚动策略、PDB、拓扑分布都要你自己声明
Capacity Provider / ASGKarpenter / Cluster AutoscalerKarpenter 直接按 Pending Pod 的需求挑机型,秒级到分钟级出节点
Service Auto ScalingHPA / KEDA按 requests 的百分比算利用率;可按队列长度、QPS 伸缩
ALB Target GroupIngress / Service + AWS LB Controllertarget-type: ip 直达 Pod,发布时要配合优雅下线
Task RolePod Identity / IRSA(ServiceAccount ↔ IAM Role)还多一层 K8s RBAC:IAM 认证 ≠ 集群授权
awsvpc 网络模式VPC CNI(Pod 拿 VPC 真实 IP)大集群最常见事故:子网 IP 耗尽、单节点 Pod 上限
Service Connect / Cloud MapService + CoreDNS(+ 可选 Service Mesh)CoreDNS 在高 QPS 下会成为瓶颈,需要 NodeLocal DNSCache
部署 = 更新 ServiceGitOps(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。

github.com/aws-containers/retail-store-sample-app

2. EKS Workshop 官方教程

AWS 容器团队维护,基于上面的电商应用,覆盖 Karpenter、VPC CNI 前缀委派、NetworkPolicy、可观测性、GitOps、安全。照着做,但每一步都问自己“这个控制器在做什么”。

eksworkshop.com

3. GoogleCloudPlatform/microservices-demo(Online Boutique)

11 个 gRPC 服务 + 自带 Locust 压测器。适合练服务间调用链、超时与重试风暴、Service Mesh。云无关,在 EKS 上直接跑。

github.com/GoogleCloudPlatform/microservices-demo

4. open-telemetry/opentelemetry-demo

CNCF 官方的可观测性演示,内置 feature flag 故障注入(让某个服务变慢 / 报错 / 内存泄漏)。练“出事时怎么在 5 分钟内定位到 Pod 和代码行”。

github.com/open-telemetry/opentelemetry-demo

5. aws-ia/terraform-aws-eks-blueprints + EKS Best Practices Guide

企业平台团队怎么用 IaC 批量建集群、装 add-on、做多团队隔离。Best Practices Guide 是 AWS 写给大客户的 checklist(可靠性、安全、成本、网络、扩展到上千节点)。

terraform-aws-eks-blueprints · EKS Best Practices Guide

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