k8s编程operator实战之云编码平台——③Code-Server Pod访问实现

news2024/11/24 0:14:43

文章目录

    • 1、openresty介绍和安装
    • 2、实现code-server的反向代理
    • 3、动态反向代理实现
      • 启动多个code-server访问

k8s编程operator系列:
k8s编程operator——(1) client-go基础部分
k8s编程operator——(2) client-go中的informer
k8s编程operator——(3) 自定义资源CRD
k8s编程operator——(4) kubebuilder & controller-runtime
k8s编程operator实战之云编码平台——①架构设计
k8s编程operator实战之云编码平台——②controller初步实现
 
        在上一节中实现了controller的逻辑,可以通过grpc来创建、删除工作空间以及查询信息。接下来要实现的就是如何访问到工作空间,我们就采用反向代理的方式,反向代理服务器就使用nginx。
        openresty是一个基于nginx和luajit的web平台,我们可以通过它来实现动态的反向代理。接下来将会逐步实现。

 

1、openresty介绍和安装

openresty官网:http://openresty.org/cn/

在这里插入图片描述

openresty安装参考:http://openresty.org/cn/linux-packages.html

 

2、实现code-server的反向代理

首先我们只使用配置文件来实现固定的code-server的反向代理并测试功能是否正常,然后再通过lua脚本来配置动态的反向代理。

openresty安装后一般在/usr/local/openresty中,下面有一个nginx文件夹,里面就和nginx是一样的了。

1、启动上一节中实现的controller,先来启动一个code-server的pod

# 直接运行
make run

# 或者 先编译,再运行
make build
./bin/manager

2、使用apiPost来调用grpc创建pod,下面的ip等下要在nginx配置中使用

在这里插入图片描述

3、修改nginx的配置文件nginx.conf来配置反向代理:

一定要配置下面的几个header,因为code-server使用了wesocket,如果不配置将会使用不了websocket


#user  nobody;
worker_processes  1;

error_log  logs/error.log;
# error_log  logs/error.log  notice;
# error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}

http {


	server {
		listen 80;
	
		# 使用ws作为访问的prefix
		location /ws/ {
            # 反向代理到code-server所在pod中
			proxy_pass http://10.244.1.58:9999/;
			
            # 一定要设置这几个header
			proxy_set_header Upgrade $http_upgrade;
			proxy_set_header Connection upgrade;
			proxy_set_header Accept-Encoding gzip;
		}

	}
}

4、启动nginx

./nginx

5、在浏览器中访问,地址:http://yourip/ws/

在这里插入图片描述

可以看到已经可以成功访问到code-server了,但是目前是将ip地址写死了,接下来将实现动态的反向代理。

 

3、动态反向代理实现

        动态反向代理,即根据不同的用户将他的请求代理到他的code-server中,要实现这个,我们可以在启动code-server时获取到pod的ip地址,然后生成一个UID,然后将UID和ip地址保存到redis中。当用户在访问时在路径中带上UIDnginx获取到UID,然后从redis中查询出ip,再根据这个ip来反向代理

那么就需要通过lua脚本来实现,openresty中内置了lua,我们可以直接使用,关于lua的语法在此就不展开介绍了,网上很多资料。

1、修改nginx.conf


#user  nobody;
worker_processes  1;

error_log  logs/error.log;
# error_log  logs/error.log  notice;
# error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}

http {


	server {
		listen 80;
		
		# 路径以/ws/开头的请求都会通过这里
		location ^~ /ws/ {
			
            # 声明变量,等下在lua脚本中可以修改
			set $backend '';
			set $pth '';
            
            # 调用lua脚本
			rewrite_by_lua_file 'lua/proxy.lua';

			proxy_set_header Upgrade $http_upgrade;
			proxy_set_header Connection upgrade;
			proxy_set_header Accept-Encoding gzip;
            # 设置反向代理的后端url
			proxy_pass http://$backend/$pth;
		}

	}
}

我们在nginx.conf中声明了两个变量,分别是backend、pth

  • backend:是反向代理的ip和port
  • pth:为路径中的其它参数,比如当路径为http://ip:port/ws/uid/?folder=/root/workspace时,需要将uid后面的路径添加到proxy_pass的路径后面,添加后为http://podip:podport/?folder=/root/workspace

 

2、在/usr/loacl/openresty/nignx/目录下创建一个lua目录

lua脚本就存放在这个目录中,接下来创建proxy.lua文件:

local function split(str,reps)
    local resultStrList = {}
    string.gsub(str,'[^'..reps..']+',function (w)
        table.insert(resultStrList,w)
    end)
    return resultStrList
end


--[[
    1、解析出路径中的uid和其它路径
--]]

-- 获取请求的路径
local request_uri = ngx.var.request_uri
-- 分割路径
local data = split(request_uri, '/')

-- 请求路径为 /ws/uid/... , 因此至少为2个
if #data < 2 then
    return
end

