【问题标题】:Can we create EKS Cluster and Kubernetes deployment in a single terraform apply?我们可以在单个 terraform 应用中创建 EKS 集群和 Kubernetes 部署吗?
【发布时间】:2022-08-09 06:07:54
【问题描述】:

我想使用 Terraform 创建一个 EKS 集群,构建自定义 docker 映像,然后通过 terraform 在创建的集群上执行 Kubernetes 部署。我想使用单个 terraform 应用程序来执行所有任务。但是我看到 kubernetes 提供程序需要集群的初始化本身的详细信息。有没有一种方法可以使用单个 terraform apply 来实现集群创建和部署,这样一旦创建集群,集群详细信息就可以传递给 Kubernetes 提供程序,然后部署 pod。

请让我知道如何实现这一目标?

  • 这是关于 SO 的一个常见问题,答案仍然是:仅当您将 Kubernetes 提供程序锁定到版本 <= 2.3.2 时,您是否可以这样做?
  • 您可以在配置了依赖项的单个 terragrunt run-all apply 中执行此操作。
  • 是否有任何博客或现有的所以我可以参考特定的 Kubernetes 版本或 terragrunt 如何帮助我实现这一目标?..我需要配置什么才能将集群信息动态传递给 Kubernetes 提供者?

标签: amazon-web-services kubernetes terraform amazon-eks


【解决方案1】:

我很容易做到这一点,下面是伪代码,你只需要小心你使用depends_on属性和资源的方式,并尝试尽可能多地封装

Kubernetes Provider 在一个单独的文件中,比如 kubernetes.tf

  host                   = module.eks.cluster_endpoint
  cluster_ca_certificate = base64decode(module.eks.cluster_certificate_authority_data)
  exec {
    api_version = "client.authentication.k8s.io/v1alpha1"
    command     = "aws"
    args = [
      "eks",
      "get-token",
      "--cluster-name",
      module.eks.cluster_id
    ]
  }
}

假设您已经完成了网络设置,这里我依赖的是隐式依赖而不是显式依赖。

module "eks" {
  source = "./modules/ekscluster"

  clustername     = module.clustername.cluster_name
  eks_version     = var.eks_version
  private_subnets = module.networking.private_subnets_id
  vpc_id          = module.networking.vpc_id
  environment     = var.environment
  instance_types  = var.instance_types

}

使用depends_on 属性创建k8s 资源。

resource "kubernetes_namespace_v1" "app" {
  metadata {
    annotations = {
      name = var.org_name
    }
    name = var.org_name
  }
  depends_on = [module.eks]
}

【讨论】:

    猜你喜欢
    • 2019-07-08
    • 2021-03-16
    • 2021-04-04
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 2021-07-08
    • 1970-01-01
    相关资源
    最近更新 更多