如何用Terraform删除DigitalOcean Kubernetes默认节点池且不重建集群?
我已使用Terraform创建了带有额外节点池的DigitalOcean Kubernetes集群,运行一切正常。
初始配置代码如下:
resource "digitalocean_kubernetes_cluster" "k8s_cluster" { depends_on = [digitalocean_container_registry.docker_registry] name = "dev" region = var.region version = "1.30.2-do.0" registry_integration = true node_pool { name = "dev-pool" size = "s-2vcpu-2gb" auto_scale = true min_nodes = 2 max_nodes = 4 } } resource "digitalocean_kubernetes_node_pool" "new_k8s_node_pool" { cluster_id = digitalocean_kubernetes_cluster.k8s_cluster.id name = "dev-pool-new" size = "s-2vcpu-4gb" auto_scale = true min_nodes = 2 max_nodes = 4 }
现在我希望删除旧节点池dev-pool,仅保留新节点池dev-pool-new维持集群运行。但执行terraform plan后发现Terraform将重建集群,我不想重建集群,仅删除默认节点池。请问该如何操作?是否可以不重建集群就删除默认节点池?
修改后的配置代码如下:
resource "digitalocean_kubernetes_cluster" "k8s_cluster" { depends_on = [digitalocean_container_registry.docker_registry] name = "dev" region = var.region version = "1.30.2-do.0" registry_integration = true node_pool { name = "dev-pool-new" size = "s-2vcpu-4gb" auto_scale = true min_nodes = 2 max_nodes = 4 } }
terraform plan输出示例:
digitalocean_kubernetes_cluster.k8s_cluster must be replaced
digitalocean_kubernetes_node_pool.new_k8s_node_pool will be destroyed
可以不重建集群就删除默认节点池,问题根源在于Terraform将digitalocean_kubernetes_cluster资源内定义的node_pool块视为集群的核心组成部分,直接修改或删除该块会触发集群重建。正确操作分两步:
步骤1:将原默认节点池转为独立资源管理
修改Terraform配置,把原集群内的dev-pool从digitalocean_kubernetes_cluster的node_pool块中移除,新增一个单独的digitalocean_kubernetes_node_pool资源来管理它,同时保留现有新节点池的资源配置:
resource "digitalocean_kubernetes_cluster" "k8s_cluster" { depends_on = [digitalocean_container_registry.docker_registry] name = "dev" region = var.region version = "1.30.2-do.0" registry_integration = true # 移除原来的dev-pool节点池块 } resource "digitalocean_kubernetes_node_pool" "old_k8s_node_pool" { cluster_id = digitalocean_kubernetes_cluster.k8s_cluster.id name = "dev-pool" size = "s-2vcpu-2gb" auto_scale = true min_nodes = 2 max_nodes = 4 } resource "digitalocean_kubernetes_node_pool" "new_k8s_node_pool" { cluster_id = digitalocean_kubernetes_cluster.k8s_cluster.id name = "dev-pool-new" size = "s-2vcpu-4gb" auto_scale = true min_nodes = 2 max_nodes = 4 }
执行命令:
terraform plan terraform apply
这一步Terraform会将原默认节点池转换为独立管理的资源,不会重建集群,也不会影响现有节点池的运行。
步骤2:删除旧节点池资源
确认步骤1执行完成后,删除配置中对应旧节点池的digitalocean_kubernetes_node_pool.old_k8s_node_pool资源块,最终配置如下:
resource "digitalocean_kubernetes_cluster" "k8s_cluster" { depends_on = [digitalocean_container_registry.docker_registry] name = "dev" region = var.region version = "1.30.2-do.0" registry_integration = true } resource "digitalocean_kubernetes_node_pool" "new_k8s_node_pool" { cluster_id = digitalocean_kubernetes_cluster.k8s_cluster.id name = "dev-pool-new" size = "s-2vcpu-4gb" auto_scale = true min_nodes = 2 max_nodes = 4 }
再次执行命令:
terraform plan terraform apply
此时Terraform只会删除旧的dev-pool节点池,不会重建集群,新节点池会正常维持集群运行。
内容的提问来源于stack exchange,提问作者poisoned_monkey

