根文件系统只读时如何向POD/Container的证书存储中添加证书
只读根文件系统下.NET Core添加证书报错及emptyDir配置错误解决方案
一、证书添加失败的解决方法
报错的核心原因是.NET Core向系统证书存储写入数据时,根文件系统只读没有写入权限,可选择以下任意方案解决:
- 方案1:挂载可写临时存储到证书存储路径
非root用户运行.NET程序时,证书默认写入/home/[运行用户ID]/.dotnet/corefx/cryptography/x509stores目录,新增emptyDir类型卷挂载到该路径即可获得写入权限。如果需要适配不同运行用户或者.NET版本,可设置环境变量DOTNET_X509STORE_PATH为自定义的可写挂载路径,适配性更强。 - 方案2:修改代码跳过写入系统存储
不需要将证书添加到系统存储,直接在代码中使用内存中的证书实例即可。比如HTTPS请求时直接给HttpClientHandler.ClientCertificates添加当前加载的cert对象,不需要调用AddCertificate写入系统存储,完全避免磁盘写入操作。 - 方案3:预构建证书到镜像(仅适用于固定证书场景)
如果使用的是固定证书,可以在构建容器镜像阶段就将证书导入到系统存储,运行阶段不需要再执行写入操作。该方案不适用需要从Azure KeyVault动态拉取证书的场景。
二、emptyDir配置报错修复
报错原因
Kubernetes要求同一个Volume只能声明一种类型,你当前给secrets-store这个Volume同时配置了csi和emptyDir两种类型,触发了规则校验报错。
正确配置方式
单独新增一个独立的emptyDir类型Volume,不要和CSI类型的Volume合并配置,参考配置如下:
spec: template: spec: containers: - name: your-net-core-app volumeMounts: # 原有CSI密钥存储挂载,保留不动 - name: secrets-store mountPath: /app/certs # 新增可写卷挂载到.NET证书存储路径 - name: x509-write-store mountPath: /home/1000/.dotnet/corefx/cryptography/x509stores securityContext: privileged: false readOnlyRootFilesystem: true allowPrivilegeEscalation: false runAsNonRoot: true runAsUser: 1000 volumes: # 原有CSI卷配置,删除错误添加的emptyDir: {} - name: secrets-store csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: azure-kvname # 新增独立的emptyDir卷 - name: x509-write-store emptyDir: {}
内容的提问来源于stack exchange,提问作者user584018
相关产品推荐
相关产品推荐

