在Terraform Kubernetes Provider中创建P12密钥库Secret的方案咨询
解决方案:Terraform 处理 P12 密钥库创建 Kubernetes Secret
你的方案问题分析
- 第一个方案失败原因:Terraform 的
base64decode返回原始字节数据,但 Kubernetes Secret 的data字段要求值为base64编码后的字符串,直接传入解码后的字节会触发UTF-8编码转换错误。 - 第三、第四个方案的问题:
local_file的provisioner命令存在语法错误,${content}无法直接在命令中引用,且逻辑上应该读取写入的文件而非变量;file()函数默认按UTF-8解析文件,不适合读取p12这类二进制文件,会直接报错。
修正后的可行方案
方案1:直接读取本地p12文件(无文件传入限制时首选)
用Terraform内置的filebase64()函数处理二进制文件,它会自动读取p12并生成符合要求的base64编码字符串,无需手动编码:
resource "kubernetes_secret_v1" "test_keystore" { metadata { name = "test-keystore" namespace = "test" # 若为变量则替换为var.namespace,注意加引号 } type = "Opaque" data = { "test.p12" = filebase64("path/to/test.p12") } }
方案2:通过base64编码变量传递(符合你的文件传入限制)
你之前手动生成base64编码的操作是正确的,只需直接将变量值传入Secret的data字段——K8s Secret的data字段本身要求值为base64编码字符串,无需额外解码:
variable "encoded_p12" { type = string } resource "kubernetes_secret_v1" "test_keystore" { metadata { name = "test-keystore" namespace = "test" } type = "Opaque" data = { "test.p12" = var.encoded_p12 } }
核心逻辑说明
Kubernetes Secret的data字段本质是存储base64编码后的内容,Terraform只需传递正确的base64字符串即可。之前的错误是多执行了base64decode步骤,导致原始二进制数据被强制转为UTF-8字符串,触发编码异常。
内容的提问来源于stack exchange,提问作者Nishant Kansal
相关产品推荐
相关产品推荐

