在Kubernetes中使用Terraform输出

时间:2018-01-10 17:42:31

标签: amazon-web-services kubernetes terraform kubectl

我使用稍微自定义的Terraform配置在AWS上生成我的Kubernetes群集。配置包括连接到群集节点和主节点的EFS实例。为了让Kubernetes将这个EFS实例用于卷,我的Kubernetes YAML需要Terraform生成的EFS实例的id和endpoint / domain。

目前,我的Terraform输出EFS ID和DNS名称,我需要在terraform apply之后和kubectl apply YAML之前使用这些值手动编辑我的Kubernetes YAML。

如何自动将这些Terraform输出值传递给Kubernetes?

1 个答案:

答案 0 :(得分:0)

我不知道yaml在AWS中设置Kubernetes集群的意思。但是,我总是使用kops设置我的AWS群集。另外,我不明白为什么要将EFS挂载到主节点和/或节点而不是容器。

但是直接回答你的问题:你可以编写一个脚本来输出你的Terraform输出到Helm值文件,然后用它来生成k8s配置。

我在寻找一种方法将TF输出发送到Kubernetes中指定的envvars时偶然发现了这个问题,我希望有更多人这样做。我也怀疑这也是你的问题,或者至少它可以解决你的问题。所以:

您可以使用Kubernetes Terraform provider连接到群集,然后使用kubernetes_config_map资源创建配置映射。

provider "kubernetes" {}

resource "kubernetes_config_map" "efs_configmap" {
  "metadata" {
    name = "efs_config"  // this will be the name of your configmap
  }

  data {
    efs_id = "${aws_efs_mount_target.efs_mt.0.id}"
    efs_dns = "${aws_efs_mount_target.efs_mt.0.dns_name}"
  }
}

如果您有秘密参数,请使用kubernetes_secret资源:

resource "kubernetes_secret" "some_secrets" {
  "metadata" {
    name = "some_secrets"
  }

  data {
    s3_iam_access_secret = "${aws_iam_access_key.someresourcename.secret}"
    rds_password = "${aws_db_instance.someresourcename.password}"
  }
}    

您可以在设置环境时consume these in your k8s yaml:

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: some-app-deployment
spec:
  selector:
    matchLabels:
        app: some
  template:
    metadata:
      labels:
        app: some
    spec:
      containers:
        - name: some-app-container
          image: some-app-image
          env:
            - name: EFS_ID
              valueFrom:
                configMapKeyRef:
                  name: efs_config
                  key: efs_id
            - name: RDS_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: some_secrets
                  key: rds_password