如何用K8s Python Client将YAML文件编码为Secret?
正确使用Kubernetes Python Client创建包含YAML文件的Secret
Kubernetes Secret的data字段要求每个值是文件原始二进制内容的Base64编码字符串,这和kubectl--from-file的行为完全一致——kubectl会直接读取文件的原始内容做Base64编码,而非解析YAML后再处理。你的问题出在没有对齐这个逻辑,下面是正确的实现方式:
核心步骤
- 读取YAML文件的原始字节内容(不要解析成字典)
- 对原始字节进行Base64编码,转成UTF-8字符串
- 构造Secret对象时,将编码后的字符串放入
data字段对应键下
示例代码
from kubernetes import client, config import base64 # 加载K8s配置(集群内运行请用load_incluster_config) config.load_kube_config() v1 = client.CoreV1Api() # 读取YAML文件原始内容并编码 with open("my-values.yaml", "rb") as f: raw_yaml_content = f.read() encoded_content = base64.b64encode(raw_yaml_content).decode("utf-8") # 构造Secret对象 secret_body = client.V1Secret( api_version="v1", kind="Secret", metadata=client.V1ObjectMeta(name="values"), data={"my-values.yaml": encoded_content} ) # 创建Secret(替换为你的目标namespace) v1.create_namespaced_secret(namespace="default", body=secret_body)
错误原因说明
- 直接传YAML解析后的字典:Secret的
data字段仅接受Base64编码字符串,K8s会尝试将字典当作待解码内容处理,自然触发Base64解码错误。 - 编码解析后的字典:你编码的是字典的字符串表示(比如
str(parsed_dict)),而非原始YAML文件的字节内容,这和kubectl的处理逻辑不符,导致K8s识别为格式错误。
内容的提问来源于stack exchange,提问作者zappa
相关产品推荐
相关产品推荐

