如何将GitLab CI/CD自定义变量正确传入K8s YAML配置文件
问题根因
GitLab CI执行kubectl apply时只会读取仓库内存储的静态YAML文件原始内容,不会自动替换文件中写的$PW_TEST占位符,因此提交到k3s集群的ConfigMap会完整保留$PW_TEST字符串,不会注入你在CI/CD Variables中配置的实际值。
另外你当前流水线作业里写的variables: PW_TEST: $PW_TEST是冗余配置,GitLab CI默认会把项目级配置的CI变量自动注入作业运行环境,不需要额外手动赋值。
解决方案
根据你后续要传入密码类敏感信息的需求,分场景给你可直接落地的方案:
方案1:非敏感配置快速替换(适合当前测试场景)
用envsubst工具在apply前动态替换YAML里的占位符,不需要修改仓库里的原始文件,直接通过管道把替换后的内容传给kubectl执行即可。
- 首先在alpine镜像的依赖安装步骤里加上
gettext包(envsubst在这个包里) - 把原来直接apply index.yml的命令改成替换后管道传入
修改后的流水线script段参考:
script: - echo $PW_TEST - curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" - install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl # 安装envsubst依赖 - apk add --no-cache gettext - kubectl --kubeconfig $CONF_INT_JK --insecure-skip-tls-verify apply -f nm.yml # 动态替换变量后直接apply,不生成落地的临时文件 - envsubst < index.yml | kubectl --kubeconfig $CONF_INT_JK --insecure-skip-tls-verify apply -f - - kubectl --kubeconfig $CONF_INT_JK --insecure-skip-tls-verify apply -f depl.yml - kubectl --kubeconfig $CONF_INT_JK --insecure-skip-tls-verify apply -f svc.yml - kubectl --kubeconfig $CONF_INT_JK --insecure-skip-tls-verify apply -f test_ingress_int.yml
注意:如果变量值包含$、&、空格这类特殊字符,envsubst可能出现转义异常,且这个方案会把变量值明文写进ConfigMap,不适合密码类敏感信息。
方案2:敏感信息部署方案(后续传数据库密码等场景推荐)
密码、密钥这类敏感信息不要存在ConfigMap里,也不要通过替换明文到YAML的方式部署,遵循以下方式处理:
- Kubernetes层面:敏感信息统一存Secret,不要把包含敏感值的Secret YAML提交到仓库,直接在CI流程里动态生成、应用Secret:
# 示例:动态创建存储敏感信息的Secret,值直接从CI变量读取,全程不落地到仓库文件 kubectl --kubeconfig $CONF_INT_JK --insecure-skip-tls-verify create secret generic app-secrets \ --namespace lazzio \ --from-literal=pw_test=$PW_TEST \ --dry-run=client -o yaml | kubectl apply -f -
后续Deployment、Pod里可以通过环境变量、文件挂载的方式读取Secret里的值,全程不会在仓库里留存明文敏感信息。
- Ansible部署层面:不需要把密码写在Ansible的变量文件里,直接在CI执行ansible-playbook时通过命令行传参注入敏感变量即可:
ansible-playbook deploy_database.yml -e "db_admin_pass=$PW_TEST"
Ansible执行时会直接读取这个传入的参数,不会把值写入任何仓库托管的文件。
内容的提问来源于stack exchange,提问作者ladislav
相关产品推荐
相关产品推荐

