【问题标题】:How to use terraform to execute kubectl apply in a Create a generic kubernetes object built in Terraform?如何使用 terraform 执行 kubectl apply 在创建一个在 Terraform 中构建的通用 kubernetes 对象?
【发布时间】:2021-02-09 09:59:12
【问题描述】:

管道问题

  • Terraform 用于构建我们的eks Kubernetes 集群。
  • 我们使用 terraform 为其他依赖于 terraform 值的服务编写了几个配置文件

生成要应用的通用 k8s 目标文件

  • 到目前为止,我可以生成文件了...
locals {
  cert_issuer = {
    apiVersion = "cert-manager.io/v1"
    kind       = "ClusterIssuer"
    metadata = {
      name = "letsencrypt-prd"
    }
    spec = {
      acme = {
        # https://letsencrypt.org/docs/acme-protocol-updates/
        server = "https://acme-v02.api.letsencrypt.org/directory"

        # Email for the cert contact
        email = "contact@${var.domain}"

        # Name of a secret used to store the ACME account private key
        privateKeySecretRef = {
          name = "${var.domain}-private-key-secret"
        }

        # Zone resolvers by Route53 DNS01 challenges
        solvers = [{
          selector = {
            dnsZones = [var.domain]
          }
          dns01 = {
            route53 = {
              region = var.aws_region
              hostedZoneID = data.aws_route53_zone.domain_hosted_zone.zone_id
            }
          }
        }]
      }
    }
  }
}

resource "local_file" "cert_manager_cluster_issuer_object" {
  content  = yamlencode(local.cert_issuer)
  filename = "${path.module}/.k8s/cert-manager/cluster-issuer-letsencrypt-prd"
}
  • 这会保存文件,我想使用kubectl apply 应用它

【问题讨论】:

  • 您能描述一下您在这里面临的挑战吗?我不太明白您遇到的问题是什么。
  • @bitsapien 我使用 ArgoCD 使用 kustomize 应用应用程序,但是为了设置 kube-system 或其他系统级对象,我们想使用 terraform... 我想在本地生成它们并使用 kustomize 应用(因为 kubectl apply -f 可以申请整个目录)......这有意义吗?到目前为止,经过数小时试图让提供商工作后,我得到了以下解决方案...如果您有其他建议,请告诉我...

标签: git terraform push clone


【解决方案1】:

使用社区提供者的解决方案

EKS 解决方案

  • k8s 对象无需本地存储。
  • 使用 eks,我们可以配置连接以应用任何类型的资源
provider "k8s" {
  host                   = data.aws_eks_cluster.cluster.endpoint
  cluster_ca_certificate = base64decode(data.aws_eks_cluster.cluster.certificate_authority.0.data)
  token                  = data.aws_eks_cluster_auth.cluster.token
  load_config_file       = false
}
  • 然后,只使用资源而不创建文件
locals {
  cert_issuer = {
    apiVersion = "cert-manager.io/v1"
    kind       = "ClusterIssuer"
    metadata = {
      name = "letsencrypt-prd"
      #namespace: cert-manager it's cluster level no namespace
    }
    spec = {
      acme = {
        # https://letsencrypt.org/docs/acme-protocol-updates/
        server = "https://acme-v02.api.letsencrypt.org/directory"

        # Email for the cert contact
        email = "contact@${var.domain}"

        # Name of a secret used to store the ACME account private key
        privateKeySecretRef = {
          name = "${var.domain}-private-key-secret"
        }

        # Zone resolvers by Route53 DNS01 challenges
        solvers = [{
          selector = {
            dnsZones = [var.domain]
          }
          dns01 = {
            route53 = {
              region = var.aws_region
              # https://stackoverflow.com/questions/63402926/fetch-zone-id-of-hosted-domain-on-route53-using-terraform/63403290#63403290
              hostedZoneID = data.aws_route53_zone.domain_hosted_zone.zone_id
            }
          }
        }]
      }
    }
  }
}

# creating the cert_manager_cluster_issuer namespace
resource "k8s_manifest" "cert_manager_cluster_issuer" {
  content   = yamlencode(local.cert_issuer)
  namespace = local.cert_manager_namespace

  # depends_on = [local_file.kubeconfig]
}

【讨论】:

    猜你喜欢
    • 2020-09-15
    • 2021-08-28
    • 2019-06-03
    • 2021-03-27
    • 2019-04-26
    • 2019-07-08
    • 2020-08-20
    • 2020-06-08
    • 2019-12-31
    相关资源
    最近更新 更多