一、云原生时代的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的配置细节体现了三个设计考量:

  1. 通过注解自动管理ALB生命周期
  2. 采用IP模式直连Pod提升性能
  3. 自动关联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()

关键安全实践:

  1. 使用Secrets Manager动态获取凭证
  2. SSL强制加密传输
  3. 通过安全组限制数据库访问源
  4. 利用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));
    }
}

在日志归档项目中,我们通过两种模式优化存储:

  1. 小文件合并上传:将多个日志文件打包为tar后上传,减少请求次数
  2. 预签名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 关键注意事项

  1. 节点组优化:采用多种实例类型混合部署提升可用性
  2. 监控体系:CloudWatch容器洞察+Prometheus的立体监控
  3. 成本控制:Reserved Instance与Spot实例的智能配比
  4. 安全加固:Pod安全策略与网络策略的双重防护

五、未来演进方向

随着Proton服务的成熟,EKS正在向"基础设施即代码"的更高层次演进。在最近参与的Serverless容器化项目中,我们通过App Runner与EKS的联动,实现了传统应用与云原生架构的平滑过渡。