如何在相同的Terraform代码中同时适用于Oracle(OKE)和AWS(EKS)的Kubernetes集群?

81次阅读
没有评论

问题描述

希望在Oracle Kubernetes Engine(OKE)和Amazon Elastic Kubernetes Service(EKS)中都能使用相同的Terraform代码,并在其上安装ArgoCD Helm Chart。但是,当将k8s_cluster_type设置为”oke”时,一切正常;但当将其设置为”eks”时,遇到以下错误:

Error: error reading EKS Cluster (oh-appb-01): couldn't find resource
│   with data.aws_eks_cluster.eks,
│   on main.tf line 137, in data "aws_eks_cluster" "eks":
│  137: data "aws_eks_cluster" "eks" {

用户的目标是,在给定eks_cluster_name为”dummy_cluster_name”或者EKS集群不存在的情况下,仍然能够像在OKE上一样运行此代码。请提供建议,如何在两种类型的Kubernetes集群上使用相同的Terraform代码来安装ArgoCD Helm Chart。

解决方案

以下操作步骤中如有版本差异或风险,请在执行前做好备份。

在Terraform代码中,您可以通过添加条件检查和使用Terraform的内置函数来实现在不同类型的Kubernetes集群中安装ArgoCD Helm Chart。

以下是您可以遵循的解决方案步骤:

  1. 在Terraform配置文件(例如:main.tf)中,找到使用data "aws_eks_cluster" "eks"的部分,并确保它在特定条件下才被执行。
data "aws_eks_cluster" "eks" {
  count = var.k8s_cluster_type == "eks" ? 1 : 0
  name  = var.eks_cluster_name
}
  1. 接下来,您可以在您的资源定义中使用条件语句,根据k8s_cluster_type的值来选择使用哪个集群的配置。

例如,您可以在Helm Release资源中根据k8s_cluster_type的值选择合适的Kubeconfig:

resource "helm_release" "argocd" {
  depends_on = [kubernetes_namespace.argocd, kubernetes_secret.root_repo]
  version    = var.argocd_release.chart_version
  name       = var.argocd_release.release_name
  chart      = var.argocd_release.chart_name
  repository = var.argocd_release.chart_repo
  namespace  = local.argocd_ns
  values     = [
    data.template_file.argocd-helm-values-override.rendered
  ]

  set {
    name  = "kubeconfig"
    value = var.k8s_cluster_type == "oke" ? local.kubeconfig_str : local.kubeconfig_str_eks
  }
}
  1. 在您的Terraform变量文件(例如:variables.tf)中,添加所需的变量,以及根据需要为Oracle和AWS集群指定不同的值。
variable "k8s_cluster_type" {
  description = "Type of Kubernetes cluster (oke or eks)"
  type        = string
  default     = "oke"
}

variable "eks_cluster_name" {
  description = "Name of the EKS cluster"
  type        = string
  default     = "dummy_cluster_name"
}

variable "k8s_cluster_id" {
  description = "ID of the Kubernetes cluster"
  type        = string
  default     = "ocid1.cluster.oc1.xxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}

# 其他变量...

通过这种方式,您可以根据所需的集群类型,将不同的配置应用到相应的集群中,从而在相同的Terraform代码中同时适用于Oracle(OKE)和AWS(EKS)的Kubernetes集群,并安装ArgoCD Helm Chart。

请注意:根据您的实际情况,您可能需要调整上述示例中的变量和资源配置。确保在进行任何更改之前备份您的Terraform配置文件。

正文完