英文:
Dynamic node pools in digitalocean kubernetes with terraform
问题
我试图添加一个动态节点池,但出现了一些错误。
main.tf:
resource "digitalocean_kubernetes_cluster" "example_cluster" {
name = var.name
region = var.region
version = "1.24.12-do.0"
dynamic "node_pool" {
for_each = var.node_pools
content {
name = node_pool.value.name
size = node_pool.value.size
node_count = node_pool.value.node_count
labels = node_pool.value.labels
auto_scale = "true"
dynamic "auto_scale" {
for_each = node_pool.value.auto_scale ? [node_pool.value.auto_scale] : []
content {
min_nodes = node_pool.value.min_nodes
max_nodes = node_pool.value.max_nodes
}
}
}
}
}
veriables.tf:
variable "name" {
type = string
description = "The name of the Kubernetes cluster to be created."
}
variable "region" {
type = string
description = "The region in which to create the Kubernetes cluster."
}
variable "node_pools" {
description = "List of node pools"
type = list(object({
name = string
size = string
node_count = number
min_nodes = number
max_nodes = number
auto_scale = bool
labels = map(string)
}))
}
my app.tf:
module "kubernetes" {
source = "../modules/kubernetes"
name = "test-cluster"
region = "fra1"
node_pools = [
{
name = "pool-test1-8c-16gb-tests"
size = "s-8vcpu-16gb"
node_count = 2
auto_scale = "true"
min_nodes = 1
max_nodes = 15
labels = {
runner = "test1"
}
},
{
name = "pool-test2-4c-8gb"
size = "s-4vcpu-8gb"
node_count = 1
auto_scale = "true"
min_nodes = 1
max_nodes = 15
labels = {
runner = "test2"
}
}
]
}
我遇到的错误是:
> │ Error: Unsupported block type
│
│ on ../modules/DO/kubernetes/main.tf line 32, in resource "digitalocean_kubernetes_cluster" "example_cluster":
│ 32: dynamic "auto_scale" {
│
│ Blocks of type "auto_scale" are not expected here.
如果我硬编码 auto_scale,我得到这个错误:
> ╷
│ Error: Too many node_pool blocks
│
│ on ../modules/DO/kubernetes/main.tf line 22, in resource "digitalocean_kubernetes_cluster" "example_cluster":
│ 22: content {
│
│ No more than 1 "node_pool" blocks are allowed
╵
有人能指出我做错了什么吗?
英文:
I'm trying to add a dynamic node pool but I'm getting a few errors.
main.tf
resource "digitalocean_kubernetes_cluster" "example_cluster" {
name = var.name
region = var.region
version = "1.24.12-do.0"
dynamic "node_pool" {
for_each = var.node_pools
content {
name = node_pool.value.name
size = node_pool.value.size
node_count = node_pool.value.node_count
labels = node_pool.value.labels
auto_scale = "true"
#min_nodes = "1"
#max_nodes = "15"
#count = node_pool.value.auto_scale ? 1 : 0
dynamic "auto_scale" {
for_each = node_pool.value.auto_scale ? [node_pool.value.auto_scale] : []
content {
min_nodes = node_pool.value.min_nodes
max_nodes = node_pool.value.max_nodes
}
}
}
}
veriables.tf
variable "name" {
type = string
description = "The name of the Kubernetes cluster to be created."
}
variable "region" {
type = string
description = "The region in which to create the Kubernetes cluster."
}
#variable "version" {
# description = "Version of the Kubernetes cluster"
#}
variable "node_pools" {
description = "List of node pools"
type = list(object({
name = string
size = string
node_count = number
min_nodes = number
max_nodes = number
auto_scale = bool
labels = map(string)
}))
}
and my app.tf
module "kubernetes" {
source = "../modules/kubernetes"
name = "test-cluster"
region = "fra1"
# version = "1.24.12-do.0"
node_pools = [
{
name = "pool-test1-8c-16gb-tests"
size = "s-8vcpu-16gb"
node_count = 2
auto_scale = "true"
min_nodes = 1
max_nodes = 15
labels = {
runner = "test1"
}
},
{
name = "pool-test2-4c-8gb"
size = "s-4vcpu-8gb"
node_count = 1
auto_scale = "true"
min_nodes = 1
max_nodes = 15
labels = {
runner = "test2"
}
}
]
}
the error I'm getting is
> │ Error: Unsupported block type
│
│ on ../modules/DO/kubernetes/main.tf line 32, in resource "digitalocean_kubernetes_cluster" "example_cluster":
│ 32: dynamic "auto_scale" {
│
│ Blocks of type "auto_scale" are not expected here.
if I hardcode the auto_scale I'm getting this
> ╷
│ Error: Too many node_pool blocks
│
│ on ../modules/DO/kubernetes/main.tf line 22, in resource "digitalocean_kubernetes_cluster" "example_cluster":
│ 22: content {
│
│ No more than 1 "node_pool" blocks are allowed
╵
can someone point out what am I doing wrong?
答案1
得分: 2
The DO provider does not allow for more than one node_pool
block:
> (Required) A block representing the cluster's default node pool. Additional node pools may be added to the cluster using the digitalocean_kubernetes_node_pool
resource.
Furthermore, the auto_scale
option is not a block, rather an argument which should have a boolean value:
resource "digitalocean_kubernetes_cluster" "foo" {
name = "foo"
region = "nyc1"
version = "1.22.8-do.1"
node_pool {
name = "autoscale-worker-pool"
size = "s-2vcpu-2gb"
auto_scale = true
min_nodes = 1
max_nodes = 5
}
}
This example is taken from the resource documentation.
Here is how I would approach the refactoring:
- Define two variables, one for default node group, one for additional node groups
- Use the
digitalocean_kubernetes_node_pool
resource for additional node pools
Variables would then look like the following:
variable "default_node_pool" {
type = object({
name = string
size = string
node_count = number
min_nodes = number
max_nodes = number
auto_scale = bool
labels = map(string)
}
)
description = "Default node pool."
default = {
name = "pool-test1-8c-16gb-tests"
size = "s-8vcpu-16gb"
node_count = 2
auto_scale = true
min_nodes = 1
max_nodes = 15
labels = {
runner = "test1"
}
}
}
variable "additional_node_pools" {
description = "Additional node pools."
type = map(object({
name = string
size = string
node_count = number
min_nodes = number
max_nodes = number
auto_scale = bool
labels = map(string)
}
))
default = {
"test1" = {
name = "pool-test2-4c-8gb"
size = "s-4vcpu-8gb"
node_count = 1
auto_scale = true
min_nodes = 1
max_nodes = 15
labels = {
runner = "test2"
}
}
}
}
Then, in the module code, you would change to the following:
resource "digitalocean_kubernetes_cluster" "example_cluster" {
name = var.name
region = var.region
version = "1.24.12-do.0"
node_pool {
name = var.default_node_pool.name
size = var.default_node_pool.size
node_count = var.default_node_pool.node_count
labels = var.default_node_pool.labels
auto_scale = var.default_node_pool.auto_scale
max_nodes = var.default_node_pool.max_nodes
min_nodes = var.default_node_pool.min_nodes
}
}
resource "digitalocean_kubernetes_node_pool" "bar" {
for_each = var.additional_node_pools
cluster_id = digitalocean_kubernetes_cluster.example_cluster.id
name = each.value.name
size = each.value.size
node_count = each.value.node_count
min_nodes = each.value.min_nodes
max_nodes = each.value.max_nodes
auto_scale = each.value.auto_scale
labels = each.value.labels
}
When calling the module you would of course have to adjust how you are passing the variables according to the module definition:
module "kubernetes" {
source = "../modules/kubernetes"
name = "test-cluster"
region = "fra1"
# version = "1.24.12-do.0"
default_node_pool = {
name = "pool-test1-8c-16gb-tests"
size = "s-8vcpu-16gb"
node_count = 2
auto_scale = true
min_nodes = 1
max_nodes = 15
labels = {
runner = "test1"
}
}
additional_node_pools = {
"test1" = {
name = "pool-test2-4c-8gb"
size = "s-4vcpu-8gb"
node_count = 1
auto_scale = true
min_nodes = 1
max_nodes = 15
labels = {
runner = "test2"
}
}
}
}
英文:
The DO provider does not allow for more than one node_pool
block:
> (Required) A block representing the cluster's default node pool. Additional node pools may be added to the cluster using the digitalocean_kubernetes_node_pool
resource.
Furthermore, the auto_scale
option is not a block, rather an argument which should have a boolean value:
resource "digitalocean_kubernetes_cluster" "foo" {
name = "foo"
region = "nyc1"
version = "1.22.8-do.1"
node_pool {
name = "autoscale-worker-pool"
size = "s-2vcpu-2gb"
auto_scale = true
min_nodes = 1
max_nodes = 5
}
}
This example is taken from the resource documentation.
Here is how I would approach the refactoring:
- Define two variables, one for default node group, one for additional node groups
- Use the
digitalocean_kubernetes_node_pool
resource for additional node pools
Variables would then look like the following:
variable "default_node_pool" {
type = object({
name = string
size = string
node_count = number
min_nodes = number
max_nodes = number
auto_scale = bool
labels = map(string)
}
)
description = "Default node pool."
default = {
name = "pool-test1-8c-16gb-tests"
size = "s-8vcpu-16gb"
node_count = 2
auto_scale = true
min_nodes = 1
max_nodes = 15
labels = {
runner = "test1"
}
}
}
variable "additional_node_pools" {
description = "Additional node pools."
type = map(object({
name = string
size = string
node_count = number
min_nodes = number
max_nodes = number
auto_scale = bool
labels = map(string)
}
))
default = {
"test1" = {
name = "pool-test2-4c-8gb"
size = "s-4vcpu-8gb"
node_count = 1
auto_scale = true
min_nodes = 1
max_nodes = 15
labels = {
runner = "test2"
}
}
}
}
Then, in the module code, you would change to the following:
resource "digitalocean_kubernetes_cluster" "example_cluster" {
name = var.name
region = var.region
version = "1.24.12-do.0"
node_pool {
name = var.default_node_pool.name
size = var.default_node_pool.size
node_count = var.default_node_pool.node_count
labels = var.default_node_pool.labels
auto_scale = var.default_node_pool.auto_scale
max_nodes = var.default_node_pool.max_nodes
min_nodes = var.default_node_pool.min_nodes
}
}
resource "digitalocean_kubernetes_node_pool" "bar" {
for_each = var.additional_node_pools
cluster_id = digitalocean_kubernetes_cluster.example_cluster.id
name = each.value.name
size = each.value.size
node_count = each.value.node_count
min_nodes = each.value.min_nodes
max_nodes = each.value.max_nodes
auto_scale = each.value.auto_scale
labels = each.value.labels
}
When calling the module you would of course have to adjust how you are passing the variables according to the module definition:
module "kubernetes" {
source = "../modules/kubernetes"
name = "test-cluster"
region = "fra1"
# version = "1.24.12-do.0"
default_node_pool = {
name = "pool-test1-8c-16gb-tests"
size = "s-8vcpu-16gb"
node_count = 2
auto_scale = true
min_nodes = 1
max_nodes = 15
labels = {
runner = "test1"
}
}
additional_node_pools = {
"test1" = {
name = "pool-test2-4c-8gb"
size = "s-4vcpu-8gb"
node_count = 1
auto_scale = true
min_nodes = 1
max_nodes = 15
labels = {
runner = "test2"
}
}
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论