Skip to content

08 公网接入(frp + 公网 Traefik)

8.1 访问链路

浏览器 https://ai-ear.cn:9010
  → 公网机 8.153.84.140 Traefik(entryPoint ep9010,TLS 证书 ai-ear.cn)
  → 127.0.0.1:19010(frps 隧道端口)
  → frp 隧道(token 认证,serverAddr 8.153.84.140:7000)
  → 宿主机 192.168.122.1 frpc 代理 jenkins-web-30880
  → RKE2 集群 NodePort 192.168.122.23:30880
  → Service jenkins:8080 → jenkins-0

8.2 配置过程

1) 宿主机(192.168.122.1,即本机)frpc

宿主机已有 frpc(/etc/frp/frpc.toml,systemd frpc.service),追加代理:

toml
# Jenkins (RKE2 集群 NodePort 30880) → 公网 19010 → Traefik ep9010
[[proxies]]
name = "jenkins-web-30880"
type = "tcp"
localIP = "192.168.122.23"
localPort = 30880
remotePort = 19010
bash
sudo systemctl restart frpc

说明:最初实现为集群内 frpc Deployment(随 Jenkins 漂移,HA 更优,清单曾位于 deploy/jenkins/frpc.yaml),后按现有基础架构惯例迁移到宿主机 frpc,集群内副本已删除。 如需恢复集群内 frpc 模式,参考 git 历史或本文 8.3 节。

2) 公网机 Traefik(8.153.84.140)

静态配置 /etc/traefik/traefik.yaml 增加入口(沿用现有 ep9xxx 模式):

yaml
entryPoints:
  ep9010:
    address: ":9010"

动态配置 /etc/traefik/dynamic.yaml 增加路由与服务:

yaml
http:
  routers:
    svc-9010:
      entryPoints: [ep9010]
      rule: "Host(`ai-ear.cn`)"
      service: svc-19010
      tls: {}
  services:
    svc-19010:
      loadBalancer:
        servers:
          - url: "http://127.0.0.1:19010"
bash
systemctl restart traefik   # 新增 entryPoint 需重启(秒级中断)
ss -tlnp | grep 9010        # 确认监听

3) Jenkins Root URL

deploy/jenkins/values.yaml 中设置(JCasC unclassified.location.url 由 chart 模板生成):

yaml
controller:
  jenkinsUrl: "https://ai-ear.cn:9010/"

helm upgrade 后生效,确保邮件/链接/Webhook 中的地址正确。

8.3 备选:集群内 frpc(HA 更优)

yaml
# deploy/jenkins/frpc.yaml(已按惯例改用宿主机 frpc,此处存档)
# ConfigMap frpc.toml: serverAddr=8.153.84.140:7000, proxy jenkins-web tcp
#   localIP=jenkins.jenkins.svc.cluster.local localPort=8080 remotePort=19010
# Deployment: image 192.168.122.156:30000/jenkins/frpc:0.69.1
  • 优点:frpc 随集群调度,单点故障自愈;直连 ClusterIP 不依赖某个节点 NodePort。
  • 注意:frps 端 proxy 名需全局唯一,迁移时先删旧副本避免 proxy already exists
  • 镜像 snowdreamtech/frpc:0.69.1 默认 entrypoint 即 frpc -c /etc/frp/frpc.toml,不要传 args。

8.4 验证

bash
curl -k -o /dev/null -w "%{http_code}\n" https://ai-ear.cn:9010/login   # 200
curl -k -u 'admin:xxx' -g 'https://ai-ear.cn:9010/api/json?tree=jobs[name]'