gpt4 book ai didi

kubernetes - Terraform:如何使用命名空间在 Google Cloud (GKE) 上创建 Kubernetes 集群?

转载 作者:行者123 更新时间:2023-12-03 20:22:22 26 4
gpt4 key购买 nike

我正在寻找一个可以执行以下操作的示例:

  1. 通过 Terraform 的 google_container_cluster 在 GKE 上创建一个 Kubernetes 集群
  2. ... 并继续在其中创建 namespace ,我想是通过 kubernetes_namespace

我不确定的是如何连接新创建的集群和命名空间定义。例如,在添加 google_container_node_pool 时,我可以执行类似 cluster = "${google_container_cluster.hosting.name}" 的操作,但我没有看到任何与 类似的内容kubernetes_namespace.

最佳答案

理论上,可以在 K8S(或任何其他)提供程序中引用来自 GCP 提供程序的资源,就像您在单个提供程序的上下文中引用资源或数据源一样。

provider "google" {
region = "us-west1"
}

data "google_compute_zones" "available" {}

resource "google_container_cluster" "primary" {
name = "the-only-marcellus-wallace"
zone = "${data.google_compute_zones.available.names[0]}"
initial_node_count = 3

additional_zones = [
"${data.google_compute_zones.available.names[1]}"
]

master_auth {
username = "mr.yoda"
password = "adoy.rm"
}

node_config {
oauth_scopes = [
"https://www.googleapis.com/auth/compute",
"https://www.googleapis.com/auth/devstorage.read_only",
"https://www.googleapis.com/auth/logging.write",
"https://www.googleapis.com/auth/monitoring"
]
}
}

provider "kubernetes" {
host = "https://${google_container_cluster.primary.endpoint}"
username = "${google_container_cluster.primary.master_auth.0.username}"
password = "${google_container_cluster.primary.master_auth.0.password}"
client_certificate = "${base64decode(google_container_cluster.primary.master_auth.0.client_certificate)}"
client_key = "${base64decode(google_container_cluster.primary.master_auth.0.client_key)}"
cluster_ca_certificate = "${base64decode(google_container_cluster.primary.master_auth.0.cluster_ca_certificate)}"
}

resource "kubernetes_namespace" "n" {
metadata {
name = "blablah"
}
}

然而在实践中,由于已知的核心错误破坏了跨供应商的依赖关系,它可能无法按预期工作,请参阅 https://github.com/hashicorp/terraform/issues/12393https://github.com/hashicorp/terraform/issues/4149分别。

替代解决方案是:

  1. 使用两阶段应用和 target首先是 GKE 集群,然后是依赖它的任何其他东西,即 terraform apply -target=google_container_cluster.primary 然后是 terraform apply
  2. 将 GKE 集群配置与 K8S 配置分开,为它们提供完全隔离的工作流,并通过 remote state 连接它们.

/terraform-gke/main.tf

terraform {
backend "gcs" {
bucket = "tf-state-prod"
prefix = "terraform/state"
}
}

provider "google" {
region = "us-west1"
}

data "google_compute_zones" "available" {}

resource "google_container_cluster" "primary" {
name = "the-only-marcellus-wallace"
zone = "${data.google_compute_zones.available.names[0]}"
initial_node_count = 3

additional_zones = [
"${data.google_compute_zones.available.names[1]}"
]

master_auth {
username = "mr.yoda"
password = "adoy.rm"
}

node_config {
oauth_scopes = [
"https://www.googleapis.com/auth/compute",
"https://www.googleapis.com/auth/devstorage.read_only",
"https://www.googleapis.com/auth/logging.write",
"https://www.googleapis.com/auth/monitoring"
]
}
}

output "gke_host" {
value = "https://${google_container_cluster.primary.endpoint}"
}

output "gke_username" {
value = "${google_container_cluster.primary.master_auth.0.username}"
}

output "gke_password" {
value = "${google_container_cluster.primary.master_auth.0.password}"
}

output "gke_client_certificate" {
value = "${base64decode(google_container_cluster.primary.master_auth.0.client_certificate)}"
}

output "gke_client_key" {
value = "${base64decode(google_container_cluster.primary.master_auth.0.client_key)}"
}

output "gke_cluster_ca_certificate" {
value = "${base64decode(google_container_cluster.primary.master_auth.0.cluster_ca_certificate)}"
}

在这里,我们通过output 公开了所有必要的配置,并使用后端存储状态,以及远程位置的这些输出,GCS在这种情况下。这使我们能够在下面的配置中引用它。

/terraform-k8s/main.tf

data "terraform_remote_state" "foo" {
backend = "gcs"
config {
bucket = "tf-state-prod"
prefix = "terraform/state"
}
}

provider "kubernetes" {
host = "https://${data.terraform_remote_state.foo.gke_host}"
username = "${data.terraform_remote_state.foo.gke_username}"
password = "${data.terraform_remote_state.foo.gke_password}"
client_certificate = "${base64decode(data.terraform_remote_state.foo.gke_client_certificate)}"
client_key = "${base64decode(data.terraform_remote_state.foo.gke_client_key)}"
cluster_ca_certificate = "${base64decode(data.terraform_remote_state.foo.gke_cluster_ca_certificate)}"
}

resource "kubernetes_namespace" "n" {
metadata {
name = "blablah"
}
}

这里可能不明显的是,必须在创建/更新任何 K8S 资源之前创建/更新集群(如果此类更新依赖于集群的更新)。


采用第二种方法通常是可取的(即使/如果错误不是一个因素并且跨供应商引用有效)因为它减少了爆炸半径并定义了更清晰的责任。此类部署通常由 1 个人员/团队负责管理集群,而另一个人员/团队负责管理 K8S 资源。

虽然肯定会有重叠 - 例如运维人员希望在新的 GKE 集群之上部署日志记录和监控基础设施,因此跨提供商依赖旨在满足此类用例。因此,我建议订阅上述 GH 问题。

关于kubernetes - Terraform:如何使用命名空间在 Google Cloud (GKE) 上创建 Kubernetes 集群?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50088355/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com