使用Packer构建AWS AMI时spin-clouddriver Pod异常问题求助
你在通过Packer构建预装Minnaker的AWS AMI时遇到的大量Pod被驱逐或Pending的问题,几乎可以确定是构建实例的资源(内存/CPU)不足以支撑Minnaker核心组件运行导致的,下面给你一步步的排查和解决思路:
一、先明确Pod Evicted的核心触发原因
Pod被标记为Evicted最常见的场景是Kubernetes节点触发了资源保护机制:
- 节点内存不足(MemoryPressure)
- 节点磁盘空间耗尽(DiskPressure)
- 节点CPU资源过载(CPUPressure)
从你列出的Pod来看,spin-clouddriver和spin-gate都是Minnaker的核心组件,本身对内存和CPU的需求不低,而你当前使用的t3a.xlarge实例(4vCPU/16GB内存)刚好卡在Minnaker运行的资源临界值上,导致节点主动驱逐Pod释放资源。
二、具体解决步骤
1. 临时排查:确认实例资源瓶颈
可以在Packer配置中添加pause_before_destroy参数,让构建失败时保留实例,方便你通过SSH进入临时实例排查:
"pause_before_destroy": "300s"
进入实例后执行以下命令定位问题:
# 查看节点资源状态,重点看Conditions部分的Memory/DiskPressure标记 kubectl describe node # 查看Minnaker组件的资源请求配置 kubectl describe pod spin-clouddriver-xxx -n spin | grep -A 10 Resources # 检查磁盘空间使用情况 df -h
2. 升级Packer构建实例规格
Minnaker官方推荐的最小运行节点规格是8vCPU/32GB内存(对应AWS的t3a.2xlarge),直接升级实例类型是最直接有效的解决方案:
修改Packer配置中的instance_type字段:
"instance_type": "t3a.2xlarge"
如果仍有资源问题,可以进一步升级到t3a.4xlarge。
3. 调整Minnaker组件的资源配置(资源受限场景)
如果无法升级实例规格,可以修改Minnaker的安装配置,降低核心组件的资源请求和限制。在你的install.sh脚本中,给Helm安装命令添加自定义参数:
# 示例:降低clouddriver和gate的资源请求/限制 helm install spin stable/spinnaker \ --namespace spin \ --set clouddriver.resources.requests.memory=2Gi \ --set clouddriver.resources.limits.memory=4Gi \ --set gate.resources.requests.memory=1Gi \ --set gate.resources.limits.memory=2Gi
根据实例实际剩余资源调整数值,避免资源请求超出节点承载能力。
4. 优化磁盘空间配置
你已经将根磁盘调整为64GB,这基本足够,但可以在安装前添加磁盘检查步骤,确保挂载正常且预留足够空间给镜像存储:
在Packer的shell provisioner中添加:
"df -h /dev/sda1 && echo 'Disk space check passed'"
三、修改后的Packer配置参考
这里给你整合了实例升级和排查优化的配置:
{ "variables": { "aws_access_key": "", "aws_secret_key": "" }, "builders": [ { "type": "amazon-ebs", "region": "us-west-2", "source_ami": "ami-0e34e7b9ca0ace12d", "access_key": "{{user `aws_access_key`}}", "secret_key": "{{user `aws_secret_key`}}", "ssh_username": "ec2-user", "instance_type": "t3a.2xlarge", "launch_block_device_mappings": [ { "device_name": "/dev/sda1", "volume_size": 64 } ], "ami_name": "minnakeramitwo - {{timestamp}}", "pause_before_destroy": "300s" } ], "provisioners": [ { "type": "file", "source": "minnaker.tgz", "destination": "/tmp/minnaker.tgz" }, { "type": "shell", "inline": [ "tar -xzvf /tmp/minnaker.tgz && cd minnaker", "df -h /dev/sda1", "./scripts/install.sh -o" ] } ] }
总结
优先尝试升级构建实例规格,这是解决资源瓶颈最直接的方式;如果资源受限,再调整Minnaker组件的资源请求配置。添加pause_before_destroy参数可以让你在构建失败时保留实例,方便定位具体的资源瓶颈。
内容的提问来源于stack exchange,提问作者devMoki

