GitLab CI/CD部署后获取自定义子域名的方案咨询
解决方案思路
一、自动DNS配置方案
解决子域名解析的核心是要么自动添加DNS记录,要么用通配符批量覆盖:
- 动态DNS更新:搭建本地DNS服务器(Bind9/CoreDNS),允许GitLab Runner通过脚本动态添加A记录。比如用Bind9时,配置允许服务器B的IP进行动态更新,CI流水线中执行以下脚本提交记录:
用CoreDNS可结合etcd做后端,CI脚本往etcd写入DNS记录后,CoreDNS自动同步生效。nsupdate -k /path/to/dns-key.conf << EOF server dns.domain.my update add ${PROJECT_SLUG}-${BRANCH_SLUG}.git.domain.my 300 A 192.168.1.100 send EOF - 通配符DNS记录:直接在域名服务商处配置
*.git.domain.my指向服务器B的IP,所有符合格式的子域名都会解析到目标服务器,无需逐个添加记录(适合快速验证,缺点是无法区分同IP上的过期资源,需配合后续清理机制)。
二、反向代理自动适配(Docker/K8s通用)
1. Docker部署场景
- 手动生成Nginx配置:在CI流水线中部署应用容器后,自动生成对应子域名的Nginx server配置,然后重载Nginx:
# 生成配置文件 cat > /etc/nginx/conf.d/${SUB_DOMAIN}.conf << EOF server { server_name ${SUB_DOMAIN}; location / { proxy_pass http://${APP_CONTAINER_IP}:8080; proxy_set_header Host \$host; proxy_set_header X-Real-IP \$remote_addr; } } EOF # 重载Nginx nginx -s reload - 自动反向代理工具:用
jwilder/nginx-proxy镜像,它监听Docker事件,当启动带VIRTUAL_HOST环境变量的应用容器时,自动生成Nginx配置并重载:# 启动代理容器 docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy # 启动应用容器时指定子域名 docker run -d -e VIRTUAL_HOST=${SUB_DOMAIN} your-app-image:${BRANCH_NAME}
2. Kubernetes部署场景
用Nginx Ingress Controller实现动态路由:
- 在CI流水线中动态生成Ingress资源YAML,通过
kubectl提交到集群:
提交后Ingress Controller会自动配置反向代理规则,无需手动修改Nginx配置。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ${PROJECT_SLUG}-${BRANCH_SLUG}-ingress spec: rules: - host: ${SUB_DOMAIN} http: paths: - path: / pathType: Prefix backend: service: name: ${PROJECT_SLUG}-${BRANCH_SLUG}-service port: number: 80
三、CI/CD流水线核心细节
- 子域名规范化:利用GitLab预定义变量生成合规子域名,替换分支名中的特殊字符:
BRANCH_SLUG=$(echo $CI_COMMIT_BRANCH | tr '/_' '-') SUB_DOMAIN="${CI_PROJECT_NAME}-${BRANCH_SLUG}.git.domain.my" - 资源清理:添加分支删除/合并触发的流水线任务,清理对应DNS记录、Nginx配置、Docker容器或K8s资源,避免资源冗余。
四、备选方案:静态应用用GitLab Pages
如果是静态Web应用,可直接用GitLab Pages,配置通配符DNS指向GitLab Pages服务器后,就能通过${PROJECT_NAME}-${BRANCH_NAME}.git.domain.my访问,无需额外部署反向代理。
内容的提问来源于stack exchange,提问作者Luca Octavian
相关产品推荐
相关产品推荐

