
搭一个EKS集群20分钟就够,但把它跑稳、跑安全、跑省钱,那可就是另一回事了。Demo上跑通和扛住双十一流量之间,隔着安全加固、智能弹性伸缩、成本管控和版本升级这些硬活儿。
这篇聊聊EKS生产环境该做的那些事:安全策略怎么配、Karpenter怎么调、成本怎么砍、二次运营怎么搞。
┌─────────────────────────────────────────────────────────────────┐
│ AWS 负责(控制平面) │
│ • Kubernetes API server、etcd、调度器、控制器管理器 │
│ • 控制平面3可用区高可用 │
│ • 控制平面打补丁和可用性保障 │
├─────────────────────────────────────────────────────────────────┤
│ 你负责(数据平面 + 配置) │
│ • 工作节点(或者用 EKS Auto Mode / Fargate) │
│ • Pod安全、网络策略、RBAC权限控制 │
│ • 密钥管理、镜像扫描 │
│ • 插件管理、版本升级、成本优化 │
└─────────────────────────────────────────────────────────────────┘
默认拒绝 → 按角色授予具体权限 ├── 开发人员:只能读写自己命名空间的 Pod 和日志
├── CI/CD:只能部署到特定命名空间
├── 平台团队:cluster-admin(限少数人)
└── 应用服务:用最小权限的 ServiceAccount(IRSA)
IRSA(IAM Roles for Service Accounts,服务账号的IAM角色): 把Kubernetes的ServiceAccount映射到IAM角色,Pod获取AWS权限时不需要节点级别的凭证。
apiVersion: v1
kind: ServiceAccount
metadata: name: s3-reader annotations: eks.amazonaws.com/role-arn: arn:aws:iam::123456789:role/s3-read-role
EKS Pod Identity(IRSA的升级版):关联方式更简单,不需要管理OIDC信任策略。
默认情况下,所有Pod之间可以互相通信。必须锁死:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata: name: default-deny-all namespace: production
spec: podSelector: {} policyTypes: - Ingress - Egress
然后按需显式放行需要的流量。用VPC CNI的网络策略功能或Cilium来执行。
# EKS集群开启KMS信封加密
encryptionConfig: - resources: ["secrets] provider: keyArn: arn:aws:kms:eu-west-1:123456789:key/xxx
强制执行Pod Security Admission(已废弃的PodSecurityPolicy的替代方案):
apiVersion: v1
kind: Namespace
metadata: name: production labels: pod-security.kubernetes.io/enforce: restricted pod-security.kubernetes.io/warn: restricted
restricted级别会禁止:特权容器、访问宿主命名空间、以root运行、权限提升。
:latest标签、必须设资源限制)开启所有控制平面日志类型 → CloudWatch:
api | audit | authenticator | controllerManager | scheduler
审计日志是安全取证的命根子——它记录了对集群的每一次API调用。
Karpenter已经取代Cluster Autoscaler成为生产环境标配。它根据实际Pod需求在秒级时间内调度合适规格的节点。
| 特性 | Cluster Autoscaler | Karpenter |
|---|---|---|
| 节点选择 | 固定的节点组 | 动态选择最优实例类型 |
| 扩容速度 | 分钟级 | 秒级 |
| 资源打包 | 有限 | 智能整合 |
| Spot处理 | 基础 | 高级(多样化、中断处理) |
| 实例灵活性 | 按节点组 | 任意满足约束的实例 |
apiVersion: karpenter.sh/v1
kind: NodePool
metadata: name: default
spec: template: spec: requirements: - key: karpenter.sh/capacity-type operator: In values: ["spot", "on-demand"] - key: kubernetes.io/arch operator: In values: ["arm64", "amd64"] # 兼容ARM64和x86 - key: karpenter.k8s.aws/instance-category operator: In values: ["c", "m", "r"] nodeClassRef: name: default disruption: consolidationPolicy: WhenEmptyOrUnderutilized consolidateAfter: 30s limits: cpu: 1000
EKS费用一不小心就上天。来看看怎么控:
| 手段 | 节省效果 |
|---|---|
| Karpenter整合 | 30-50%(打包减少浪费) |
| 无状态 workload 用 Spot | 比按需最高省90% |
| Graviton(arm64)节点 | 性价比提升20-40% |
| 基础负载用储蓄计划 | 稳态按需最高省72% |
| 正确设置Pod资源请求 | 避免节点过度配置 |
基础负载(可预期) → 按需 + 储蓄计划(承诺消费)
突发流量(波动大) → Spot实例(便宜、可中断)
关键系统Pod → 按需(绝对不能中断)
resources: requests: cpu: 250m # Pod实际需要的(从监控数据来) memory: 512Mi limits: memory: 512Mi # 防止OOM影响邻居 # 不设CPU limit — 让它突发(CPU是可以压缩的)
关键点:CPU/内存请求设太大,Karpenter就得调度更多或更大的节点。用VPA推荐值或监控数据来校准请求。
通过VPC终端节点路由AWS API流量(S3/DynamoDB的网关终端节点免费):
不用VPC终端节点:Pod → NAT网关($0.045/GB) → S3
用VPC终端节点: Pod → S3网关终端节点(免费) → S3
| 方案 | 适用场景 |
|---|---|
| AWS Load Balancer Controller | ALB(七层)或NLB(四层)入口 |
| Ingress(ALB) | HTTP/HTTPS路由、路径路由 |
| Gateway API | Ingress的现代替代(表达能力更强) |
| VPC Lattice | 跨集群服务网格,带IAM认证 |
不要默认就上服务网格。只有当你真的需要时才加Istio/Linkerd:
简单场景下,VPC Lattice或App Mesh就够了。
指标 → CloudWatch Container Insights + Prometheus(托管版)
日志 → Fluent Bit → CloudWatch Logs / OpenSearch
链路 → ADOT(OpenTelemetry) → X-Ray
仪表盘 → 托管Grafana
EKS支持的Kubernetes版本周期约14个月。得提前规划升级:
kubent或Pluto找出它们)EKS Auto Mode(正式发布)自动管理计算、弹性和升级:
适合用Auto Mode的场景:平台团队小、希望最小化Kubernetes运维开销。
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata: name: api-pdb
spec: minAvailable: 2 selector: matchLabels: app: api
保证节点排空或升级期间至少2个API Pod在运行。
安全
☐ 最小权限RBAC
☐ IRSA / Pod Identity(不用节点级AWS凭证)
☐ 每个命名空间默认拒绝网络策略
☐ 密钥加密(KMS信封或External Secrets)
☐ Pod安全标准(restricted)
☐ ECR镜像扫描 + 准入控制
☐ 控制平面审计日志已开启 计算
☐ Karpenter配置Spot + 按需 + Graviton
☐ SQS中断处理
☐ 已开启整合
☐ Pod资源请求设置合理 成本
☐ VPC终端节点(消除NAT费用)
☐ 基础负载用储蓄计划
☐ 无状态 workload 用 Spot 可观测性
☐ Container Insights + Prometheus
☐ 集中日志(Fluent Bit)
☐ 分布式链路追踪(ADOT) 韧性
☐ 多可用区节点分布
☐ Pod中断预算
☐ Velero备份
☐ 已验证升级路径 GitOps
☐ ArgoCD / Flux声明式部署
☐ 所有集群配置在Git管理
| 错误 | 后果 | 修复方法 |
|---|---|---|
| 不设置资源请求/限制 | 节点过度分配,OOM被杀 | 根据监控数据设请求值 |
| 所有流量走NAT网关 | 数据处理费用爆表 | S3/DynamoDB用VPC终端节点 |
| 没有网络策略 | 被入侵后横向移动 | 默认拒绝+显式放行 |
| 节点级IAM凭证 | Pod权限过大 | 用IRSA / Pod Identity |
| 还在用Cluster Autoscaler | 扩容慢、效率低 | 迁移到Karpenter |
| 没有PDB | 升级时业务中断 | 设置Pod中断预算 |
| 忽视版本支持窗口 | 被迫紧急升级 | 制定定期升级节奏 |
| etcd里的密钥没加密 | 泄露风险 | KMS信封加密 |
生产级EKS归结为七大支柱:
如果团队小、Kubernetes运维是负担,认真考虑EKS Auto Mode——它帮你搞定大部分计算、弹性和升级的复杂度,让你专心搞业务。