You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes+Traefik配置GitLab SSL透传问题咨询

问题:Traefik配置GitLab SSL透传实现类似OpenShift Passthrough Route效果

环境信息

  • Kubernetes: 1.25
  • Traefik: 2.8.7
  • 域名:gitlab.mydomain-prod.dk(已持有该域名证书)

GitLab Service配置:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: gitlab-ce
  name: gitlab-ce
  namespace: gitlab
spec:
  clusterIP: 10.98.93.9
  clusterIPs:
  - 10.98.93.9
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - name: port-1
    port: 80
    protocol: TCP
    targetPort: 80
  - name: port-2
    port: 443
    protocol: TCP
    targetPort: 443
  selector:
    app: gitlab-ce
  sessionAffinity: None
  type: ClusterIP

问题背景

初始配置中GitLab的gitlab.rb设置为external_url 'http://gitlab.mydomain-prod.dk',对应Traefik IngressRoute配置如下,此时可正常访问https://gitlab.mydomain-prod.dk:

apiVersion: v1
items:
- apiVersion: traefik.containo.us/v1alpha1
  kind: IngressRoute
  metadata:
    name: gitlab-ingress
    namespace: gitlab
  spec:
    entryPoints:
    - websecure
    routes:
    - kind: Rule
      match: Host(`gitlab.mydomain-prod.dk`) && PathPrefix(`/`)
      priority: 1
      services:
      - name: gitlab-ce
        port: 80
    tls:
      secretName: gitlab-test-cert

修改gitlab.rb为external_url 'https://gitlab.mydomain-prod.dk'后,GitLab自身开始监听443端口并处理SSL,此时原有IngressRoute访问出现502 Bad Gateway错误,需要配置Traefik实现SSL透传(类似OpenShift的oc create route passthrough效果)。

解决方案

要实现SSL透传,需要使用Traefik的IngressRouteTCP资源(四层TCP路由),让Traefik直接将TLS流量转发到GitLab的443端口,而不是在Traefik层终止SSL。

1. 确认Traefik已启用TCP入口点

确保Traefik的配置中已经启用了websecure对应的TCP入口点(默认websecure绑定443端口,协议为TCP),若通过Helm安装,可在values.yaml中确认:

ports:
  websecure:
    port: 443
    expose: true
    exposedPort: 443
    protocol: TCP

2. 创建IngressRouteTCP配置

替换原有HTTP类型的IngressRoute,创建如下TCP路由:

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRouteTCP
metadata:
  name: gitlab-tcp-ingress
  namespace: gitlab
spec:
  entryPoints:
    - websecure
  routes:
    - match: HostSNI(`gitlab.mydomain-prod.dk`)
      services:
        - name: gitlab-ce
          port: 443

3. 验证配置

  • 删除原有HTTP类型的IngressRoute:
    kubectl delete ingressroute gitlab-ingress -n gitlab
    
  • 应用新的IngressRouteTCP:
    kubectl apply -f gitlab-tcp-ingress.yaml
    
  • 访问https://gitlab.mydomain-prod.dk,确认可以正常访问,此时SSL证书由GitLab自身提供,Traefik仅做流量转发。

关键说明

  • HostSNI:TCP路由通过SNI匹配域名,这是四层TLS透传的核心匹配规则,对应OpenShift Passthrough Route的逻辑。
  • 无需在Traefik配置中指定TLS Secret:因为SSL终止在GitLab端,Traefik只负责转发原始TLS流量。
  • 确保GitLab的证书配置正确:gitlab.rb中已正确配置证书路径,GitPod容器内443端口正常监听。

内容的提问来源于stack exchange,提问作者johnny bravo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 09:42:42