自建k3s运行Gitlab CI时PostgreSQL连接被拒绝如何解决?
问题解决方案
你遇到的postgres域名解析到127.0.0.1的问题,是自建k3s集群部署的GitLab Runner(Kubernetes执行器)的服务网络解析规则不匹配导致的,可按以下步骤排查修复:
- 第一步:先验证域名解析状态
在你的.gitlab-ci.yml的before_script段加入以下命令,确认解析结果:
运行CI任务后查看输出,确认before_script: # 新增以下两行 - cat /etc/hosts - ping -c 3 postgres || echo "postgres域名解析异常" # 原有命令保留 - ruby -v - cp config/database.yml.ci config/database.yml - apt-get update -q && apt-get install nodejs -yqq - gem install bundler:2.0.2 - bundle install -j $(nproc) --path vendorpostgres对应的IP记录是否被错误绑定到127.0.0.1。 - 第二步:显式指定PostgreSQL服务别名
默认配置下Kubernetes执行器可能无法自动匹配postgres作为服务主机名,修改.gitlab-ci.yml的services配置,强制指定别名:services: - name: postgres:12.3 alias: postgres - 第三步:检查k3s部署的GitLab Runner配置
如果你是通过Helm chart安装的GitLab Runner,检查values.yaml的以下配置项:- 确认未开启
disableAutoHostAliases,该配置会关闭自动注入服务域名到任务容器的hosts记录 - 确认
dnsPolicy设置为ClusterFirstWithHostNet(如果Runner用了hostNetwork)或默认的ClusterFirst - 确认没有配置自定义的hosts挂载覆盖了postgres的解析记录
- 确认未开启
- 第四步:适配数据库配置的环境变量读取
修改database.yml.ci的host配置,优先读取GitLab CI自动注入的服务地址环境变量,避免硬编码域名解析异常:default: &default adapter: postgresql encoding: unicode username: postgres password: postgres host: <%= ENV.fetch('POSTGRES_PORT_5432_TCP_ADDR', 'postgres') %> port: <%= ENV.fetch('POSTGRES_PORT_5432_TCP_PORT', 5432) %> pool: 5 database: ci_db test: <<: *default database: ci_Test - 第五步:添加PostgreSQL启动等待逻辑
避免PostgreSQL服务未完全启动就执行数据库操作,在before_script段增加等待命令:before_script: # 原有命令后新增 - apt-get update -q && apt-get install -yqq postgresql-client - until pg_isready -h <%= ENV.fetch('POSTGRES_PORT_5432_TCP_ADDR', 'postgres') %> -U postgres; do sleep 2; done
内容的提问来源于stack exchange,提问作者SitephenD77
相关产品推荐
相关产品推荐

