Terraform创建EKS PersistentVolume时报dial tcp i/o timeout错误
报错信息
执行资源创建操作时返回报错:
https://***.eks.amazonaws.com/api/v1/persistentvolumes: dial tcp *****:443: i/o timeout
问题场景
通过Terraform为AWS EKS集群部署存储资源时,EBS卷已创建成功,但创建PersistentVolume资源时触发上述报错,涉及的Terraform配置如下:
resource "kubernetes_persistent_volume" "api-application-pv" { metadata { name = "api-application-pv" } spec { capacity = { storage = "2Gi" } access_modes = ["ReadWriteMany"] persistent_volume_source { aws_elastic_block_store { volume_id = aws_launch_template.default.arn } } } } resource "kubernetes_persistent_volume_claim" "api-application-pvc" { metadata { name = "api-application-pvc" } spec { resources { requests = { storage = "2Gi" } } access_modes = ["ReadWriteMany"] storage_class_name = "gp2" volume_name = "${kubernetes_persistent_volume.api-application-pv.metadata.0.name}" } wait_until_bound = false depends_on = [kubernetes_persistent_volume.api-application-pv] } resource "aws_launch_template" "default" { name_prefix = "eks-stage-template" description = "eks-stage-template" update_default_version = true block_device_mappings { device_name = "/dev/xvda" ebs { volume_size = 50 volume_type = "gp2" delete_on_termination = true encrypted = true } } }
报错原因
报错分为两类触发原因,需分别排查:
- 基础网络连通性故障:运行Terraform的执行节点无法和EKS集群API Server的443端口建立TCP连接,常见触发场景包括:
- 公网执行Terraform时,EKS API Server关联的安全组未放通执行节点公网IP的443入站流量
- VPC内网执行Terraform时,路由表、安全组规则拦截了执行节点到EKS API端点的访问流量,VPC端点配置错误也会导致该问题
- Terraform存储配置逻辑错误:现有配置存在多处不符合EKS EBS存储使用规则的问题,会间接加剧资源创建异常:
- PV引用的存储ID错误:
aws_elastic_block_store块下的volume_id填写的是EC2启动模板的ARN,并非独立EBS数据卷的ID,启动模板中定义的块设备是EKS节点的系统盘,无法作为PV持久化存储使用 - 访问模式配置不兼容:EBS为块存储类型,仅支持
ReadWriteOnce单节点读写访问模式,配置ReadWriteMany多节点读写模式不符合EBS的能力边界 - PVC配置冲突:手动创建静态PV绑定场景下,PVC指定了
gp2动态存储类,会和静态PV的绑定逻辑产生冲突
- PV引用的存储ID错误:
解决方案
按以下顺序排查修复:
- 先修复EKS API连通性问题
- 核对网络访问规则:公网执行时,在EKS集群安全组添加入站规则,允许执行Terraform节点的公网IP访问443端口;内网执行时,确认VPC路由表、安全组放通执行节点到EKS API端点的443流量,使用VPC端点访问EKS的场景需同步核对端点的安全组、关联路由配置
- 连通性校验:在执行Terraform的节点上执行命令
curl -k https://<替换为实际EKS API端点地址>:443/version,能正常返回Kubernetes版本信息即为连通正常
- 修正Terraform存储配置
- 创建独立的EBS数据卷供PV挂载使用,注意EBS卷需和EKS工作节点部署在同一可用区:
resource "aws_ebs_volume" "api_application_ebs" { availability_zone = "替换为EKS节点所在可用区,例如us-east-1a" size = 2 type = "gp2" encrypted = true } - 修正PV配置,替换错误的volume_id引用,同步修改访问模式为EBS兼容的类型:
resource "kubernetes_persistent_volume" "api-application-pv" { metadata { name = "api-application-pv" } spec { capacity = { storage = "2Gi" } access_modes = ["ReadWriteOnce"] persistent_volume_source { aws_elastic_block_store { volume_id = aws_ebs_volume.api_application_ebs.id fs_type = "ext4" } } } } - 修正PVC配置,移除冲突的存储类配置,同步修改访问模式:
resource "kubernetes_persistent_volume_claim" "api-application-pvc" { metadata { name = "api-application-pvc" } spec { resources { requests = { storage = "2Gi" } } access_modes = ["ReadWriteOnce"] volume_name = kubernetes_persistent_volume.api-application-pv.metadata[0].name } wait_until_bound = false depends_on = [kubernetes_persistent_volume.api-application-pv] } - 配置修正后重新执行
terraform plan和terraform apply即可完成资源创建。
- 创建独立的EBS数据卷供PV挂载使用,注意EBS卷需和EKS工作节点部署在同一可用区:
内容的提问来源于stack exchange,提问作者Hema Sri
相关产品推荐
相关产品推荐

