无公网访问的私有子网Microk8s集群EBS卷配置失败求助
问题根源
从日志核心错误能明确:
- 首先是DNS解析
ec2.eu-west-2.amazonaws.com失败,提示集群使用的DNS服务器(10.152.183.10)工作异常 - 后续请求超时完全是因为域名解析失败,无法通过PrivateLink连接到EC2服务
在纯私有子网(无公网、无NAT)环境中,仅配置EC2的PrivateLink端点远远不够,还需要满足三个核心条件:DNS能正确解析AWS服务域名到PrivateLink内网IP、PrivateLink安全组放通集群节点的访问流量、EBS CSI驱动依赖的所有AWS服务都配置了对应的PrivateLink端点。
解决步骤
1. 补全必要的PrivateLink端点
EBS CSI驱动正常工作需要为以下AWS服务创建PrivateLink接口端点:
- EC2服务:
com.amazonaws.<你的区域>.ec2 - EBS服务:
com.amazonaws.<你的区域>.ebs - STS服务(如果使用IAM角色授权CSI驱动):
com.amazonaws.<你的区域>.sts
创建时注意:
- 端点必须部署在集群所在的私有子网内
- 端点的安全组需允许集群节点(或节点所属安全组)的443端口(HTTPS)入站流量
2. 开启VPC私有DNS解析
要让集群Pod将AWS服务域名解析到PrivateLink内网IP,需完成两项配置:
- 在VPC的DNS设置中开启启用DNS解析和启用DNS主机名
- 为每个已创建的PrivateLink端点开启启用私有DNS选项(创建时勾选,或事后编辑端点配置)
开启私有DNS后,ec2.eu-west-2.amazonaws.com这类域名会被解析到PrivateLink的内网IP,而非公网IP。
3. 验证DNS解析状态
在集群节点或CSI驱动的Pod中执行以下命令验证解析结果:
nslookup ec2.eu-west-2.amazonaws.com
若返回VPC内网网段的IP(如10.x.x.x),说明DNS配置正常;若返回公网IP,需检查私有DNS是否正确启用。
4. 检查CSI驱动权限配置
确保EBS CSI驱动使用的服务账号(或节点IAM角色)拥有ec2:CreateVolume、ec2:AttachVolume等必要权限,且权限策略允许通过PrivateLink访问EC2服务。
对于Microk8s部署的EBS CSI驱动,无需额外指定端点配置,AWS SDK会在DNS解析正常时自动使用PrivateLink。
5. 重启CSI驱动Pod
修改配置后,重启CSI控制器和节点Pod使配置生效:
kubectl delete pods -n kube-system -l app=ebs-csi-controller kubectl delete pods -n kube-system -l app=ebs-csi-node
验证配置有效性
创建测试PVC和Pod,确认EBS卷可正常创建:
# 测试PVC apiVersion: v1 kind: PersistentVolumeClaim metadata: name: ebs-test-claim spec: accessModes: - ReadWriteOnce resources: requests: storage: 4Gi storageClassName: ebs-sc # 替换为你的EBS存储类名称
# 测试Pod apiVersion: v1 kind: Pod metadata: name: ebs-test-pod spec: containers: - name: test-container image: busybox:1.28 command: ['sh', '-c', 'echo 测试运行中... && sleep 3600'] volumeMounts: - mountPath: /data name: test-volume volumes: - name: test-volume persistentVolumeClaim: claimName: ebs-test-claim
应用后检查状态:
kubectl get pvc ebs-test-claim kubectl get pod ebs-test-pod
若PVC状态变为Bound且Pod正常运行,说明配置生效。
内容的提问来源于stack exchange,提问作者Rubel Ahammad