-- lua中数组下标从1开始,uid为第二个
local uid = data[2]
local uid_index = string.find(request_uri, uid)
local other_path_indx = uid_index + string.len(uid)
-- 获取到uid后面的路径
local other_path = string.sub(request_uri, other_path_indx + 1)

if other_path == '/' then
    other_path = ''
end  

-- 设置nginx.conf中的变量
ngx.var.pth = other_path

--[[
    2、从redis中根据uid查询后端ip和端口
    注意:在跳转网页时 一定是 http://ip:port/ws/uid/    最后面一定要有'/'
--]]

-- 连接redis
local redis = require "resty.redis"
local red = redis:new()
red:set_timeouts(1000, 1000, 1000) -- 1 sec
-- 在这里修改你的redis地址
local ok, err = red:connect("10.99.252.66", 6379)
if not ok then
    ngx.log(ngx.ERR, "failed to connect to redis")
    return ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
end

-- 根据uid从redis中获取ip和port
local res, err = red:hget('hosts', uid)
if not res then
    ngx.log(ngx.ERR, "failed get host, uid:"..uid, err)
    return ngx.exit(ngx.HTTP_BAD_REQUEST)
end

if res == ngx.null then
    ngx.log(ngx.ERR, 'failed get host, uid:'..uid)
    return ngx.exit(ngx.HTTP_BAD_REQUEST)
end

ngx.log(ngx.INFO, 'uid:'..uid..', host:'..res)

-- 设置backend
ngx.var.backend = res
ngx.log(ngx.NOTICE, "other_path: "..other_path)

在上面的lua脚本中分为两个步骤:

(1)从请求路径中解析出uid和uid后面的其它路径

(2)根据uid从redis中查询后端ip和port

 

3、重启nginx

nginx -s reload

4、接下来在redis中设置一个哈希值

# 修改成你的code-server的podip
hset hosts abcd123 10.244.1.58:9999

5、在浏览器中访问:http://yourip/ws/abcd123/ 路径最后面一定要有'/'

在这里插入图片描述

可以看到成功访问到了。

 

启动多个code-server访问

接下来再启动一个pod,看是否可以同时访问两个

再次调用grpc创建pod,记得修改name:

在这里插入图片描述

再向nginx中添加一个映射

hset hosts qwer456 10.244.1.59:9999 

在浏览器中访问http://yourip/ws/qwer456/:

在这里插入图片描述

都是可以访问到的。

虽然看似很轻松的配置成功了,但是因为nginx使用的不熟,我经过了很多次的失败和调试,搞了很久才配置成功的。

到此后端pod的访问问题已经解决了,接下来就是web服务器的开发了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/89820.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【提高代码可读性】—— 手握多个代码优化技巧、细数哪些惊艳一时的策略

回顾 前期 趁着下班前五分钟书写——Vue3通讯(常规写法、语法糖、v-modle、兄弟通讯)_0.活在风浪里的博客-CSDN博客Vue3 组件通讯https://blog.csdn.net/m0_57904695/article/details/128145150?spm1001.2014.3001.5501 目录 一、可选链接运算符【&#xff1f;.】 二、空…

AD20和立创EDA设计(2)提取立创EDA的原理图库和PCB库

&#xff08;1&#xff09;因为AD20需要自己画原理图库和PCB库。所以我建议新手先用立创EDA画好原理图&#xff0c;转换为PCB&#xff08;注意&#xff0c;只需要转换出PCB即可&#xff0c;因为我们需要立创EDA的PCB库。不懂没关系&#xff0c;后面就清楚了&#xff09; &#…

把随身WiFi的esim卡移植到SIM卡放到手机使用

esim移植到实体sim卡&#xff0c;手把手教你esim改实体卡操作 自用先机的棒子&#xff0c;3-5倍虚标&#xff0c;在单位用&#xff0c;网速还行就是信号不好&#xff0c;uz801_v3.0的板子&#xff0c;410单天线&#xff0c;没有改装潜力&#xff0c;发热还大&#xff0c;加了风…

炸裂!速度百倍提升,高性能 Python 编译器 Codon 火了!

众所周知&#xff0c;Python 是一门简单易学、具有强大功能的编程语言&#xff0c;在各种用户使用统计榜单中总是名列前茅。相应地&#xff0c;围绕 Python&#xff0c;研究者开发了各种便捷工具&#xff0c;以更好的服务于这门语言。 编译器充当着高级语言与机器之间的翻译官…

[附源码]Nodejs计算机毕业设计基于Web企业客户管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

数据分析图表-FineReport 图表切换接口

1. 概述 1.1 问题描述 图表往往是按照从左往右或从右往左的顺序来切换。那么如何实现点击图表直接切换到其他不相邻的图表呢&#xff1f;效果如下图所示&#xff1a; 1.2 实现思路 给图表添加 JavaScript 类型的超级链接&#xff0c;调用图表接口FR.Chart.WebUtils.getChart(…

