nginx转发VNC
在kubernetes集群中跑了一些linux的容器,通过VNC可以在网页中展示桌面,但是只可以内网访问,所以需要ingress来转发映射,ingress还没有理解透,先用nginx转发配合service完成!1.使用service暴露pod的端口kind: ServiceapiVersion: v1metadata:name: vnc-servicenamespace: namespace-te
在kubernetes集群中跑了一些linux的容器,通过VNC可以在网页中展示桌面,但是只可以内网访问,所以需要ingress来转发映射,ingress还没有理解透,先用nginx转发配合service完成!
1.使用service暴露pod的端口
kind: Service
apiVersion: v1
metadata:
name: vnc-service
namespace: namespace-test
spec:
selector:
app: vnc
type: NodePort
ports:
- protocol: TCP
targetPort: 80
nodePort: 30020
port: 30020
- selector:选择映射的pod,和pod的labels一致
- targetPort:需要映射的pod端口
- nodePort: 映射到宿主机上的对外端口
- port:kubernetes网络中内网的端口
经过以上的service配置,我们可通过kubercetes nodeIP:nodePort访问这个vnc链接的pod,也可以通过kuberbetes的内网IP:port访问这个pod。但是同样的问题,这个只解决了访问的问题,并没有解决外网访问的问题!
所以对于每一个vnc后面的pod我们需使用nginx制定一套转发的规则!
2.使用nginx转发请求到对应的pod
- 添加信息:在http字段中添加以下的参数
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
这些参数是为了转发websocket设置的
- 首先看一个错误示例:
server {
listen 8087;
server_name testvnc;
location /30020{
proxy_pass http://10.1.21.31:30020;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
这一段配置本意是想要把/30020的请求直接转发到http://10.1.21.31:30020
,但是结果总是404,这里熟悉nginx用法的人一眼就看出来了。具体的区别可以自行百度,网上有很多,一看就懂了!
- 修正后的nginx配置
location /30020/{
proxy_pass http://10.1.21.31:30020/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
但是在学习过程中我还想到了另一个办法,就是在location中使用if来对携带的参数进行判断,从而达到转发的目的,但是因为不能再proxy_pass后面加 / (变成proxy_pass http://10.1.21.31:30020/;
),没能成功!贴出if的配置,希望大佬们可以给点修改意见:
location /{
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
if ($arg_port = "30020"){
proxy_pass http://10.1.21.31:30020;
}
if ($arg_port = "30021"){
return 502 '{"status":502,"msg":$dest_port}';
}
proxy_pass http://10.1.21.152;
}
3. 使用frp进行端口映射
这个比较简单,由于在nginx中做好了映射,所以只需要映射nginx中监听的服务端口就可以。
至此,你的kubernetes中的pod就可以在外网访问到了!
更多推荐
所有评论(0)