王智刚

frp-ingress-controller

Misc 更新 2024年3月31日 1 分钟
目录

FRP-Ingress-Controller

是什么

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

image-20230906210739472

在上图中,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/v1
kind: Ingress
metadata:
name: redis
namespace: wanz
spec:
ingressClassName: frp
rules:
- http:
paths:
- backend:
service:
name: redis-service
port:
number: 6379
path: /
pathType: Prefix

转换后的 frpc 配置片段:

[wanz-redis-/]
name = wanz-redis-/
type = tcp
local_ip = redis-service.wanz.svc.cluster.local
local_port = 6379
remote_port = 32461

HTTP 代理

如果一个 Ingress 中包含了 Host,则使用 HTTP 代理,支持多 Path。

一个样例

原始 Ingress 定义:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: cd-tool
namespace: wanz
spec:
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 = http
local_ip = cd-tools.wanz.svc.cluster.local
local_port = 8080
subdomain = cd
locations = /

效果

支持 TCP 和 HTTP 代理基本上解决了大部分问题。

目前我们的 智能运维平台CD 工具完全运行在这个 Ingress-Controller 之下,运行效果良好。