Terraform执行成功,但AWS EKS集群内创建的资源无法在控制台查看
问题排查:Terraform提示创建K8s资源但AWS控制台不可见
可能原因及排查步骤
1. 验证Kubernetes Provider的集群连接正确性
Terraform的Kubernetes Provider配置是否指向目标EKS集群是核心排查点:
- 手动执行认证命令获取集群访问令牌:
aws eks get-token --cluster-name $(terraform output -raw cluster_id) - 用获取到的令牌直接调用集群API,验证资源是否存在:
如果能查到命名空间,说明资源确实存在,只是控制台显示延迟或上下文问题;如果查不到,说明Provider配置有误,检查kubectl --server=$(terraform output -raw cluster_endpoint) \ --certificate-authority=<(echo $(terraform output -raw cluster_ca_certificate) | base64 -d) \ --token=<上面命令返回的token> \ get namespace jupyterhubdata.aws_eks_cluster.cluster的输出是否正确。
2. 确认kubectl上下文与目标集群匹配
控制台显示的资源依赖当前kubectl上下文,执行以下命令验证:
# 查看所有上下文 kubectl config get-contexts # 切换到目标集群上下文(替换为你的集群上下文名) kubectl config use-context arn:aws:eks:<区域>:<账号ID>:cluster/<集群名> # 再次查询资源 kubectl get ns jupyterhub kubectl get daemonset -n kube-system nvidia-device-plugin-daemonset-0.9.0
3. 检查DaemonSet的调度条件
你的DaemonSet配置了节点亲和性和容忍度,可能导致资源未调度到节点上:
- 检查节点实例类型是否匹配:
注意:K8s 1.24+已弃用kubectl get nodes -o custom-columns=NAME:.metadata.name,INSTANCE_TYPE:.metadata.labels.kubernetes\.io/instance-typebeta.kubernetes.io/instance-type标签,改用kubernetes.io/instance-type,如果集群版本较高,需要修改DaemonSet的亲和性标签。 - 检查节点污点是否与容忍度匹配:
确认节点存在kubectl describe node <节点名> | grep Taintsnvidia.com/gpu或hub.jupyter.org/dedicated污点,否则容忍度配置可能导致Pod无法调度。
4. 同步Terraform状态与实际集群
如果上述验证都正常,可能是Terraform状态与实际集群不一致:
- 查看Terraform状态中的资源信息:
terraform state show kubernetes_namespace.jupyterhub - 执行
terraform refresh更新状态,或尝试导入资源(如果确认资源存在):terraform import kubernetes_namespace.jupyterhub jupyterhub terraform import kubernetes_daemonset.nvidia-device-plugin kube-system/nvidia-device-plugin-daemonset-0.9.0
代码优化建议
- 显式指定Kubernetes资源的API版本,避免Terraform自动推断错误:
将resource "kubernetes_daemonset"改为resource "kubernetes_daemonset_v1",并添加api_version = "apps/v1"到metadata块。 - 更新节点亲和性标签为当前K8s版本支持的格式:
match_expressions { key = "kubernetes.io/instance-type" operator = "In" values = ["p2.xlarge"] }
内容的提问来源于stack exchange,提问作者cWerning
相关产品推荐
相关产品推荐

