一、云原生时代的Kubernetes与AWS联姻
当Kubernetes遇到AWS EKS(Elastic Kubernetes Service),就像咖啡找到了最合适的奶泡比例。作为AWS的托管Kubernetes服务,EKS不仅解决了传统集群运维的痛点,更重要的是通过与AWS服务生态的无缝整合,让应用架构在保持云原生特性的同时获得AWS的超级能力。
我在某电商平台的日志分析系统改造中,亲历了从自建K8s迁移到EKS的过程。原有集群升级时总需要全员严阵以待,而EKS的控制平面自动维护让团队将精力真正聚焦在业务价值交付上。
二、EKS集群快速搭建实战
(Terraform技术栈)
# 创建基础VPC结构(terraform/main.tf)
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "3.14.2"
name = "eks-prod-vpc"
cidr = "10.10.0.0/16"
azs = ["ap-northeast-1a", "ap-northeast-1c"]
private_subnets = ["10.10.1.0/24", "10.10.2.0/24"]
public_subnets = ["10.10.101.0/24", "10.10.102.0/24"]
enable_nat_gateway = true
single_nat_gateway = true # 成本优化选择
enable_dns_hostnames = true
tags = {
Environment = "production"
KubernetesCluster = "eks-prod"
}
}
# EKS集群核心配置(terraform/eks.tf)
module "eks" {
source = "terraform-aws-modules/eks/aws"
version = "18.28.0"
cluster_name = "eks-prod"
cluster_version = "1.24"
vpc_id = module.vpc.vpc_id
subnet_ids = module.vpc.private_subnets
# 节点组配置(自动伸缩配置)
eks_managed_node_groups = {
general = {
desired_size = 2
max_size = 5
min_size = 1
instance_types = ["m5.large"]
capacity_type = "SPOT" # 采用Spot实例降低成本
labels = {
workload-type = "general"
}
}
}
# 关键插件配置
cluster_addons = {
coredns = {
resolve_conflicts = "OVERWRITE"
}
kube-proxy = {}
vpc-cni = {
resolve_conflicts = "OVERWRITE"
}
}
}
这个Terraform配置展示了完整的EKS集群创建过程。值得注意的是我们在VPC模块中采用NAT网关单实例模式,既保证私网节点的出网需求,又比多NAT方案节约70%网络成本。Spot实例的采用可以将计算成本降低60-90%,这在电商大促期间尤为重要。
三、AWS服务整合四大金刚
3.1 ALB负载均衡实战
# Ingress控制器部署(k8s/alb-ingress.yaml)
apiVersion: apps/v1
kind: Deployment
metadata:
name: alb-ingress-controller
namespace: kube-system
spec:
selector:
matchLabels:
app.kubernetes.io/name: alb-ingress-controller
template:
metadata:
labels:
app.kubernetes.io/name: alb-ingress-controller
spec:
serviceAccountName: alb-ingress-controller
containers:
- name: alb-ingress-controller
image: amazon/aws-alb-ingress-controller:v2.4.2
args:
- --cluster-name=eks-prod
- --aws-region=ap-northeast-1
- --aws-vpc-id=vpc-0abcdef123456789
resources:
limits:
cpu: 200m
memory: 400Mi
---
# Ingress资源配置示例(k8s/web-ingress.yaml)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: storefront
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:region:account:certificate/id
spec:
ingressClassName: alb
rules:
- host: store.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: storefront-service
port:
number: 80
ALB Ingress Controller的配置细节体现了三个设计考量:
- 通过注解自动管理ALB生命周期
- 采用IP模式直连Pod提升性能
- 自动关联ACM证书实现HTTPS
在线上环境,我们曾遇到ALB频繁变更导致的DNS缓存问题,通过设置alb.ingress.kubernetes.io/subnets
注解显式指定子网解决。
3.2 IAM角色细粒度控制
# IRSA配置示例(k8s/iam-role.yaml)
apiVersion: v1
kind: ServiceAccount
metadata:
name: s3-access-sa
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/S3ReadOnlyAccessRole
---
# Pod绑定ServiceAccount(k8s/pod.yaml)
apiVersion: v1
kind: Pod
metadata:
name: report-generator
spec:
serviceAccountName: s3-access-sa
containers:
- name: main
image: report-generator:v1.2
env:
- name: AWS_REGION
value: ap-northeast-1
IRSA(IAM Roles for Service Accounts)机制的精妙之处在于:
- 将IAM角色与K8s ServiceAccount绑定
- 自动注入WebIdentity Token
- 实现角色临时凭证的动态获取
实践中要注意STS凭证的有效期(默认1小时),对于长期任务需要设置适当的续期机制。
3.3 RDS数据库集成模式
# Python应用连接示例(app/db_connector.py)
import psycopg2
from aws_xray_sdk.core import xray_recorder
@xray_recorder.capture('db_query')
def query_orders():
conn = psycopg2.connect(
host=os.getenv("DB_HOST"),
dbname=os.getenv("DB_NAME"),
user=os.getenv("DB_USER"),
password=os.getenv("DB_PASSWORD"),
sslmode='verify-full',
sslrootcert='/etc/ssl/certs/rds-ca-2019-root.pem'
)
with conn.cursor() as cur:
cur.execute("SELECT * FROM orders WHERE status='pending'")
return cur.fetchall()
关键安全实践:
- 使用Secrets Manager动态获取凭证
- SSL强制加密传输
- 通过安全组限制数据库访问源
- 利用X-Ray进行SQL追踪
我们在实际运维中发现,启用RDS Proxy可以显著提升数据库连接稳定性,特别是在Kubernetes滚动更新时,避免了传统连接池的雪崩效应。
3.4 S3存储扩展方案
// Java客户端直传示例(src/main/java/S3Uploader.java)
public class S3Uploader {
private final S3Client s3Client;
public S3Uploader() {
this.s3Client = S3Client.builder()
.credentialsProvider(EnvironmentVariableCredentialsProvider.create())
.region(Region.AP_NORTHEAST_1)
.build();
}
public void uploadFile(String bucket, String key, File file) {
PutObjectRequest request = PutObjectRequest.builder()
.bucket(bucket)
.key(key)
.contentType("application/octet-stream")
.build();
s3Client.putObject(request, RequestBody.fromFile(file));
}
}
在日志归档项目中,我们通过两种模式优化存储:
- 小文件合并上传:将多个日志文件打包为tar后上传,减少请求次数
- 预签名URL直传:前端直接上传到S3,减少服务器带宽压力
四、深度技术解析
4.1 典型应用场景
- 全球化电商平台:借助EKS+Fargate实现跨区域负载均衡
- 实时数据处理:Kinesis与EKS Pod的无缝衔接
- AI训练任务:EFS持久化存储与Batch调度整合
某AI公司使用EKS运行训练任务时,通过Karpenter实现弹性计算资源调度,模型训练效率提升40%。
4.2 技术优缺点对比
优势:
- 控制平面免运维(99.95% SLA保障)
- VPC网络深度集成
- 服务发现与AWS生态无缝对接
挑战:
- CNI插件IP地址耗尽问题
- 跨账号访问的权限管理复杂度
- 混合云场景的网络延迟问题
4.3 关键注意事项
- 节点组优化:采用多种实例类型混合部署提升可用性
- 监控体系:CloudWatch容器洞察+Prometheus的立体监控
- 成本控制:Reserved Instance与Spot实例的智能配比
- 安全加固:Pod安全策略与网络策略的双重防护
五、未来演进方向
随着Proton服务的成熟,EKS正在向"基础设施即代码"的更高层次演进。在最近参与的Serverless容器化项目中,我们通过App Runner与EKS的联动,实现了传统应用与云原生架构的平滑过渡。