如何使用CDK调整EKS默认容量实例的块设备容量
问题原因
CDK EKS Construct的defaultCapacity创建EC2节点组时,默认给EC2实例配置的根EBS卷容量为20G,对应你df -h输出中挂载到/的/dev/xvda1分区,默认配置未自定义块设备参数,因此会出现磁盘占用过高的问题。
配置方法
需要在节点组配置中显式指定块设备映射规则,有两种常用实现方式,配置前需要先引入Auto Scaling相关的块设备依赖:
import { BlockDeviceVolume, EbsDeviceVolumeType } from 'aws-cdk-lib/aws-autoscaling';
方法1:保留defaultCapacity逻辑,补充默认容量配置
不需要废弃现有defaultCapacity代码,只需要在Cluster初始化参数中补充defaultCapacityOptions字段,传入块设备配置即可。注意原有defaultCapacityInstance参数已被标记为废弃,建议统一放到defaultCapacityOptions中维护。
修改后的Cluster配置代码如下:
const cluster = new Cluster(this, 'cluster', { version: KubernetesVersion.V1_21, vpc, defaultCapacity: 2, defaultCapacityType: DefaultCapacityType.EC2, defaultCapacityOptions: { instanceType: InstanceType.of(InstanceClass.T2, InstanceSize.XLARGE), // 自定义块设备配置 blockDevices: [ { // EKS优化版Amazon Linux 2 AMI默认根设备名 deviceName: '/dev/xvda', volume: BlockDeviceVolume.ebs(100, { // 此处填写需要的根卷容量,单位为GiB volumeType: EbsDeviceVolumeType.GP3, encrypted: true, deleteOnTermination: true, }) } ] } }) // 后续原有IAM、安全组配置保持不变 cluster.defaultCapacity?.role.addManagedPolicy(ManagedPolicy.fromAwsManagedPolicyName('AmazonSSMManagedInstanceCore')) cluster.defaultCapacity?.addSecurityGroup(allowSshSG)
方法2:关闭默认容量,显式创建自定义节点组(推荐)
defaultCapacity是CDK提供的快速创建节点组的语法糖,配置灵活度有限,生产环境更推荐将defaultCapacity设为0,通过addAutoScalingGroupCapacity方法显式创建节点组,所有节点配置完全可控,后续新增不同规格的节点组也更方便。
完整代码示例:
const vpc = Vpc.fromLookup(this, 'vpc', { vpcName: 'vpc' }) const allowSshSG = new SecurityGroup(this, 'allow-ssh', { vpc, securityGroupName: 'allow-ssh', allowAllOutbound: true }) allowSshSG.addIngressRule(Peer.anyIpv4(), Port.tcp(22), 'allow ssh') const cluster = new Cluster(this, 'cluster', { version: KubernetesVersion.V1_21, vpc, defaultCapacity: 0, // 关闭默认节点组 defaultCapacityType: DefaultCapacityType.EC2, }) // 显式创建自定义配置的节点组 const nodeGroup = cluster.addAutoScalingGroupCapacity('custom-node-group', { instanceType: InstanceType.of(InstanceClass.T2, InstanceSize.XLARGE), desiredCapacity: 2, minCapacity: 2, maxCapacity: 4, // 自定义块设备配置 blockDevices: [ { deviceName: '/dev/xvda', volume: BlockDeviceVolume.ebs(100, { volumeType: EbsDeviceVolumeType.GP3, encrypted: true, deleteOnTermination: true, }) } ] }) // 配置节点组权限与安全组 nodeGroup.role.addManagedPolicy(ManagedPolicy.fromAwsManagedPolicyName('AmazonSSMManagedInstanceCore')) nodeGroup.addSecurityGroup(allowSshSG)
注意事项
- 配置更新后,CDK会修改Auto Scaling Group的启动模板,触发节点滚动更新,用新配置的大磁盘节点替换原有20G磁盘的旧节点,不会对已运行的旧节点做原地磁盘扩容。
- 如果使用T3/T3a/C5等Nitro架构实例,根设备名依然填
/dev/xvda即可,EKS优化AMI的块设备映射会自动适配Nitro实例的设备名规则,不需要手动修改为/dev/nvme0n1。 - 如果需要额外挂载数据盘,只需要在
blockDevices数组中新增对应的设备配置即可,磁盘挂载操作可以通过EC2用户脚本或Kubernetes DaemonSet完成。
内容的提问来源于stack exchange,提问作者Vasyl Herman
相关产品推荐
相关产品推荐

