如何用kubectl create secret创建带目录结构的多组公私钥Secret
结论
完全可以通过原生kubectl create secret generic实现目标目录结构,不需要修改容器内业务逻辑,K8s原生支持Secret键的层级路径映射。
实现方式
方式1:创建Secret时直接指定带层级的键名
K8s Secret的键名支持包含/字符,当Secret被挂载为卷时,键名里的/会被自动识别为目录分隔符,生成对应的子目录结构。
创建Secret时,你可以给每个密钥文件指定带路径前缀的键,语法为--from-file=[自定义键名]=[本地文件路径],示例命令如下:
kubectl create secret generic multi-keys-secret \ --from-file=1/public.key=./keys/1/public.key \ --from-file=1/private.key=./keys/1/private.key \ --from-file=2/public.key=./keys/2/public.key \ --from-file=2/private.key=./keys/2/private.key \ # 后续按相同格式追加第3到第n对密钥即可
创建完成后,Pod的卷挂载配置只需要把secretName替换为新创建的multi-keys-secret即可,注意修正你原有配置的缩进错误(secretName必须是secret字段的子属性,不能同级),正确配置如下:
spec: volumes: - name: my-keys secret: secretName: multi-keys-secret containers: # 其余容器配置保持不变 volumeMounts: - name: my-keys readOnly: true mountPath: "/keys"
挂载完成后进入容器查看/keys目录,就是你需要的/keys/[编号]/public.key、/keys/[编号]/private.key层级结构,文件访问方式和之前单对密钥完全一致。
方式2:挂载时通过items字段自定义路径
如果你不想重建已有Secret,也可以直接在Pod的卷配置中通过items字段,给Secret里的每个密钥单独指定挂载的相对路径,不需要调整Secret本身,示例配置如下:
spec: volumes: - name: my-keys secret: secretName: my-existing-keys-secret # 替换为你已存了所有密钥的Secret名称 items: - key: pub1 # 对应Secret中存储的第1对公钥的键名 path: 1/public.key - key: pri1 # 对应Secret中存储的第1对私钥的键名 path: 1/private.key - key: pubn path: n/public.key - key: prin path: n/private.key containers: # 其余容器配置保持不变 volumeMounts: - name: my-keys readOnly: true mountPath: "/keys"
注意:使用
items字段时,只有显式列在items列表里的密钥会被挂载到目录中,未列出的密钥不会出现在/keys路径下,需要确保所有需要访问的密钥都配置了对应的path规则。
内容的提问来源于stack exchange,提问作者Arya
相关产品推荐
相关产品推荐