如何选择美股l2接口类型?

如何选择美股l2接口类型&#xff1f; 首先要选择稳定的美股l2接口&#xff0c;因为在进行股票行情分析的时候对于其数据的真实性和准确性都有很高的要求。不靠谱的数据平台容易造成数据传输卡顿&#xff0c;或数据获取不准确的情况&#xff0c;轻则影响企业运作&#xff0c;重…

SpringSecurity[6]-Thymeleaf中Spring Security的使用/退出登录/Spring Security中CSRF

上一篇:SpringSecurity[5]-基于表达式的访问控制/基于注解的访问控制/Remember Me功能实现 链接:SpringSecurity[4]-访问控制url匹配/内置访问控制方法介绍/角色权限判断_豆虫儿的博客-CSDN博客 十一、基于表达式的访问控制 十四、Thymeleaf中Spring Security的使用 Spring…

java计算机毕业设计基于安卓Android的校园财务流水系统APP

项目介绍 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设…

Unity脚本基础

【重点面试题】1、Unity3D中的协程&#xff08;coroutine&#xff09;&#xff0c;C#线程和进程之间的区别是什么&#xff1f; 简记&#xff1a;协程和线程区别 协程(协同程序Coroutine): 同一时间只能执行某个协程。开辟多个协程开销不大。协程适合对某任务进行分时处理。 Un…

workerman+TP6实战网站客服系统之项目初始化

TP6 官方手册: 安装 ThinkPHP6.0完全开发手册 看云 安装TP6: composer create-project topthink/think tp6 报错: 解决问题: PHP默认把这个 proc_open 函数禁用了,取消禁用即可 取消禁用函数流程参考之前一篇文章 php workerman入门之运行起来_山山河川的博客-CSDN博…

Java中的匿名内部类

一、什么是匿名内部类&#xff1f; 定义&#xff1a;巴拉巴拉巴拉&#xff0c;就不写了。 语法&#xff1a; 部分内容来源于&#xff1a;什么是匿名内部类&#xff0c;如何使用匿名内部类_Weihaom_的博客-CSDN博客_匿名内部类 二、为什么要有匿名内部类&#xff1f; 在开发…

【大数据入门核心技术-Flume】(二)Flume安装部署

目录 一、准备工作 1、基本Hadoop环境安装 2、下载安装包 二、安装 1、解压 2、修改环境变量 3、修改并配置 flume-env.sh 文件 4、验证是否安装成功 一、准备工作 1、基本Hadoop环境安装 参考 Hadoop安装 【大数据入门核心技术-Hadoop】&#xff08;五&#xff09…

Spring WebSocket通信应用

文章目录前言一、客户端-服务端双向通信交互图二、项目说明1.引入包2.项目各模块说明问题参考前言 本文章主要记录项目客户端-服务端双向通信解决方案&#xff0c;基于Spring WebSocket架构实现双向数据通信; 以及项目实际应用中的一些问题与解决手段。一、客户端-服务端双向通…

[附源码]Node.js计算机毕业设计高铁乘坐舒适性在线调查及评价系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

挑灯夜战800个小时,终从外包成功上岸字节!入职那一天我眼眶湿润了

P8Java导图笔记 主目录&#xff1a; Java基础篇&#xff1a; JAVA基础对应详细解析文档 Java多线程并发篇&#xff1a; Java多线程并发知识点对应详解解析文档 JVM篇&#xff1a; JVM脑图对应详细文档解析 Spring原理 Spring原理对应详细解析文档 数据库 数据库对应详细解析文档…

[附源码]计算机毕业设计的连锁药店销售管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis MavenVue等等组成&#xff0c;B/S模式…

全面回顾2022年加密行业大事件:破后而立方能绝处逢生

2022年&#xff0c;加密领域以Luna/UST的崩溃为起点开启了漫长的加密寒冬&#xff0c;在严峻的宏观环境下以及一系列戏剧性事件中遭受了沉重打击。2022年初&#xff0c;加密货币生态系统的市值达到近3万亿美元&#xff0c;而截至年底已蒸发2万亿美元&#xff0c;随之消失的还有…

「秒杀购物商城业务服务」「分布式架构服务」盘点中间件服务

​ 秒杀购物商城业务服务-分布式架构介绍 基于MySQL数据库集群技术实现服务的高可用基于Tomcat的集群负载机制实现Tomcat服务器的高可用基于Nginx负载均衡机制实现负载均衡&#xff08;介绍和配置&#xff09;基于Redis缓存服务实现数据缓存控制相关介绍和技术点分析对未来的…

分布式系统(概念、时间、状态)

文章目录分布式系统基本概念设计目标时间基本概念时间同步同步系统异步系统网络时间协议&#xff08;NTP&#xff09;逻辑时钟 & 向量时钟发生在先逻辑时钟向量时钟状态 & 快照全局状态 & 割集快照算法分布式系统 基本概念 分布式计算&#xff1a;是利用分布在网…