Terraform GKE google_container_cluster - 应该删除默认节点池吗?

Terraform GKE google_container_cluster - should remove default node pool?

Terraform google_container_cluster 示例删除默认节点池。

resource "google_container_cluster" "primary" {
  name     = "my-gke-cluster"
  location = "us-central1"

  # We can't create a cluster with no node pool defined, but we want to only use
  # separately managed node pools. So we create the smallest possible default
  # node pool and immediately delete it.
  remove_default_node_pool = true
  initial_node_count       = 1
}

但是,由于删除了默认池,因此没有节点可以部署系统pods。

问题

有节点部署系统有什么好的方法pods?

  1. 有一个节点数为 1 的默认池,并在默认节点中安排系统 pods。将最小自动缩放节点数设置为 0,并且不在自动缩放 pods
  2. 中调度系统 pods
  3. 删除默认池。将最小自动缩放节点数设置为 1,以便系统 pods 可以部署在自动缩放节点中。

节点池定义

resource "google_container_node_pool" "primary" {
  name     = "${google_container_cluster.primary.name}-node-pool"
  project  = var.PROJECT_ID
  location = var.location

  cluster  = google_container_cluster.primary.name

  #--------------------------------------------------------------------------------
  # Node instantiation based on auto-scaling setting.
  # node_count and autoscaling are mutually exclusive.
  #--------------------------------------------------------------------------------
  node_count = var.autoscaling == true ? null : var.num_nodes
  dynamic "autoscaling" {
    for_each = var.autoscaling ? [1] : []
    content {
      min_node_count = var.min_node_count   # Set to 0 currently
      max_node_count = var.max_node_count
    }
  }

  #--------------------------------------------------------------------------------
  # Node configurations
  #--------------------------------------------------------------------------------
  node_config {
    #--------------------------------------------------------------------------------
    # Service Account, the roles of which the node assumes
    #--------------------------------------------------------------------------------
    service_account = var.service_account

    #--------------------------------------------------------------------------------
    # Instance configurations
    #--------------------------------------------------------------------------------
    machine_type = var.machine_type
    preemptible  = var.node_preemptive
    disk_size_gb = var.disk_size_gb
    disk_type    = var.disk_type

    metadata = {
      disable-legacy-endpoints = "true"
    }

    #--------------------------------------------------------------------------------
    # The K8S labels (key/value pairs) to be applied to each node
    #--------------------------------------------------------------------------------
    labels = var.labels

    oauth_scopes = [
      "https://www.googleapis.com/auth/logging.write",
      "https://www.googleapis.com/auth/monitoring",
    ]
    tags = var.tags
  }
}

那些是部署在每个节点上的系统 pods,可能 kube-dns、kube-proxy 但是度量服务器和其他 运行 作为部署的那些可以是 运行作为节点之一上的单个副本。

What is the good way to have a node to deploy the system pods?

至少为系统 pods 保留 1-2 个节点 ,例如度量服务器,如果安装在内部 kube-system 等

Have a default pool with number of nodes is 1 and schedule system pods in the defaujlt node. Set the min autoscaling node count to 0 and do not schedule system pods in auto scaling pods

无法保证您是否已将自动缩放节点数设置为 0,这意味着它会缩减。 GKE 在缩小节点方面存在限制,您可能需要先看一下,但是是的,您可以通过更新 PDB 并检查其他限制来缩小到零。

限制 : https://cloud.google.com/kubernetes-engine/docs/concepts/cluster-autoscaler#limitations

Remove the default pool. Set the min autoscaling node count to 1 so that system pods can be deployed in a autoscaling node.

如果最小计数为 1 系统 pods 应该启动并且 运行 在该节点上,这很好,并且当您部署应用程序时,您的节点开始根据需要扩展,而系统 pods 已经是 运行.

在这种情况下,如果设置了自动缩放并且您部署了应用程序,您也可以缩小到零,它将 auto-start 应用程序和系统部署在可用节点上,因此在这种情况下也不必担心。

如果你不想移除默认节点池并保留运行 1个节点,你可以使用这个字段:https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/container_cluster#remove_default_node_pool