You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Kubernetes中如何将TLS类型Secret的证书/密钥与文件或ConfigMap关联?

Kubernetes中如何将TLS类型Secret的证书/密钥与文件或ConfigMap关联?

嗨,我来帮你捋清楚这个问题~你尝试的两种写法都不符合Kubernetes Secret的规范,所以才会出现那个解析错误,下面分别说正确的处理方式:

一、从本地文件创建TLS类型Secret

你直接在YAML的tls.crttls.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已经存在,里面有crtkey两个字段,如果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

火山引擎 最新活动