如何将证书文件提供给K8s集群内的Pod访问
方案选型
首先明确:优先使用Secret存储证书文件,不要用ConfigMap
原因:ConfigMap设计用于存储非敏感的明文配置数据,而证书属于敏感凭据,K8s的Secret默认会对内容做Base64编码,且支持静态加密存储到etcd、访问权限控制等安全特性,更适配证书这类敏感数据的存储需求。
具体操作步骤
步骤1:创建存储证书的Secret
两种常用创建方式,选其一即可:
方式1:直接通过本地证书文件创建(最便捷)
假设你本地的证书文件名为certificate_authority.crt,执行以下命令直接生成Secret:
kubectl create secret generic ca-cert-secret \ --from-file=certificate_authority.crt=./你的本地证书路径/certificate_authority.crt \ -n 你的Pod所在命名空间
这里--from-file的键名就是挂载到Pod里后生成的文件名,要和你需要的访问路径里的文件名一致。
方式2:通过YAML文件创建
先把本地证书内容转成Base64编码:
# Linux/Mac执行 base64 -w 0 ./你的本地证书路径/certificate_authority.crt # Windows PowerShell执行 [Convert]::ToBase64String([IO.File]::ReadAllBytes(".\你的本地证书路径\certificate_authority.crt"))
然后写Secret的YAML文件ca-cert-secret.yaml:
apiVersion: v1 kind: Secret metadata: name: ca-cert-secret namespace: 你的Pod所在命名空间 type: Opaque data: # 这里的键名就是挂载后的文件名,值为上面生成的Base64编码内容 certificate_authority.crt: 你生成的证书Base64编码内容
执行创建:
kubectl apply -f ca-cert-secret.yaml
步骤2:将Secret挂载到Pod的指定路径
修改你的Pod/Deployment的YAML配置,添加volume挂载配置,示例如下:
apiVersion: v1 kind: Pod metadata: name: your-pod-name namespace: 你的Pod所在命名空间 spec: containers: - name: your-container-name image: 你的容器镜像 # 这里配置挂载路径 volumeMounts: - name: ca-cert-volume # 你需要的证书存放目录,要访问/path/to/certificate_authority.crt就挂载到/path/to mountPath: /path/to readOnly: true # 声明引用Secret的卷 volumes: - name: ca-cert-volume secret: # 对应你前面创建的Secret名称 secretName: ca-cert-secret
配置应用后,Pod内就可以直接通过/path/to/certificate_authority.crt访问该证书文件了。
补充说明
- 如果需要同时挂载多个证书,只需要在创建Secret时添加多个
--from-file参数,或者在Secret的data字段添加多个键值对即可 - 挂载时如果不需要把Secret里的所有文件都放到目标目录,可以通过
volumes.secret.items字段指定只挂载部分文件,自定义路径和权限
内容的提问来源于stack exchange,提问作者Jenney
相关产品推荐
相关产品推荐

