使用 AWS CDK 构建隔离子网中的 EKS 私有集群(Java 示例)完整实战指南

发布时间:2026/10/15 21:15:09

使用 AWS CDK 构建隔离子网中的 EKS 私有集群(Java 示例)完整实战指南 【免费下载链接】aws-cdk-examplesExample projects using the AWS CDK项目地址https://gitcode.com/gh_mirrors/aw/aws-cdk-examples点击查看免费下载本指南基于 aws-cdk-examples 仓库中的 java/eks/private-cluster 示例深入讲解如何用 AWS CDKJava 语言在一座完全没有公网出口的 VPC 中搭建 EKS 私有集群VPC 只包含隔离子网Isolated Subnets不创建 Internet Gateway、NAT Gateway 或任何互联网代理集群通过一组 VPC Endpoints 私有访问 AWS 服务管理员借助 AWS Systems Manager Session Manager 免公网登录 EC2 实例并通过kubectl管理集群。读完本文你将掌握私有集群的整体架构设计、全部 VPC Endpoint 清单与作用、完整的 Java 源码实现要点、部署与验证步骤以及无互联网环境下安装 Docker、kubectl 等工具的可行方法。适用场景私有 EKS 集群Private EKS Cluster通常用于企业级部署或高合规监管环境例如金融、医疗、政府等对数据出境、公网暴露有严格要求的场景。这类环境的核心诉求是部署的工作负载不允许任何互联网连通性——Pod 不能访问公网公网也无法访问集群。示例中所有 EC2 实例都不具备公网 IP唯一的运维入口是通过 AWS Systems ManagerSSM的私有通道进行会话管理。整体架构与设计要点从 EksPrivateClusterStack.java 的构造逻辑看整个 Stack 由四个部分组成VPC仅含隔离子网无公网出口VPC Endpoints一组接口端点Interface Endpoint 一个网关端点Gateway Endpoint保证集群在无公网环境下仍能调用 AWS APIEKS 集群私有访问模式的托管集群外加一个自动扩缩组Auto Scaling Group承载工作节点kubectl 客户端实例一个位于隔离子网内的 BastionHostLinux 实例通过 SSM 访问用于执行kubectl命令。VPC只创建隔离子网createVpc() 方法给出了 VPC 的关键配置this.vpc Vpc.Builder.create(this, vpc) .ipAddresses(IpAddresses.cidr(10.0.0.0/16)) .maxAzs(2) .natGateways(0) // 不创建 NAT 网关 .subnetConfiguration( List.of( SubnetConfiguration.builder() .cidrMask(24) .name(isolated) .subnetType(SubnetType.PRIVATE_ISOLATED) // 仅隔离子网 .build())) .build();要点说明CIDR使用10.0.0.0/16作为 VPC 网段cidrMask(24)将每个子网切分为/24maxAzs(2)在两个可用区AZ中创建子网满足高可用要求同时控制端点和集群成本natGateways(0)显式关闭 NAT 网关配合不创建 Internet Gateway使 VPC 完全与公网隔绝子网类型仅配置PRIVATE_ISOLATED一种子网类型。隔离子网既没有到 Internet Gateway 的路由也没有 NAT 出口路由实例因此完全无法访问公网。测试类 EksPrivateClusterStackTest.java 中专门用两个断言来验证这一点Test public void testNoInternetGateway() { final Template template synthesizeTemplate(); template.resourceCountIs(AWS::EC2::InternetGateway, 0); } Test public void testNoNatGateway() { final Template template synthesizeTemplate(); template.resourceCountIs(AWS::EC2::NatGateway, 0); }resourceCountIs(..., 0)断言合成出的 CloudFormation 模板中InternetGateway 与 NatGateway 的资源数量均为 0从测试层面锁定了无公网出口这一核心设计。EKS 集群私有端点访问模式createEksCluster() 方法配置了集群本体this.cluster Cluster.Builder.create(this, eks) .vpc(vpc) .version(KubernetesVersion.V1_34) // Kubernetes 1.34 .vpcSubnets( List.of(SubnetSelection.builder().subnetType(SubnetType.PRIVATE_ISOLATED).build())) .endpointAccess(EndpointAccess.PRIVATE) // 私有端点访问 .clusterName(eks-private) .kubectlLayer(new KubectlV34Layer(this, KubectlLayer)) .defaultCapacity(0) // 默认节点池容量为 0 .mastersRole(clusterAdmin) // 集群管理员 IAM 角色 .placeClusterHandlerInVpc(true) // 集群自定义资源 Lambda 放入 VPC .clusterHandlerEnvironment(Map.of(AWS_STS_REGIONAL_ENDPOINTS, regional)) .kubectlEnvironment(Map.of(AWS_STS_REGIONAL_ENDPOINTS, regional)) .outputClusterName(true) .outputConfigCommand(true) .outputMastersRoleArn(true) .build();关键配置的含义endpointAccess(EndpointAccess.PRIVATE)集群 API Server 只暴露私有端点private endpoint不开放公网端点。测试用例testEksClusterEndpointAccess断言了对应的resourcesVpcConfig属性为endpointPublicAccess: false、endpointPrivateAccess: trueversion(KubernetesVersion.V1_34)使用 Kubernetes 1.34并配套cdk-lambda-layer-kubectl-v34依赖见 pom.xml 中的kubectl.version属性与KubectlV34Layer提供 kubectl Lambda LayerdefaultCapacity(0)不启用 CDK 默认的托管节点组而是由后续addNodes()手动添加基于 Auto Scaling Group 的工作节点mastersRole(clusterAdmin)将根账户角色的管理员角色加入aws-authConfigMap 的system:masters该角色在 Stack 中以AccountRootPrincipal被创建placeClusterHandlerInVpc(true)这是私有集群能否成功部署的关键。CDK 在创建 EKS 集群时依赖一组自定义资源Custom ResourceLambda 函数来监控集群生命周期如等待集群可用、配置 kubectl 等。默认情况下这些 Lambda 部署在 AWS 托管的公共 VPC 中无法访问隔离子网内的私有集群设置为true后集群处理器 Lambda 会被部署到本 VPC 的隔离子网中配合 VPC Endpoints 才能调用 EKS APIclusterHandlerEnvironment/kubectlEnvironment中的AWS_STS_REGIONAL_ENDPOINTSregional让 Lambda 内的 STS 调用使用区域化端点因为隔离环境中没有到全局端点所在区域的网络路径输出开关outputClusterName、outputConfigCommand、outputMastersRoleArn为true使cdk deploy完成后直接打印集群名、kubeconfig命令和管理员角色 ARN便于后续操作。工作节点Auto Scaling GroupaddNodes() 通过cluster.addAutoScalingGroupCapacity添加工作节点AutoScalingGroup asg this.cluster.addAutoScalingGroupCapacity( nodes, AutoScalingGroupCapacityOptions.builder() .instanceType(InstanceType.of(InstanceClass.T3, InstanceSize.MEDIUM)) // t3.medium .minCapacity(1) // 至少 1 个节点 .vpcSubnets( SubnetSelection.builder().subnetType(SubnetType.PRIVATE_ISOLATED).build()) .ssmSessionPermissions(true) // 允许 SSM Session Manager 会话 .machineImageType(null) .build()); asg.addToRolePolicy( PolicyStatement.Builder.create() .effect(Effect.ALLOW) .actions( List.of( ecr:BatchCheckLayerAvailability, ecr:BatchGetImage, ecr:GetDownloadUrlForLayer, ecr:GetAuthorizationToken)) .resources(List.of(*)) .build());要点工作节点使用t3.medium类型、最小容量 1部署在隔离子网内ssmSessionPermissions(true)为节点实例角色附加 SSM 相关权限使工作节点同样支持 Session Manager 接入排障时很有用节点角色被显式授予 ECR 拉取镜像所需的最小权限集ecr:BatchCheckLayerAvailability、ecr:BatchGetImage、ecr:GetDownloadUrlForLayer、ecr:GetAuthorizationToken配合 ECR 接口端点即可从私有仓库拉取容器镜像。kubectl 客户端实例BastionHostLinuxcreateBastion() 创建了名为kubectl-client的堡垒机实例BastionHostLinux client BastionHostLinux.Builder.create(this, kubectl-client) .vpc(vpc) .instanceName(kubectl-client) .blockDevices( List.of( BlockDevice.builder() .deviceName(/dev/sdf) .volume( BlockDeviceVolume.ebs( 10, EbsDeviceOptions.builder().encrypted(true).build())) .build())) .subnetSelection( SubnetSelection.builder().subnetType(SubnetType.PRIVATE_ISOLATED).build()) .securityGroup(this.cluster.getClusterSecurityGroup()) // 复用集群安全组 .instanceType(InstanceType.of(InstanceClass.T3, InstanceSize.SMALL)) // t3.small .build();后续的权限配置体现了私有集群的运维设计clusterAdmin.grantAssumeClientRole(client.getRole())源码中为grantAssumeRole允许客户端实例角色Assume 集群管理员角色从而获得system:masters级别的管理权限客户端实例角色被授予eks:DescribeCluster与eks:ListClusters这是执行aws eks update-kubeconfig所需的权限附加 AWS 托管策略AmazonEC2ContainerRegistryPullOnly用于拉取镜像与AmazonS3ReadOnlyAccess用于从 S3 资产桶读取 kubectl 等工具二进制10 GB 的根 EBS 卷设置为加密encrypted(true)符合高合规环境的安全基线。VPC Endpoints 清单与作用addEndpoints() 创建了全部端点。在控制台中这些端点会出现在每一个隔离子网中服务名以com.amazonaws.[region].为前缀例如com.amazonaws.ap-southeast-1.s3。网关端点Gateway Endpoint服务端点名称用途S3s3从 S3 桶下载资产、构件和工具例如 kubectl 二进制、Amazon Linux 仓库中的软件包S3 使用网关端点而非接口端点网关端点通过路由表实现、不产生数据处理费且 Amazon Linux 的 yum 仓库托管在 S3 桶中因此在隔离环境中仍可正常安装系统软件包。接口端点Interface Endpoint服务端点名称用途ECRecr.api、ecr.dkr拉取私有仓库中的容器镜像也可通过 ECR pull through cache 获取上游公共仓库镜像EC2ec2创建工作节点与客户端实例时调用 EC2 APIEKSeks调用 EKS API 完成集群创建、查询等操作Security Token Servicests获取临时安全凭证配合 AssumeRole 流程CloudWatchlogs、monitoring日志与监控数据的采集上报Systems Managerec2messages、ssm、ssmmessages支撑 SSM Session Manager 会话另见 AWS 文档中 Systems Manager 所需的端点清单Lambdalambda集群自定义资源处理器的依赖服务Step Functionsstates、sync-statesCDK 的集群处理器Custom Resource在创建 EKS 集群时依赖的状态机服务接口端点的实现与 README 中的列表一一对应在源码中体现为addEndpoints()内的 13 个InterfaceVpcEndpointAwsService常量ECR、ECR_DOCKER、CLOUDWATCH_MONITORING、CLOUDWATCH_LOGS、STS、SSM、SSM_MESSAGES、LAMBDA、EKS、EC2、EC2_MESSAGES、STEP_FUNCTIONS、STEP_FUNCTIONS_SYNC。端点的作用说明S3 端点用于下载存储在 S3 桶中的资产、构件和工具ECR 端点用于拉取私有仓库的容器镜像也可以通过 ECR pull through cache 拉取上游注册表中的公共镜像EC2 端点创建工作节点和客户端实例时调用 EC2 服务EKS 端点调用 EKS API 完成集群创建CloudWatch 端点提供日志与监控能力Lambda 与 Step Functions 端点CDK 的集群处理器Custom Resource在创建 EKS 集群时必须依赖这两个服务。后续扩展与计费注意部署完成后随着你在集群中添加需要调用其他 AWS 服务的应用需要为这些服务逐一添加对应的 VPC Endpoint完整的 Privatelink 支持清单见 AWS 官方文档注意VPC Endpoint 在每个可用区中保持开通状态时按小时计费同时还会产生数据处理费请参考 AWS PrivateLink 定价页面评估成本。构建与部署示例的 Java 入口类是 PrivateClusterCdkApp.java它创建 ID 为EksPrivateCluster的 Stack 并调用app.synth()。构建依赖通过 pom.xml 管理其中aws-cdk-lib版本区间为[2.262.0,3.0.0)编译目标为 Java 17cdk.json 中配置的应用启动命令为mvn -e -q compile exec:java。部署步骤如下进入示例根目录cd java/eks/private-cluster合成synthCloudFormation 模板cdk synth部署cdk deploy整个部署大约需要25 分钟其中包括 EKS 集群、VPC Endpoints 以及 CDK 用于监控集群生命周期所需的 Lambda 函数的创建。这些函数被部署在 VPC 内部这正是集群配置中placeClusterHandlerInVpc设为true的效果详见 EKS Construct Library。部署成功后留意 CDK 输出的集群名称、kubeconfig 设置、kubectl 客户端实例 ID 以及集群 master IAM 角色后续操作都会用到。示例输出Outputs: EksPrivateCluster.eksClusterNameXXXXXXXX eks-private EksPrivateCluster.eksConfigCommandXXXXXXXX aws eks update-kubeconfig --name eks-private --region ap-southeast-1 --role-arn arn:aws:iam::111111111111:role/EksPrivateCluster-clusteradminxxxxxxxx-xxxxxxxxxxxx EksPrivateCluster.eksGetTokenCommandXXXXXXXX aws eks get-token --cluster-name eks-private --region ap-southeast-1 --role-arn arn:aws:iam::111111111111:role/EksPrivateCluster-clusteradminxxxxxxxx-xxxxxxxxxxxx EksPrivateCluster.eksMastersRoleArnXXXXXXXX arn:aws:iam::111111111111:role/EksPrivateCluster-clusteradminxxxxxxxx-xxxxxxxxxxxx EksPrivateCluster.kubectlclientBastionHostXXXXXXXX i-000000000aaaaaaaa输出中的XXXXXXXX为 CDK 自动生成的后缀111111111111为示例账号 ID实际部署时以真实输出为准。除了运行部署你还可以用 Maven 运行单元测试来验证模板的合规性mvn testEksPrivateClusterStackTest.java 覆盖了四项关键断言集群名为eks-private且版本为1.34、私有端点访问开启且公网端点关闭、不含 Internet Gateway、不含 NAT Gateway。通过 SSM Session Manager 访问 EC2 实例登录 AWS 控制台进入EC2 服务找到 CDK 创建的名为kubectl-client的实例点击Connect选择Session Manager 2.可选在 Session Manager Preferences 中配置默认 shell 为 bash并设置 kubectl 别名与环境变量/bin/bash alias kkubectl export AWS_STS_REGIONAL_ENDPOINTSregional cd $HOME其中AWS_STS_REGIONAL_ENDPOINTSregional与集群配置中写入处理器环境的值保持一致确保 STS 走区域化端点在纯隔离网络下尤为重要。在隔离环境中安装工具与软件包DockerAmazon Linux 的软件仓库托管在 Amazon S3 桶中因此即使在隔离环境中从这些仓库安装或更新软件包也能正常工作本次部署的实例正是 Amazon Linux且 VPC 中配置了 S3 网关端点。以安装 Docker 为例sudo yum update -y sudo amazon-linux-extras install docker sudo service docker startkubectl对于kubectl这类不在系统仓库中的工具需要先准备一个可从隔离环境访问的 S3 桶来存放二进制资产。你可以使用 AWS CloudShell 下载工具并上传到该资产桶然后在kubectl-client实例中安装。CloudShell 侧的操作示例[cloudshell-userip-10-2-84-204 ~]$ curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.34.2/2025-11-13/bin/linux/amd64/kubectl [cloudshell-userip-10-2-84-204 ~]$ aws s3 cp kubectl s3://my-bucket/kubectl-1.34.2 upload: ./kubectl to s3://my-bucket/kubectl-1.34.2之后在kubectl-client实例中通过aws s3 cp依赖已附加的AmazonS3ReadOnlyAccess托管策略取回该二进制并按 EKS 官方指南完成kubectl安装。实例角色已经具备 S3 只读权限因此无需额外配置。使用 kubectl 访问 EKS 集群SSM 登录kubectl-client实例后使用部署时记录的输出信息更新 kubeconfig[ssm-userip-10-0-0-240 bin]$ aws eks update-kubeconfig --name eks-private --region ap-southeast-1 --role-arn arn:aws:iam::111111111111:role/EksPrivateCluster-clusteradminxxxxxxxx-xxxxxxxxxxxx Added new context arn:aws:eks:ap-southeast-1:111111111111:cluster/eks-private to /home/ssm-user/.kube/config验证集群访问查看节点与全部命名空间的 Pod[ssm-userip-10-0-0-240 ~]$ kubectl get nodes NAME STATUS ROLES AGE VERSION ip-10-0-0-60.ap-southeast-1.compute.internal Ready none 19h v1.34.2-eks-ecaa3a6 [ssm-userip-10-0-0-240 ~]$ kubectl get pods -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system aws-node-9sqcb 2/2 Running 2 (4h39m ago) 19h kube-system coredns-6787556b84-cg29g 1/1 Running 1 (4h39m ago) 19h kube-system coredns-6787556b84-q98ks 1/1 Running 1 (4h39m ago) 19h kube-system kube-proxy-m9ms4 1/1 Running 1 (4h39m ago) 19h从输出可以看到工作节点版本为v1.34.2-eks-ecaa3a6aws-node、coredns、kube-proxy等系统组件均正常Running说明私有集群的控制面、节点注册与容器网络在无公网环境下运转正常。清理资源不再需要时在示例根目录执行cdk destroy该命令会删除集群、VPC、VPC Endpoints、Lambda 函数及相关资源。需要留意的是如果集群中创建了独立的负载均衡器或持久化存储卷EBS/EFS可能需要按依赖顺序额外处理。实践提示小结务必开启placeClusterHandlerInVpc否则 CDK 的集群处理器 Lambda 无法访问隔离子网内的私有集群部署会失败端点是按需扩展的新增应用若依赖其他 AWS 服务如 DynamoDB、Secrets Manager需要补充对应的 VPC Endpoint同时可在addEndpoints()的端点列表中直接追加IAM 权限建议收敛源码注释明确指出生产环境应限制对特定仓库与桶的访问如将AmazonS3ReadOnlyAccess、ECR 权限收窄到具体资源示例中使用托管策略是为了演示的便捷性计费不可忽视VPC Endpoint 按小时计费并叠加数据处理费多可用区部署会放大成本请结合架构高可用要求与预算权衡模板合规性可自动化验证通过 EksPrivateClusterStackTest.java 的断言无 IGW、无 NAT、私有端点、集群版本即可在 CI 中守住纯隔离这一架构底线。赞分享【免费下载链接】aws-cdk-examplesExample projects using the AWS CDK项目地址https://gitcode.com/gh_mirrors/aw/aws-cdk-examples点击查看免费下载相关推荐网络隔离方案terraform-aws-eks私有集群配置网络隔离方案terraform aws eks私有集群配置 还在为Kubernetes集群的网络安全隐患而烦恼本文将为你详细介绍如何使用terraform云原生IaC容器编排集群管理使用 AWS CDKJava部署 EKS Fargate 集群从 VPC 搭建到 kubectl 验证的完整实战使用 AWS CDKJava部署 EKS Fargate 集群从 VPC 搭建到 kubectl 验证的完整实战 本指南以 aws cdk example在AWS上使用EKS创建Kubernetes集群的完整指南在AWS上使用EKS创建Kubernetes集群的完整指南 前言 Kubernetes作为目前最流行的容器编排平台已经成为云原生应用开发的事实标准。AWS提供上一篇Aptos MoveFlow 规范推断评估state-label 修复后的语料库筛选Screening全流程解读下一篇深入解析 Makepad 内嵌 GIF 库 makepad-gif编解码高层接口与源码级实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/15 23:41:09

