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。