GitHub Actions中生成证书用于Azure K8s Helm部署失败求助
GitHub Actions生成证书用于Helm部署的问题解决方案
一、脚本指定仓库路径时文件的存储位置
- GitHub Actions的所有步骤运行在同一个runner的工作区中,工作区路径由环境变量
${GITHUB_WORKSPACE}指定,默认是仓库代码checkout后的根目录。 - 如果脚本用相对路径(比如
./certs/my-cert.pem),文件会直接保存在工作区的对应子目录;如果写的是包含仓库路径的绝对路径,实际也会映射到runner工作区的对应位置。 - 同一个Job内的后续步骤可以直接通过该路径访问文件,比如用
ls ${GITHUB_WORKSPACE}/certs验证文件是否生成成功。
二、临时保存文件满足部署需求的方法
因为所有步骤在同一个Job中,直接利用runner工作区即可,无需额外持久化手段,关键是确保后续Helm步骤能正确引用文件:
方法1:通过Helm --set-file注入证书内容
生成证书后,用--set-file参数将本地文件内容传入Chart的values:
# 先创建证书存储目录(避免路径不存在报错) mkdir -p ./certs # 生成证书示例脚本 openssl req -x509 -newkey rsa:4096 -keyout ./certs/my-key.pem -out ./certs/my-cert.pem -days 365 -nodes -subj "/CN=my-domain.com" # Helm部署时注入证书内容 helm install my-release ./my-chart \ --set-file tls.certificate=./certs/my-cert.pem \ --set-file tls.privateKey=./certs/my-key.pem
在Helm Chart中,可通过{{ .Values.tls.certificate }}和{{ .Values.tls.privateKey }}引用内容,将其写入Secret或直接挂载到Pod。
方法2:先创建K8s Secret再挂载到Chart
直接用kubectl生成包含证书的Secret,再让Helm Chart挂载该Secret:
# 生成证书后创建K8s Secret kubectl create secret tls my-tls-secret \ --cert=./certs/my-cert.pem \ --key=./certs/my-key.pem \ --namespace=your-target-namespace # Helm部署时指定使用该Secret(需Chart支持配置secret名称) helm install my-release ./my-chart \ --set tls.secretName=my-tls-secret
在Chart的deployment.yaml中配置挂载:
volumes: - name: tls-certs secret: secretName: {{ .Values.tls.secretName }} containers: - name: my-app volumeMounts: - name: tls-certs mountPath: /etc/tls readOnly: true
三、部署失败的排查步骤
- 验证证书生成状态:在生成证书的步骤后添加
ls -l ./certs命令,查看GitHub Actions日志确认文件存在且大小正常。 - 检查Helm参数正确性:确认文件路径无拼写错误,Helm步骤的工作目录默认是仓库根目录,相对路径需匹配。
- 查看K8s Pod事件:部署后执行
kubectl describe pod <pod-name>,排查是否有MountVolume.SetUp failed等挂载错误,确认Secret是否存在、挂载路径是否合法。 - 检查应用日志:用
kubectl logs <pod-name>查看应用启动日志,确认是否是证书读取权限不足、格式不兼容或路径不匹配。 - 核对Chart配置:确保Chart中Volume的挂载路径与应用预期的证书路径一致,Secret的键名(比如
tls.crt/tls.key)符合K8s规范或应用要求。
内容的提问来源于stack exchange,提问作者Cha26
相关产品推荐
相关产品推荐

