1. Kubernetes Secret 简介

在 Kubernetes 中,Secret 是用于存储敏感信息(如 API Key、密码、证书等)的核心资源类型。通过 Secret,我们可以将敏感信息与应用代码分离,提升安全性和可维护性。

但有时在创建 Secret 时,会遇到一个常见的错误:

Illegal Base64 Data

这个错误通常是因为我们传入的数据没有正确进行 Base64 编码。本文将解释这个错误的原因,并提供几种有效的解决方法。

2. Secret 类型概述

Kubernetes 支持多种 Secret 类型,最常见的是:

  • Opaque:默认类型,用于存储任意用户定义的敏感信息(如 API Key、数据库凭证),需要手动进行 Base64 编码。
  • kubernetes.io/tls:用于存储 TLS 证书和私钥。
  • kubernetes.io/dockerconfigjson:用于存储访问私有 Docker 仓库的认证信息。

本文以最常见的 Opaque 类型为例进行说明。

3. “Illegal Base64 Data” 错误分析

当你在创建 Secret 时,如果 YAML 文件中的 data 字段值不是合法的 Base64 编码字符串,就会触发该错误。

常见原因包括:

✅ 数据未使用 Base64 正确编码
✅ 编码后的字符串包含非法字符
✅ 编码字符串长度不是 4 的倍数(Base64 标准要求)

例如,下面是一个错误的 Secret 定义示例:

apiVersion: v1
kind: Secret
metadata:
  name: dummy-secret
type: Opaque
data:
  API_KEY: af76fsdK_cQ89_Hj1Aq
  API_SECRET: bsdfmkwegwegwe

使用 kubectl create -f dummy-secret.yaml 创建时,可能会报错:

Error from server (BadRequest): error when creating "dummy-secret.yaml": ...
decode base64: illegal base64 data at input byte 8...

这说明 API_KEYAPI_SECRET 的值并不是合法的 Base64 编码字符串。

4. Base64 编码基础

Base64 是一种将二进制数据转换为 ASCII 字符串的编码方式。Kubernetes Secret 的 data 字段要求必须使用 Base64 编码。

4.1 编码命令

在 Linux 或 macOS 上,可以使用如下命令进行编码:

echo -n 'your_data' | base64

⚠️ 注意:-n 参数用于避免在字符串末尾添加换行符,否则会导致编码错误。

4.2 解码命令

你可以通过如下命令验证编码是否正确:

echo 'b3VyX2RhdGE=' | base64 -d

输出应为原始明文内容。

5. 正确创建 Secret 的步骤

5.1 手动编码并更新 YAML

先对敏感数据进行 Base64 编码:

echo -n 'mega_secret_key' | base64
# 输出: bWVnYV9zZWNyZXRfa2V5

然后将编码结果填入 YAML 文件中:

apiVersion: v1
kind: Secret
metadata:
  name: dummy-secret
type: Opaque
data:
  API_KEY: bWVnYV9zZWNyZXRfa2V5
  API_SECRET: cmVhbGx5X3NlY3JldF92YWx1ZTE=

最后使用 kubectl 创建 Secret:

kubectl create -f dummy-secret.yaml

5.2 验证 Secret 是否创建成功

可以使用以下命令查看 Secret 内容:

kubectl get secret dummy-secret -o yaml

6. 使用 stringData 简化 Secret 创建

如果你不想手动处理 Base64 编码,Kubernetes 提供了一个更友好的字段:stringData

它允许你直接以明文方式输入敏感信息,Kubernetes 会自动将其编码为 Base64 并合并到 data 字段中。

6.1 示例:使用 stringData

apiVersion: v1
kind: Secret
metadata:
  name: dummy-secret
type: Opaque
stringData:
  API_KEY: mega_secret_key
  API_SECRET: really_secret_value1

创建 Secret:

kubectl create -f dummy-secret.yaml

6.2 stringDatadata 的优先级

如果在同一个 YAML 文件中同时存在 stringDatadata 字段,Kubernetes 会优先使用 stringData 中的值,并覆盖 data 中相同 key 的内容。

例如:

apiVersion: v1
kind: Secret
metadata:
  name: example-secret
type: Opaque
data:
  API_KEY: YmFzZTY0X2VuY29kZWRfdmFsdWU=
stringData:
  API_KEY: plaintext_value
  API_SECRET: another_plaintext_value

最终生效的值为:

  • API_KEY: plaintext_value(被 Base64 编码)
  • API_SECRET: another_plaintext_value(被 Base64 编码)

⚠️ 注意:data 字段中的原始值将被忽略。

7. 总结

  • Secret 的 data 字段必须使用合法的 Base64 编码字符串
  • 常见错误原因包括:非标准编码、非法字符、长度不合法
  • 使用 echo -n | base64 可以确保正确编码
  • 使用 stringData 字段可以简化 Secret 的创建过程
  • stringData 会覆盖 data 中同名 key 的内容

建议:在生产环境中,推荐使用工具或脚本自动生成 Secret,避免手动编码错误。同时,也可以使用 Helm、Kustomize 等工具来统一管理 Secret。


原始标题:Resolving Illegal Base64 Data Error When Creating Kubernetes Secrets