在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中监听的服务端口就可以。

我之前写的一个frp相关博客

至此,你的kubernetes中的pod就可以在外网访问到了!

Logo

开源、云原生的融合云平台

更多推荐