You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 17:33:40