搬砖小抄

内网k8s集群中使用frp代理公网请求

字数统计: 550阅读时长: 2 min
2020/04/27 Share

公司的某个微服务运行在公司内网的容器网络中,该微服务需要接收某个第三方服务的推送消息。显然,那个第三方服务器无法直接推送消息,需要打通网络

  • 在公网部署FRP服务端(FRPS)
  • 在K8S集群中部署FRP客户端(FRPC)

预期效果如下

配置脚本

nginx 配置脚本

/etc/nginx/conf.d/frp-proxy.conf

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 80;
server_name frp1.example.com,frp1.example.com,frp1.example.com;
location / {
proxy_pass http://127.0.0.1:47000/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Authorization $http_authorization;
}
}
  • 此处我们配置了三个虚拟主机,以备将来使用
  • 虚拟主机名称需要报给第三放服务厂商(比如接入微信支付时,在微信后台填写)

FRP服务端配置脚本

frps.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
[common]
bind_port = 47000
# 客户端密码
token = 12344321
subdomain_host = example.com
# 控制台
dashboard_port = 47500
dashboard_user = admin
dashboard_pwd = 11223344
# 其他可选参数
allow_ports = 2000-3000,3001,3003,51000-52500
vhost_http_port = 47008
vhost_https_port = 47003

FRP客户端配置脚本

frpc.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[common]
# frp服务端地址
server_addr = 10.11.12.200
server_port = 47000
# 客户端密码,需要和服务端配置一致
token = 12344321
#log_file = ./frpc.log
log_level = debug
[web1]
type = http
# 二级域名
subdomain = frp1
# http请求转发地址
local_ip = nyx-pay
local_port = 8080

注意:

  • 配置文件的中二级域名是frp1,结合服务端配置,对应的完整域名是frp1.example.com,也就是说来自frpnet1.example.com的请求会转发到此客户端。
  • frp客户端收到请求后,会再次转发到http://nyx-pay:8080,此处nyx-pay是主机名,也是我们的微服务在k8s集群中的名称,端口8080是微服务的容器内端口,因为frp客户端也运行在k8s容器网络中。
  • 如果需要测试,可以在浏览器输入http://frp1.example.com/${你的接口地址}来看看配置是否成功。

FRP客户端K8S部署脚本

篇幅所限,K8S部署略过,下面是frp客户端的容器启动命令,K8S按照这个思路部署就行了。

1
2
3
4
docker run --rm --name frp-client \
-v /opt/frp/conf:/opt/frp/conf \
vimagick/frp \
./frpc -c /opt/frp/conf/frpc.ini

注意先将上面的frpc.ini放到/opt/frp/conf

CATALOG
  1. 1. 配置脚本
    1. 1.1. nginx 配置脚本
    2. 1.2. FRP服务端配置脚本
    3. 1.3. FRP客户端配置脚本
    4. 1.4. FRP客户端K8S部署脚本