terraform kubernetes提供程序如何从文件创建机密?

terraform kubernetes提供程序如何从文件创建机密?,kubernetes,terraform,terraform-template-file,Kubernetes,Terraform,Terraform Template File,我正在使用terraform,我想将类似于kubectl的命令转换为TF: kubectl create secret generic my-secret --from-file mysecret.json 然而,secret资源的数据字段似乎是 我试过类似的方法 data "template_file" "my-secret" { template = "${file("${path.module}/my-secret.json")}" } resource "kubernetes_s

我正在使用terraform,我想将类似于
kubectl
的命令转换为TF:

kubectl create secret generic my-secret --from-file mysecret.json
然而,
secret
资源的
数据
字段似乎是

我试过类似的方法

data "template_file" "my-secret" {
  template = "${file("${path.module}/my-secret.json")}"
}

resource "kubernetes_secret" "sgw-config" {
   metadata {
     name = "my-secret"
   }
   type = "Opaque"
   data = "{data.template_file.my-secret.template}"
}
但它抱怨这不是一张地图。所以,我可以这样做:

   data = {
      "my-secret.json" = "{data.template_file.my-secret.template}"
   }
但这将使用名为
my secret.json
的顶级字段编写机密,当我卷装它时,它将无法与其他资源一起工作


这里的诀窍是什么?

基本上,您需要提供如下地图:

resource "kubernetes_secret" "sgw-config" {
   metadata {
     name = "my-secret"
   }
   type = "Opaque"
   data {
           "key1" = "value1"
           "key2" = "value2"
  }
}
您可以使用

resource "kubernetes_secret" "sgw-config" {
       metadata {
         name = "my-secret"
       }
       type = "Opaque"
       data {
               "USERNAME" = "${var.some_variable}"
               "PASSWORD" = "${random_string.root_password.result}"
      }
    }

如果运行命令
kubectl create secret generic my secret——从文件mysecret.json

然后

$ kubectl get secrets my-secret -o yaml
apiVersion: v1
data:
  my-secret.json: ewogICA.....
kind: Secret
metadata:
  creationTimestamp: "2019-03-25T18:20:43Z"
  name: my-secret
  namespace: default
  resourceVersion: "67026"
  selfLink: /api/v1/namespaces/default/secrets/my-secret
  uid: b397a29c-4f2a-11e9-9806-000c290425d0
type: Opaque

它以类似的方式将文件名存储为单键。当我将其装入卷/volumeMount时,它会按预期工作。我担心它不会,但当我使用
--from file
参数创建秘密时,这正是它存储它的方式。

只要文件是UTF-8编码的,您就可以使用类似的方式

resource "kubernetes_secret" "some-secret" {

      metadata {
        name      = "some-secret"
        namespace = kubernetes_namespace.some-ns.metadata.0.name
        labels = {
          "sensitive" = "true"
          "app"       = "my-app"
        }
      }
      data = {
        "file.txt" = file("${path.cwd}/your/relative/path/to/file.txt")
      }
    }
如果文件是二进制文件,则会出现如下错误

调用函数“file”失败:的内容 /您的/relative/path/to/file.txt无效UTF-8;使用 filebase64函数以获取Base64编码的内容或其他 用于获取文件哈希的文件函数(例如filemd5、filesha256) 结果相反

我尝试在base64中对文件进行编码,但问题是,提供者将在base64中重新编码生成的文本。所以我想目前还没有二进制文件的解决方案。。。 我将使用下一步找到的二进制文件进行编辑。

只需使用


这可能有点离题,但我一直面临着类似的问题,除了文件可能不存在,在这种情况下,
terraform[plan | apply]
失败

确切地说:我需要将一个秘密从一个名称空间复制到另一个名称空间

我意识到通过使用提供者

步骤非常简单:

  • 通过调用外部程序加载
    数据
  • 请参阅
    kubernetes\u secret
    资源中的
    数据
  • 程序应该在STDIN上接受(并处理)JSON,并在STDOUT上生成有效的JSON,作为对STDIN的JSON中传入的参数的响应

    示例shell脚本:

    #/bin/bash
    set-e
    /bin/echo-n'{“令牌”:“'
    kubectl get-n concur secrets/hashicorp concur引导acl令牌--模板={{.data.token}
    /bin/echo-n'}'
    
    tarraform来源:

    
    data "external" "token" {
      program = ["sh", "${path.module}/consul-token.sh"]
    }
    
    resource "kubernetes_secret" "consul-token" {
      depends_on = [data.external.token]
    
      metadata {
        name      = "consul-token"
        namespace = "app"
      }
    
      data = {
        token = base64decode(data.external.token.result.token)
      }
    }
    
    和要求:

    
    terraform {
      required_providers {
        external = {
          source  = "hashicorp/external"
          version = ">= 2.0.0"
        }
      }
    }
    

    很抱歉否决投票,但这并没有解决问题:如何使用Terraform将文件(可能是非UTF-8)添加为机密值?相关问题:
    
    terraform {
      required_providers {
        external = {
          source  = "hashicorp/external"
          version = ">= 2.0.0"
        }
      }
    }