Kubernetes中如何将TLS类型Secret的证书/密钥与文件或ConfigMap关联?
嗨,我来帮你捋清楚这个问题~你尝试的两种写法都不符合Kubernetes Secret的规范,所以才会出现那个解析错误,下面分别说正确的处理方式:
一、从本地文件创建TLS类型Secret
你直接在YAML的tls.crt和tls.key里填文件路径是行不通的,因为Secret的data字段需要的是base64编码后的内容,不是文件路径。最省心的方式是用kubectl命令直接从本地文件生成Secret,不用手动写YAML:
kubectl create secret tls hello-app-tls \ --namespace=dev \ --cert=/path/to/your/tls.crt \ --key=/path/to/your/tls.key
这条命令会自动读取文件内容、完成base64编码,直接生成符合要求的TLS Secret。如果非要用YAML定义,那得先把文件内容转成base64编码:
# 转换证书内容为base64 cat tls.crt | base64 # 转换密钥内容为base64 cat tls.key | base64
再把输出的编码内容填到YAML里:
apiVersion: v1 kind: Secret metadata: name: hello-app-tls namespace: dev type: kubernetes.io/tls data: tls.crt: <base64编码的证书内容> tls.key: <base64编码的密钥内容>
二、从ConfigMap引用内容生成TLS Secret
你用valueFrom的写法是错的——这个字段是Pod环境变量或Volume挂载时才会用到的,Secret的data字段并不支持这种引用方式。要实现从ConfigMap获取内容生成Secret,有两种可行方案:
方式1:用kubectl命令结合ConfigMap内容生成
假设你的ConfigMap configmap_tls已经存在,里面有crt和key两个字段,如果ConfigMap里是明文内容,需要先转成base64:
# 从ConfigMap获取证书明文并转base64 CRT=$(kubectl get configmap configmap_tls -n dev -o jsonpath='{.data.crt}' | base64) # 从ConfigMap获取密钥明文并转base64 KEY=$(kubectl get configmap configmap_tls -n dev -o jsonpath='{.data.key}' | base64) # 生成Secret的YAML并应用 cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Secret metadata: name: hello-app-tls namespace: dev type: kubernetes.io/tls data: tls.crt: $CRT tls.key: $KEY EOF
方式2:用Kustomize实现自动关联
如果用Kustomize管理资源,可以通过SecretGenerator自动关联ConfigMap内容:
# kustomization.yaml apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization secretGenerator: - name: hello-app-tls namespace: dev type: kubernetes.io/tls literals: - tls.crt=$(kubectl get configmap configmap_tls -n dev -o jsonpath='{.data.crt}') - tls.key=$(kubectl get configmap configmap_tls -n dev -o jsonpath='{.data.key}')
执行kubectl apply -k .就能生成对应的Secret,Kustomize会自动处理base64编码步骤。
为什么你的写法会报错?
你尝试的这段YAML:
apiVersion: v1 kind: Secret metadata: name: hello-app-tls namespace: dev type: kubernetes.io/tls data: tls.crt: valueFrom: configMapKeyRef: name: configmap_tls key: crt tls.key: valueFrom: configMapKeyRef: name: configmap_tls key: key
错误原因是Kubernetes的Secret结构体中,data字段的类型是map[string][]uint8(即base64编码后的字节数组),而你给的是一个包含valueFrom的对象,所以无法完成解析,才会出现json: cannot unmarshal object into Go struct field Secret.data of type []uint8的错误。
备注:内容来源于stack exchange,提问作者eastwater




