EKS 私有生产集群建设 Hands-on

验证:未记录
适用版本
未记录
验证范围
尚未登记验证记录。
本文缩写(英文全称与中文含义)
缩写 英文全称/名称 中文含义
API Application Programming Interface 应用程序编程接口
AWS Amazon Web Services 亚马逊云服务
AZ Availability Zone 可用区
CA Cluster Autoscaler 集群节点自动扩缩容器
CLI Command-Line Interface 命令行接口
CNI Container Network Interface 容器网络接口
CSI Container Storage Interface 容器存储接口
DNS Domain Name System 域名系统
EBS Elastic Block Store AWS 块存储服务
ECR Elastic Container Registry AWS 容器镜像仓库
EKS Elastic Kubernetes Service AWS 托管 Kubernetes 服务
ENI Elastic Network Interface AWS 弹性网络接口
IAM Identity and Access Management 身份与访问管理
ID Identifier 标识符
IP Internet Protocol 网际协议;IP 地址是网络寻址标识
LB Load Balancer 负载均衡器
NAT Network Address Translation 网络地址转换
RBAC Role-Based Access Control 基于角色的访问控制
S3 Simple Storage Service AWS 对象存储服务
SSM AWS Systems Manager AWS 系统管理服务;SSM 是沿用的简称
SSO Single Sign-On 单点登录
STS Security Token Service 安全令牌服务,用于签发或交换短期凭据
VPC Virtual Private Cloud 虚拟私有云网络
VPN Virtual Private Network 虚拟专用网络

前置:Kubernetes 实践约定、独立预生产 AWS 账户、AWS CLI/eksctl/kubectl、SSO 平台角色。本文创建新集群,不接管已有资源。

1. 网络、权限和版本输入#

已有 VPC 启用 DNS resolution/hostnames,三个 AZ 的私有子网;管理 runner 通过 VPN/SSM/互联进入 VPC,能访问 EKS API、私有 Kubernetes endpoint、ECR/STS/S3。本文保留受控 NAT 出口;完全无公网出口还需逐项建立 VPC endpoints,不能只关 NAT。

export AWS_REGION='REPLACE_REGION'
export CLUSTER='orders-staging'
export K8S_VERSION='1.REPLACE'
export PLATFORM_ROLE_ARN='arn:aws:iam::REPLACE_ACCOUNT:role/PlatformAdmin'
export SUBNET_A='subnet-REPLACE_A'
export SUBNET_B='subnet-REPLACE_B'
export SUBNET_C='subnet-REPLACE_C'
aws sts get-caller-identity
aws eks describe-cluster-versions --region "$AWS_REGION"
aws ec2 describe-subnets --subnet-ids "$SUBNET_A" "$SUBNET_B" "$SUBNET_C" --query 'Subnets[].{AZ:AvailabilityZone,CIDR:CidrBlock,Free:AvailableIpAddressCount,VPC:VpcId}'

先设置三项 subnet 环境变量为实际 ID。核对 Pod 密度、升级 surge、LB 和 VPC CNI ENI 的 IP 余量;私有 LB 子网按控制器要求打标签。平台角色需建集群/节点组、CloudFormation、受限 IAM/PassRole 权限;CloudFormation bootstrap 权限和日常 kubectl 权限分开。

2. 创建配置#

保存 eks-cluster.yaml,替换所有 REPLACE。系统节点与业务节点用标签和 nodeSelector 区分;本例系统池不加 taint,避免初始插件无 toleration 卡死。

apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
  name: orders-staging
  region: REPLACE_REGION
  version: '1.REPLACE'
vpc:
  id: vpc-REPLACE
  subnets:
    private:
      REPLACE_AZ_A: {id: subnet-REPLACE_A}
      REPLACE_AZ_B: {id: subnet-REPLACE_B}
      REPLACE_AZ_C: {id: subnet-REPLACE_C}
  clusterEndpoints: {publicAccess: false, privateAccess: true}
iam:
  withOIDC: true
