2. EKS集群创建实战

创建EKS集群不是“点一下按钮”就结束的动作,它同时决定了后续的网络边界、节点弹性方式、权限入口和本地访问体验。本节围绕两条主流创建路径展开:eksctl适合快速搭建与验证,Terraform适合把VPC、子网、IAM、EKS控制面和节点组纳入可版本化的基础设施代码。理解两者的分工,比记住命令本身更重要。

一、先规划VPC与子网,再谈集群

EKS控制面由AWS托管,但工作节点、Pod网络和负载均衡器都落在你的VPC里。因此创建集群前必须先确定VPC的CIDR与子网划分。一个常见且可用的示例规划是:VPC使用10.0.0.0/16,在三个可用区各划分一个公有子网和一个私有子网,公有子网承载面向公网的ALB/NAT网关,私有子网承载工作节点。示例子网可设计为:公有子网10.0.0.0/20、10.0.16.0/20、10.0.32.0/20;私有子网10.0.48.0/20、10.0.64.0/20、10.0.80.0/20。每个子网预留足够IP给Pod,因为EKS默认VPC CNI会为每个Pod分配一个VPC IP。

私有子网中的节点要拉取镜像、访问EKS API,需要NAT网关或VPC Endpoint。若希望减少NAT成本并提升私网访问安全性,可为ecr.api、ecr.dkr、s3(网关型)、eks、ec2等配置VPC Endpoint。子网必须打上正确的Kubernetes标签,否则EKS无法自动发现用于负载均衡的子网:公有子网打kubernetes.io/role/elb=1,私有子网打kubernetes.io/role/internal-elb=1,并统一打上kubernetes.io/cluster/<集群名>=shared。

EKS 网络与创建路径总览(示例:VPC 10.0.0.0/16) VPC 10.0.0.0/16 可用区 A 公有子网 10.0.0.0/20 elb=1 · NAT GW ALB 入口 私有子网 10.0.48.0/20 internal-elb=1 工作节点 / Pod IP VPC Endpoint 可用区 B 公有子网 10.0.16.0/20 elb=1 · NAT GW ALB 入口 私有子网 10.0.64.0/20 internal-elb=1 工作节点 / Pod IP VPC Endpoint 可用区 C 公有子网 10.0.32.0/20 elb=1 · NAT GW ALB 入口 私有子网 10.0.80.0/20 internal-elb=1 工作节点 / Pod IP VPC Endpoint EKS 控制面(AWS 托管) API Server · etcd · 多 AZ 高可用 路径 A:eksctl create cluster 快速验证 · 自动建 VPC/节点组 路径 B:Terraform 模块化创建 可版本化 · VPC/EKS/节点组统一管理

二、eksctl:最快得到可用集群

eksctl用一条命令即可创建VPC、EKS控制面和托管节点组。示例命令如下:

eksctl create cluster \
  --name demo-eks \
  --region ap-southeast-1 \
  --version 1.29 \
  --vpc-cidr 10.0.0.0/16 \
  --nodegroup-name ng-general \
  --node-type t3.medium \
  --nodes 2 --nodes-min 2 --nodes-max 4 \
  --managed \
  --with-oidc \
  --ssh-access --ssh-public-key my-key \
  --alb-ingress-access

执行后eksctl会依次创建CloudFormation栈:VPC与子网、EKS控制面、节点组、OIDC提供商。完成后自动把kubeconfig写入~/.kube/config。可用kubectl get nodes确认节点为Ready,用kubectl get pods -n kube-system确认aws-node、kube-proxy、coredns均运行。若节点长时间NotReady,优先检查私有子网路由表是否指向NAT网关,以及节点安全组是否允许与控制面通信。

三、Terraform:把集群变成可复现的基础设施

Terraform路径通常拆成三层:VPC模块、EKS模块、节点组模块。核心资源包括aws_vpc、aws_subnet、aws_internet_gateway、aws_nat_gateway、aws_route_table、aws_eks_cluster、aws_iam_role、aws_eks_node_group。控制面需要AmazonEKSClusterPolicy,节点需要AmazonEKSWorkerNodePolicy、AmazonEKS_CNI_Policy、AmazonEC2ContainerRegistryReadOnly。示例片段:

resource "aws_eks_cluster" "main" {
  name     = "demo-eks"
  role_arn = aws_iam_role.cluster.arn
  version  = "1.29"

  vpc_config {
    subnet_ids              = concat(aws_subnet.private[*].id, aws_subnet.public[*].id)
    endpoint_private_access = true
    endpoint_public_access  = true
  }
}

resource "aws_eks_node_group" "general" {
  cluster_name    = aws_eks_cluster.main.name
  node_group_name = "ng-general"
  node_role_arn   = aws_iam_role.node.arn
  subnet_ids      = aws_subnet.private[*].id
  instance_types  = ["t3.medium"]

  scaling_config {
    desired_size = 2
    min_size     = 2
    max_size     = 4
  }
}

执行terraform init && terraform plan && terraform apply后,用aws eks update-kubeconfig --name demo-eks --region ap-southeast-1写入kubeconfig。Terraform的优势在于:VPC、子网、IAM、EKS、节点组都在同一状态文件中,变更可审查、可回滚。

四、节点组类型怎么选

EKS节点组主要有三类:托管节点组由AWS负责节点生命周期与AMI更新,适合大多数生产工作负载;自管理节点组用EC2 Auto Scaling组自行管理,灵活但运维成本高;Fargate无需管理节点,按Pod计费,适合批处理、无状态且对启动延迟不敏感的任务。选择时可参考:需要GPU、DaemonSet、本地盘或特殊内核参数时选托管或自管理节点组;只想运行无状态容器且不想管节点时选Fargate。示例中t3.medium适合教学验证,生产建议按CPU/内存画像选择m6i.large或c6i.xlarge,并配合Cluster Autoscaler或Karpenter实现弹性。

五、集群访问入口与kubeconfig管理

EKS的访问入口有两层:一是控制面API端点,二是集群内的认证授权。控制面可配置endpoint_public_access与endpoint_private_access;生产建议关闭公网或限制CIDR,仅允许堡垒机/VPN访问。认证方面,创建集群时若启用OIDC,可用IRSA为Pod分配IAM角色;集群访问条目(Access Entry)可把IAM角色映射为Kubernetes RBAC 用户或组,避免直接编辑aws-auth ConfigMap。

kubeconfig管理建议:用aws eks update-kubeconfig --name demo-eks --region ap-southeast-1 --alias demo写入带别名的上下文;多集群时用kubectl config get-contexts查看,用kubectl config use-context demo切换。不要把kubeconfig提交到Git;CI/CD中通过IAM Roles for Service Accounts或OIDC联合获取临时凭证。验证访问是否正常,可执行kubectl auth can-i list pods --namespace default,返回yes说明RBAC映射生效。

教学示例参数(VPC CIDR、子网、实例类型、节点数)仅用于演示规划方法,实际项目应结合可用区数量、Pod密度、成本与合规要求重新计算。
若使用私有子网且未配置NAT或VPC Endpoint,节点将无法拉取镜像或注册到控制面,表现为节点NotReady、Pod一直Pending。创建后务必检查路由表与Endpoint状态。