k8s部署frps
虽然已经基于WireGuard将家里的本地网络同云服务器连接在了一起,但是由于内网穿透始终不是wg的强项,且一些情况下依旧需要P2P形式的内网穿透,所以目光就又回到了老朋友frp上来了,毕竟我的需求比较简单且frp用着习惯感觉也很稳定。
类似的内网穿透软件还有Ngrok、n2n等,都是大同小异的中心服务器架构,区别在支持的功能以及是否有官方节点等服务。当然非官方的服务还是有挺多的,只是简单的用一用可以考虑。
frp的server即frps,需要部署在具备公网ip的环境下。回到Homelab的结构,一个master和worker都有公网ip,所以当然就要部署在这个公网worker上。
而在怎么把frps服务暴露出去这个问题上属实折腾了很久,说到底还是对k8s的service不理解所致。frps支持几乎常用的所有协议,基本使用情境下就仅聚焦于TCP、UDP以及HTTP就行了,其中HTTP视作TCP流量即可。集群ingress使用的是ingress-nginx,文档中提及可以做L4的lb,但是不推荐,尝试后发现一个的lb类型的ingress的svc仅可以支持一种协议,即TCP和UDP不能共存。随后查阅了traefik、kong、istio等,虽然有的具备L4负载均衡能力,但是都不是主责主业,且发觉并没必要增加那么多复杂性,尤其是istio还需要更改整个集群的CNI。回到service上来,service所支持的类型有LoadBalancer、ClusterIP、NodePort、ExternalName以及比较特殊的headless,headless主要是用于自定义服务负载均衡等这里不谈;LoadBalancer需要云服务商提供所以我也没有;ExternalName用来引入集群外部服务;ClusterIP将服务暴露给集群内部的其他服务,这种情况就可以使用ingress来均衡;NodePort将服务短裤暴露在每个node的指定端口上,访问地址即为NodeIP:SVC-Port
。
总结下来,就是把frps跑在集群的公网节点里并用NodePort形式暴露服务。同时对于frps暴露出来的http服务,需要配置ingress以供访问,这里可以利用到ingress的自动https进行加密,部署还是用helm v3。
添加helm repo
还是用了自建的helm repo:
1 | helm repo add clemon https://helm-charts.clemon.icu |
搜索下frps的chart:
ok~出来了
修改配置并部署
- frps监听端口位于
frps.bind
字段下,需同时配置pod上的端口和svc上的端口,映射的NodePort由k8s自动分配。 - 对于http服务,
frps.httpEndpoint.hosts
字段下依次添加即可,注意host要写全。 - 对于自定义端口的服务,在
frps.ports
字段下添加,映射的NodePort由k8s自动分配。 - 服务端配置储存在config中,将配置写入
frps.config
字段下即可。注意部署后手动修改configMap不会痛不到本地的values.yaml,且手动修改后需要重启pod。
配置:
1 | image: |
部署
1 | helm upgrade --install frps clemon/frps -n frps --create-namespace -f frps-values.yaml |
查看部署列表
没有在ingress上暴露dashboard的话可以用kubectl port-forward
来访问,NodePort
暴露的端口可以在部署输出的信息里找到命令查找。
截止写文章时,frps版本为0.38.0
,添加了/healthz
健康检查endpoint但是藏在dashboard的basic auth后面了就很尴尬,所以现在如果启用健康检查的话就不能开启dashboard的basic auth,提了Issue处理了这个问题,等下一个小版本就好了。
客户端连接
在本机起一个frpc,暴露一个http以测试
1 | [common] |
启动连接:
访问:
完美~