accessConfig:
  authenticationMode: API
  bootstrapClusterCreatorAdminPermissions: false
  accessEntries:
    - principalARN: arn:aws:iam::REPLACE_ACCOUNT:role/PlatformAdmin
      accessPolicies:
        - policyARN: arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy
          accessScope: {type: cluster}
cloudWatch:
  clusterLogging:
    enableTypes: ['*']
    logRetentionInDays: 30
managedNodeGroups:
  - name: system
    instanceType: m6i.large
    privateNetworking: true
    minSize: 3
    desiredCapacity: 3
    maxSize: 6
    volumeSize: 80
    volumeEncrypted: true
    disableIMDSv1: true
    labels: {pool: system}
  - name: application
    instanceType: m6i.xlarge
    privateNetworking: true
    minSize: 3
    desiredCapacity: 3
    maxSize: 9
    volumeSize: 100
    volumeEncrypted: true
    disableIMDSv1: true
    labels: {pool: application}

角色需预先存在且 trust 已限制到企业 SSO;这是专用平台管理角色,不是所有开发者。IMDSv2 不等于 Pod 无法取得节点凭据,节点 metadata 访问和最小权限还需单独控制。实例型需该 region 有售且配额足够。

执行创建的 CLI 会话应使用配置里的 PlatformAdmin 角色;已关闭 creator 自动授权,若用其他角色引导,可能在需要 Kubernetes API 的阶段被拒绝。先确认 STS 返回的 assumed-role 对应此角色,并测试其应急登录路径。

eksctl create cluster --config-file eks-cluster.yaml --dry-run > eks-resolved.yaml
# 审阅解析结果、IAM、子网和费用后,在私网 runner 创建。
eksctl create cluster --config-file eks-cluster.yaml
aws eks update-kubeconfig --name "$CLUSTER" --region "$AWS_REGION"
kubectl get nodes -L pool,topology.kubernetes.io/zone
kubectl get --raw='/readyz?verbose'

这里沿用当前 PlatformAdmin 短期会话,不再要求它 AssumeRole 自己;从其他身份访问时才按已配置的信任策略使用 --role-arn。dry-run 不会证明 IAM、配额和网络可用。三 AZ 的节点分布需实际检查;不能把一个跨 AZ 节点组的期望数当作每区保证。

3. 插件与业务#

aws eks list-addons --cluster-name "$CLUSTER"
kubectl -n kube-system get ds,deploy
aws eks describe-cluster --name "$CLUSTER" --query 'cluster.{access:accessConfig,endpoint:resourcesVpcConfig,logs:logging}'

查询现有插件所有者后,为 VPC CNI/CoreDNS/kube-proxy 选与版本匹配的托管插件;不要强制覆盖现有配置。组件 IAM 按 独立身份设置,云磁盘按 EBS CSI安装;新集群业务先落 On-Demand,之后再接 Karpenter 或 CA。

依次完成 RBAC→业务基线→入口→可观测。API/worker 的 nodeSelector 指向 application,系统插件明确放置系统池。保存最终插件版本、IAM、完整配置到平台仓库。

4. 验收与恢复#

  • 外网不能直连 Kubernetes endpoint,私网 runner 和应急入口可以;企业只读用户不能读 Secret/改 Deployment。
  • API audit 日志可查,保留期和敏感字段访问权限符合组织要求。
  • 逐 AZ 验证剩余容量能承接故障,单节点排空通过;跨 AZ 磁盘能力按 StorageClass 验证。
  • 外部备份完成并恢复到第二集群,业务数据对账通过;CloudFormation 成功不是业务验收。

创建失败先看对应 CloudFormation events 和 eksctl 日志;保留失败栈定位 IAM/路由/配额,不手工删除不明 ENI。退役顺序:迁流量/数据→清理 Kubernetes LB/卷等外部资源→保留备份→审核后 eksctl delete cluster --config-file eks-cluster.yaml。

参考:eksctl 私有访问、Access entries、EKS 建设。

搜索文档

输入关键词,搜索所有文档。

↑ ↓ 选择 · Enter 打开 · Esc 关闭