能否用Terraform编辑Kubernetes现有资源?及Nginx挂载ConfigMap问题
嘿,我来帮你搞定这两个问题!
一、给Nginx Ingress Helm Release挂载ConfigMap
其实你完全不需要等Deployment创建后再手动挂载,直接通过Helm chart的配置参数就能在部署时完成挂载,这样更符合Terraform和Helm的声明式管理理念。
你的kubernetes_config_map.nginx已经是Terraform创建的,只需要在helm_release.ingress里添加额外的卷和挂载配置就行——nginx-ingress Helm chart提供了extraVolumes和extraVolumeMounts这两个参数,专门用来添加自定义卷和挂载路径。
修改后的代码如下:
resource "kubernetes_config_map" "nginx" { metadata { name = "my-name" namespace = "kube-system" } data = { "my-field" = file("${path.module}/C:/my_configmap.yaml") } } resource "helm_release" "ingress" { name = "ingress" chart = "stable/nginx-ingress" namespace = "kube-system" set { name = "controller.replicaCount" value = "1" } # 配置挂载自定义ConfigMap到Nginx Controller set { name = "controller.extraVolumes[0].name" value = "nginx-config" } set { name = "controller.extraVolumes[0].configMap.name" value = kubernetes_config_map.nginx.metadata[0].name } set { name = "controller.extraVolumeMounts[0].name" value = "nginx-config" } set { name = "controller.extraVolumeMounts[0].mountPath" value = "/etc/nginx/conf.d/custom" # 替换成你实际需要的挂载路径 } # 确保先创建ConfigMap和K8s集群再部署Helm Release depends_on = [azurerm_kubernetes_cluster.k8s, kubernetes_config_map.nginx] }
注意事项:
- 替换
mountPath为你实际需要的路径,比如如果是要添加自定义Nginx配置文件,一般挂载到/etc/nginx/conf.d/目录下; - 如果你用的是新版的ingress-nginx chart(现在stable仓库已经迁移到
ingress-nginx/ingress-nginx),参数名称是一样的,只是chart地址需要调整。
二、Terraform能否编辑已有的Kubernetes资源?
答案是可以,但要分两种情况处理:
1. 资源本身就是Terraform创建的
如果资源是通过Terraform的helm_release、kubernetes_deployment等资源创建的,直接修改对应的Terraform代码,然后运行terraform apply就行。Terraform会自动对比当前状态和你声明的状态,然后执行必要的更新操作。
比如你要修改刚才的Nginx Ingress Deployment,直接调整helm_release里的set参数或者values,apply后Terraform会触发Helm upgrade来更新资源。
2. 资源不是Terraform创建的
如果资源是手动创建或者通过其他工具部署的,你可以通过以下两种方式用Terraform接管并修改:
- 使用
terraform import命令:先在Terraform代码中定义好对应的资源(比如kubernetes_deployment),然后运行terraform import命令把已有资源导入到Terraform状态中,之后就可以通过修改代码来更新资源了。
举个例子,导入kube-system下的Nginx Controller Deployment:terraform import kubernetes_deployment.nginx_controller kube-system/nginx-ingress-controller - 使用
kubernetes_manifest资源:从Terraform Kubernetes Provider 2.0版本开始,新增了kubernetes_manifest资源,可以直接声明K8s资源的YAML内容,即使资源已经存在,Terraform也会对比并更新。
重要提醒:
对于Helm部署的资源,优先通过Helm的values配置来修改,不要直接编辑K8s资源。因为下次Helm upgrade的时候,会把直接修改的内容覆盖掉,导致配置丢失。用Helm参数配置的方式,修改会被持久化到Helm的release中,更可靠。
内容的提问来源于stack exchange,提问作者Daniel