开源AI效率工具实测:三个本地工具组合每天省2小时

这几年我最大的感触是,真正能帮你省时间的,不是那种“看起来很聪明”的万能助手,而是能扎扎实实嵌进你每天工作流里的自动化工具。最近一批开源AI效率工具在代码托管平台上火得很夸张,关注度涨得飞快,我也挨个装了一遍…

2026/10/15 23:41:09

IPguard服务器升级全攻略:备份、迁移与回滚指南

简介:IPguard服务器升级步骤文档面向企业信息化运维人员与系统管理员,针对该桌面管理系统中容易出现的升级操作遗漏、客户端版本不同步等问题,给出清晰可执行的完整流程。文档从官方渠道获取升级包讲起,包含解压后以管理员身份运行…

2026/10/15 23:41:09

室内设计公司如何用AI智能体+RAG重构设计决策链

1. 这不是“上个AI工具”那么简单:为什么室内设计公司突然集体盯上智能体架构最近三个月,我陆续接到七家不同规模的室内设计公司的咨询,问题高度一致:“我们想搭一套AI智能体,不是用ChatGPT写文案,也不是让…

2026/10/15 23:41:09

用Python Turtle复刻图标:像素映射与轮廓追踪实战

1. 为什么偏偏选海龟来复刻图标:这条路其实很值提起"python 图标复制(Turtle)",不少人第一反应是:这也太玩具了,想复制图标为什么不直接截图、不直接用图像处理库?我最初也这么想&…

