我使用terraform创建Kubernetes命名空间。以下样品
resource "kubernetes_namespace" "test1" {
metadata {
name = local.ns_name
}
}我正在尝试使用terraform创建蓝色/绿色的部署,遵循这个链接。作为其中的一部分,我现在创建了两个kubernetes集群。一个是蓝色的,另一个是绿色的,现在我有两个库伯内特斯供应商。
provider "kubernetes" {
alias = "kubernetes_blue"
}
provider "kubernetes" {
alias = "kubernetes_green"
}我想了解如果有一种方法,我可以在kubernetes_namespace上有一些条件,根据标志var.enable_green_side和var.enable_blue_side,我可以在多个kubernetes集群中创建相同的名称空间,而不必重复整个资源块,如下所示
resource "kubernetes_namespace" "test1" {
metadata {
name = local.ns_name
}
provider = kubernetes.kubernetes_blue
}
resource "kubernetes_namespace" "test2" {
metadata {
name = local.ns_name
}
provider = kubernetes.kubernetes_green
}提前谢谢。
发布于 2021-04-12 18:44:22
Terraform的模型要求每个resource块完全属于一个提供程序配置,因此无法避免两次声明资源,但您至少可以通过将资源分解到模块中并两次调用该模块,而不是直接复制resource块,从而减少造成复制的数量:
provider "kubernetes" {
alias = "blue"
}
provider "kubernetes" {
alias = "green"
}
module "blue" {
source = "../modules/bluegreen"
# (any settings the module needs from the root)
providers = {
kubernetes = kubernetes.blue
}
}
module "blue" {
source = "../modules/bluegreen"
# (any settings the module needs from the root)
providers = {
kubernetes = kubernetes.green
}
}论据块中的module允许您为子模块提供与调用方不同的声明提供程序配置的“视图”。在上面的module "blue"块中,providers参数是:“在这个模块实例中,对默认kubernetes提供程序配置的任何引用都意味着使用调用方的kubernetes.blue配置”。
在模块内部,您只需编写普通的resource "kubernetes_...."块,而不需要任何特殊的provider参数,因为这将导致它们从该模块实例的角度附加到默认提供程序,并且两个模块实例中的每个都有不同的配置绑定。
当然,这个分解到模块中是否有帮助,将取决于子模块最终需要多少来自调用模块的上下文。如果您的module块中的参数与正在分解的resource块中的参数几乎相同,那么最好将resource块保持在顶层,并避免间接性。
发布于 2021-04-11 16:42:23
从问题上看,还不清楚为什么需要两个提供程序定义。但是为了示例起见,我们可以考虑以下用于蓝色/绿色部署的通用用例:
在这两种情况下,根据变量中设置的标志使用具有不同提供程序配置的单个提供程序将更加容易。
考虑这样的变量定义(使用string类型,但也可以使用bool ):
variable "kubernetes_deployment" {
type = string
default = "blue"
}假设我想针对不同的集群:
然后可以根据变量的值配置提供程序(例如使用kubeconfig )。为此,我们可以使用三元条件。
provider "kubernetes" {
config_path = var.kubernetes_deployment == "blue" ? "~/.kube/cluster1.config" : "~/.kube/cluster2.config"
}
resource "kubernetes_namespace" "mynamespace" {
metadata {
name = local.ns_name
}
provider = kubernetes
}这将确保资源(在本例中为命名空间)将在"cluster1“中创建蓝色部署,在"cluster2”中创建绿色部署。
此条件可应用于提供程序的其他配置参数。示例使用相同的集群,但使用不同的上下文:
provider "kubernetes" {
config_path = "~/.kube/cluster1.config"
config_context = var.kubernetes_deployment == "blue" ? "context1" : "context2"
}https://stackoverflow.com/questions/67042763
复制相似问题