FRP-Ingress-Controller
是什么
一个基于 FRP 的 Kubernetes Ingress 控制器。可以帮助开发者将本地 Kubernetes 集群的服务暴露到互联网。

在上图中,FRP-Ingress-Controller 实际上只有中间蓝色的部分,包括一个 Controller 和一个 FRPC 客户端。
Controller 和 FRPC 是两个不同的进程。
Controller 基于 Go 实现,会监听集群中所有的 Ingress 事件,并且对这些 Ingress 进行过滤,然后根据有效的 Ingress 的内容生成 FRP 的 Proxy 配置,下发至 FRPC 并通知 FRPC 热加载配置。
在实际使用中,我们选择在 FRPS 之前再加一层 Nginx 来提供 HTTPS 的支持。
功能
- 支持 TCP 代理
- 支持 HTTP 代理
- 支持子域名
- 支持原生 Ingress
- 支持混合配置,用户自定义 + 自动发现
TCP 代理
这是默认的代理方式,controller 会随机选择一个 remotePort 下发给 frpc。
为了避免端口冲突,controller 会维护一个 proxyName<—>remotePort 的双向 map。
local 侧则对应着某个 K8S Service 。
一个样例
原始 Ingress 定义:
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: redis namespace: wanzspec: ingressClassName: frp rules: - http: paths: - backend: service: name: redis-service port: number: 6379 path: / pathType: Prefix转换后的 frpc 配置片段:
[wanz-redis-/]name = wanz-redis-/type = tcplocal_ip = redis-service.wanz.svc.cluster.locallocal_port = 6379remote_port = 32461HTTP 代理
如果一个 Ingress 中包含了 Host,则使用 HTTP 代理,支持多 Path。
一个样例
原始 Ingress 定义:
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: cd-tool namespace: wanzspec: ingressClassName: frp rules: - host: cd.platform.bupt.site http: paths: - backend: service: name: cd-tools port: number: 8080 path: / pathType: Prefix转换后的 frpc 配置片段:
[wanz-cd-tool-/]name = wanz-cd-tool-/type = httplocal_ip = cd-tools.wanz.svc.cluster.locallocal_port = 8080subdomain = cdlocations = /效果
支持 TCP 和 HTTP 代理基本上解决了大部分问题。