2026/10/15 23:41:09

AI Agent构建全栈应用实操:从需求拆解到部署的完整方法论

2026年了,如果你还在把 AI 当“自动补全”用,那属实有点浪费。现在主流的 AI Agent 已经不是单点接话、补半行代码的玩具了,而是能接手一个完整全栈项目的那种干法——从页面到接口、从数据库到部署,一条龙给你往下推进。我最近用…

2026/10/15 23:36:06

美的空调串口协议调试实战:从物理层到Python自动化闭环

简介:本资源是艾默生网络能源有限公司编制的《美的空调协议调试手册》,专为暖通自控工程师、楼宇自动化系统集成人员及Modbus协议开发人员设计,解决KF-120LW/K2SRY型号美的空调在RS485/RS232通信环境下的远程监控、地址配置、双机切换与参数控…

2026/10/14 11:31:03

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/14 17:41:07

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/15 13:42:16

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/15 0:02:22

防关联浏览器哪个好?三款产品实测差异解析

新手做多店铺,最纠结的就是防关联浏览器选哪个。飞跨、网易、站斧这三款被问得最多,先给结论:要一体化省心、长期便宜,选站斧;要网易招牌和稳,选网易;预算紧做东南亚 Lazada,选飞跨。…

2026/10/15 0:02:22

影刀RPA深度实战:大模型Fine-tuning定制RPA专用Prompt与指令生成

影刀RPA深度实战:大模型Fine-tuning定制RPA专用Prompt与指令生成 一、技术背景 大模型(LLM)在通用场景下表现强大,但当我们将 GPT-4 或 Qwen 直接用于生成影刀RPA操作指令和 XPath 定位时,准确率通常只有 40%-60%。原因…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