如何通过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

