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

如何在EKS集群内部使用Terraform kubectl Provider?

在EKS集群内部使用Terraform kubectl Provider的配置方案

你遇到的错误是因为缺少集群认证所需的token和CA证书配置,以下是具体解决步骤和示例:

1. 确保Pod的ServiceAccount具备权限

首先要给运行Terraform的Pod绑定合适的RBAC权限,示例配置如下(保存为rbac-config.yaml):

apiVersion: v1
kind: ServiceAccount
metadata:
  name: terraform-k8s-sa
  namespace: default

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: terraform-k8s-clusterrole
# 注意:生产环境请根据实际需求缩小权限范围,不要使用通配符
rules:
- apiGroups: ["*"]
  resources: ["*"]
  verbs: ["*"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: terraform-k8s-binding
subjects:
- kind: ServiceAccount
  name: terraform-k8s-sa
  namespace: default
roleRef:
  kind: ClusterRole
  name: terraform-k8s-clusterrole
  apiGroup: rbac.authorization.k8s.io

执行kubectl apply -f rbac-config.yaml创建这些资源,之后运行Terraform的Pod要指定使用这个ServiceAccount:

# 示例Pod配置
apiVersion: v1
kind: Pod
metadata:
  name: terraform-runner
  namespace: default
spec:
  serviceAccountName: terraform-k8s-sa
  containers:
  - name: terraform
    image: hashicorp/terraform:latest
    command: ["sleep", "3600"]

2. Terraform kubectl Provider的两种配置方式

方式一:通过环境变量配置

在Pod内设置以下环境变量,Provider会自动读取这些值:

export KUBE_LOAD_CONFIG_FILE=false
export KUBE_HOST=https://kubernetes.default.svc
export KUBE_TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
export KUBE_CA_CERT=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt

对应的Terraform配置文件(main.tf):

terraform {
  required_providers {
    kubectl = {
      source  = "gavinbunney/kubectl"
      version = ">= 1.14.0" # 请使用与EKS版本兼容的最新版本
    }
  }
}

provider "kubectl" {
  # 无需额外配置,自动读取环境变量
}

# 示例:创建一个Nginx Deployment
resource "kubectl_manifest" "nginx_deployment" {
  yaml_body = <<YAML
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.24
        ports:
        - containerPort: 80
YAML
}

方式二:在Provider块中显式配置

直接在Terraform代码中指定认证信息,无需依赖环境变量:

terraform {
  required_providers {
    kubectl = {
      source  = "gavinbunney/kubectl"
      version = ">= 1.14.0"
    }
  }
}

provider "kubectl" {
  host                   = "https://kubernetes.default.svc"
  token                  = file("/var/run/secrets/kubernetes.io/serviceaccount/token")
  cluster_ca_certificate = file("/var/run/secrets/kubernetes.io/serviceaccount/ca.crt")
  load_config_file       = false
}

# 同样可以添加上面的Deployment资源示例

关键说明

  • 之前的错误是因为只配置了KUBE_LOAD_CONFIG_FILE和KUBE_HOST,缺少认证用的token和CA证书,导致无法建立有效的Kubernetes API连接。
  • Pod内的ServiceAccount token和CA证书是Kubernetes自动挂载的,路径固定为/var/run/secrets/kubernetes.io/serviceaccount/下的对应文件。
  • 生产环境务必根据实际操作的Kubernetes资源类型,限制ClusterRole的权限范围,避免过度授权。

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 14:07:34