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

如何通过Terraform导入已存在的cert-manager CustomResourceDefinition

问题

重新部署生产集群时,使用cert-manager的Helm模块部署,执行terraform apply出现超时错误。检查发现集群中已存在cert-manager相关服务:

➜ kubectl get svc --all-namespaces              
NAMESPACE     NAME                   TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
default       kubernetes             ClusterIP   10.100.0.1       <none>        443/TCP         47h
kube-system   cert-manager           ClusterIP   10.100.128.114   <none>        9402/TCP        20m
kube-system   cert-manager-webhook   ClusterIP   10.100.45.105    <none>        443/TCP         20m
kube-system   kube-dns               ClusterIP   10.100.0.10      <none>        53/UDP,53/TCP   2d20h

此前处理AWS资源时会用terraform import告知Terraform资源已存在,现在想知道如何对CustomResourceDefinition(CRD)执行该操作,具体导入命令语法是什么?

对应的main.tf配置如下:

# cert-manager required to issues certs within the Pulsar cluster
# https://cert-manager.io/docs/installation/kubernetes/#installing-with-helm
module "cert-manager" {
  source = "../../../../../modules/helm"

  helm_release_name        = "cert-manager"
  helm_release_description = "TLS certificate manager required by Pulsar"
  helm_repo                = "https://charts.jetstack.io"
  helm_chart_name          = "cert-manager"
  helm_chart_version       = "1.5.4"
  helm_create_namespace    = "true"
  helm_release_namespace   = "kube-system"
  helm_cleanup_on_fail     = "true"
  helm_set = {
    "installCRDs" = "true"
  }
}

解决方案

1. 先明确CRD的管理归属

你的Helm模块设置了installCRDs = true,这些CRD由Helm release直接管理,因此需要分两种场景处理导入:

2. 导入操作步骤

场景一:CRD由Helm release管理(当前配置场景)

这种情况下无需单独导入CRD,直接导入整个Helm release资源,让Terraform感知到已存在的release即可:

terraform import module.cert-manager.helm_release.cert-manager kube-system/cert-manager

注意:命令中的helm_release.cert-manager需要和你helm模块内部定义的helm_release资源名称一致,若模块内资源名不同,需替换为实际名称。

导入完成后执行terraform plan确认状态匹配,再执行terraform apply就不会重复创建已存在的资源。

场景二:CRD为单独的kubernetes_crd资源定义

如果模块中单独声明了kubernetes_crd资源,需要逐个导入每个CRD:
首先列出cert-manager的所有CRD:

kubectl get crd | grep cert-manager.io

输出示例:

certificaterequests.cert-manager.io   2024-05-20T12:00:00Z
certificates.cert-manager.io          2024-05-20T12:00:00Z
challenges.acme.cert-manager.io       2024-05-20T12:00:00Z
clusterissuers.cert-manager.io        2024-05-20T12:00:00Z
issuers.cert-manager.io               2024-05-20T12:00:00Z
orders.acme.cert-manager.io           2024-05-20T12:00:00Z

对每个CRD执行导入命令,语法为:

terraform import <资源地址> <CRD名称>

比如导入certificates.cert-manager.io:

terraform import module.cert-manager.kubernetes_crd.certificate certificates.cert-manager.io

注意:<资源地址>需要和Terraform配置中定义的kubernetes_crd资源路径一致,需根据实际模块内资源命名调整。

3. 后续验证

导入完成后执行terraform plan,确认资源状态与集群实际情况匹配,再执行terraform apply即可解决超时问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:46:07