这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本章是《Docker下的OpenResty三部曲》的终篇,前面两章我们实战了OpenResty的lua脚本开发,并且将web服务发布在Docker环境下,本章我们在kubernetes环境下搭建OpenResty加Tomcat的web服务;
第一章:《Docker下的OpenResty三部曲之一:极速体验》
第二章:《Docker下的OpenResty三部曲之二:细说开发》
您可以通过以下文章了解更详细的kubernetes实战:
《kubernetes下的Nginx加Tomcat三部曲之一:极速体验》
《kubernetes下的Nginx加Tomcat三部曲之二:细说开发》
《kubernetes下的Nginx加Tomcat三部曲之三:实战扩容和升级》
本次实战搭建的环境如下所示:
本次实战的web服务,主要功能为:浏览器发起http请求到OpenResty,OpenResty负责去处理业务,处理过程中向Tomcat发起http请求,将Tomcat响应的信息返回给浏览器;
上图的架构和常见的Nginx加Tomcat很相似,不过还是有区别的:
名称 | 链接 | 备注 |
---|---|---|
项目主页 | 该项目在GitHub上的主页 | |
git仓库地址(https) | 该项目源码的仓库地址,https协议 | |
git仓库地址(ssh) | git@github.com:zq2599/blog_download_files.git | 该项目源码的仓库地址,ssh协议 |
这个git项目中有多个目录,本次所需的资源放在tomcat_openresty_docker_image_files,如下图红框所示:
注意,本章用到的资源目录是tomcat_openresty_docker_image_files,上一章用的是nginx_lua_docker_image_files,里面是不同资源;
今天的整个实战,我们要做以下事情:
在上一章我们已经做了OpenResty的镜像并体验过了,为何本章还要重做呢?
kubernetes环境的搭建和使用,您可以参照以下的文章:
前期铺垫说了这么多,接下来我们就开始实战吧;
本次的镜像是在《Docker下的OpenResty三部曲之二:细说开发》中的Dockerfile的基础上添加了一些内容做成的,接下来详细说明这些新增的内容,完整的Dockerfile在GitHub资源的tomcat_openresty_docker_image_files文件夹下;
以下是Dockerfile中vim相关的内容:
#创建安装命令
RUN apt-get install -y make vim gcc libreadline-dev libncurses5-dev libpcre3-dev libssl-dev perl
#修改vim的配置信息,修复中文乱码问题
RUN sed -i '$a\set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936' /etc/vim/vimrc
RUN sed -i '$a\set termencoding=utf-8' /etc/vim/vimrc
RUN sed -i '$a\set encoding=utf-8' /etc/vim/vimrc
如上所示,通过sed命令向/etc/vim/vimrc文件中追加了三行,以保证中文显示;
首先下载http.lua和http_headers.lua这两个文件,放在Dockerfile所在目录,然后在Dockerfile添加以下内容:
#将http库文件复制到默认库
COPY ./http.lua $INSTALL_PATH/lualib/resty
COPY ./http_headers.lua $INSTALL_PATH/lualib/resty
为了对外新增一个http接口lua_http,在boling_cavalry.conf文件中增加了以下内容,
location ~ /lua_http/(\d+)/(\d+) {
#设置nginx变量
set $a $1;
set $b $host;
default_type "text/html";
#nginx内容处理
content_by_lua_file /usr/local/work/lua/test_http.lua;
}
如上所示,当浏览器输入http://192.168.119.150:9000/lua_http/333/666这样URL时,就会由test_http.lua这个脚本来处理,test_http.lua的内容如下所示:
ngx.say("---------------------------------------------------------<br/>");
local http = require("resty.http")
--创建http客户端实例
local httpc = http.new()
local resp, err = httpc:request_uri("http://127.0.0.1:80",{
method = "GET",
path = "/tomcat_proxy/getserverinfo",
headers = {
["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36"
}
})
if not resp then
ngx.say("request error :", err)
return
end
ngx.say("resp status--", resp.status)
ngx.say("<br/><br/>resp body--", resp.body)
httpc:close()
如上所示,该脚本的处理很简单:发起一个http请求,将收到响应的code和body在页面上显示出来;
你们注意到了吗?请求的地址是127.0.0.1,是OpenResty自己,不是Tomcat!!!
为什么要向自己发http请求呢?不是应该发请求给Tomcat么?我们一起来梳理一下吧:
按照原本的设计,此处的URL应该是http://tomcathost:8080/getserverinfo,tomcathost是Tomcat的Pod在kubernetes暴露的service名称,在kubernetes环境中tomcathost会被解析成Tomcat的Pod地址,请求就到了Tomcat了;
但是,OpenResty的httpc:request_uri这个API无法将tomcathost这个hostname解析成Tomcat的Pod地址,或者说不会用到kubernetes提供的DNS服务,因此请求无法到达Tomcat的Pod;
我用的是笨办法,能将请求发到Tomcat,但是很曲折,理论上存在性能损失,亲爱的读者如果您有更科学的方法,期望能得到您的指点;
笨办法的思路如下:
upstream tomcat_client {
server tomcathost:8080;
}
此upstream中的server用到了tomcathost,这是kubernetes中Tomcat的service的名字,能被成功的解析成Tomcat的Pod的IP;
location ~ /tomcat_proxy/(.*) {
rewrite /tomcat_proxy(/.*) $1 break;
proxy_pass http://tomcat_client;
proxy_redirect default;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
如上所示,如此一来,所有url是tomcat_proxy/xxxxxxx的请求都会被转发到Tomcat了;
注意这一行:rewrite /tomcat_proxy(/.) 1 break;,可以这么理解: a. http://127.0.0.1:80/tomcat_proxy/getserverinfo这个请求可以被tomcat_proxy(/.)这个正则表达式匹配; b. 因为/getserverinfo和第一个圆括号中的表达式匹配,所以 1的值就是/getserverinfo; c. 因此请求/tomcat_proxy/getserverinfo被rewrite成了
最后,在制作Dockerfile的时候,记得将新增的test_http.lua复制到镜像中:
COPY ./test_http.lua $WORK_PATH/lua
以上就是制作新的Dockerfile时要新增的内容了,在Dockerfile所在目录执行以下命令构建镜像,注意TAG是0.0.2,区别于上一章镜像的0.0.1:
docker build -t bolingcavalry/ubuntu16-openresty:0.0.2 .
现在的镜像只存在于开发和构建web工程的电脑上,为了让kubernetes的node机器能用上这个镜像,可以用以下四种方式实现:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: tomcathost
spec:
replicas: 3
template:
metadata:
labels:
name: tomcathost
spec:
containers:
- name: tomcathost
image: bolingcavalry/k8stomcatdemo:0.0.1-SNAPSHOT
tty: true
ports:
- containerPort: 8080
以上文件用来定义Tomcat的Pod的副本集;
apiVersion: v1
kind: Service
metadata:
name: tomcathost
spec:
type: ClusterIP
ports:
- port: 8080
selector:
name: tomcathost
以上文件将Tomcat的Pod副本包装成service,名字是tomcathost,这样kubernetes环境中的其他Pod通过tomcathost这个hostname就能访问到Tomcat的Pod副本了;
kubectl create -f tomcat.yaml,tomcat-svc.yaml
以上命令依次创建Pod和service;
root@maven:/usr/local/work/openrest_rewrite# kubectl create -f tomcat.yaml,tomcat-svc.yaml
deployment "tomcathost" created
service "tomcathost" created
root@maven:/usr/local/work/openrest_rewrite# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 62d
tomcathost ClusterIP 10.43.192.125 <none> 8080/TCP 1m
至此,Tocmat服务就OK了,接下来我们创建OpenResty服务吧;
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: openresty001
spec:
replicas: 1
template:
metadata:
labels:
name: openresty001
spec:
containers:
- name: openresty001
image: bolingcavalry/ubuntu16-openresty:0.0.2
ports:
- containerPort: 80
以上文件用来定义OpenResty的Pod的副本集;
apiVersion: v1
kind: Service
metadata:
name: openresty001
spec:
type: NodePort
ports:
- port: 80
nodePort: 30007
selector:
name: openresty001
以上文件将openresty的Pod副本包装成service,名字是openresty001,并且将80端口和所在节点机器的30007端口建立映射;
kubectl create -f openresty.yaml,openresty-svc.yaml
以上命令依次创建Pod和service;
root@maven:/usr/local/work/openrest_rewrite# kubectl create -f openresty.yaml,openresty-svc.yaml
deployment "openresty001" created
service "openresty001" created
root@maven:/usr/local/work/openrest_rewrite# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 62d
openresty001 NodePort 10.43.148.118 <none> 80:30007/TCP 8s
tomcathost ClusterIP 10.43.192.125 <none> 8080/TCP 43m
终于将所有的服务都创建好了,接下来开始验证吧;
OpenResty服务所在的机器IP是192.168.119.153,所以在浏览器输入:http://192.168.119.153:30007/lua_http/333/666,可以看到如下效果:
如上所示,结合test_http.lua的源码来看,“200”是Tomcat的返回code,“10.42.11.12”是Tomcat所在Pod的IP地址,我们去kubernetes的dashboard印证一下,如下图,红框1是查看信息的路径,红框2是Pod的IP地址,果然有10.42.11.12:
至此,《Docker下的OpenResty三部曲》就全部结束了,由于文章大纲没有设计好,导致第三章内容太多,在这里向您道歉了,如果有疑问欢迎您邮件至zq2599@gmail.com,我们一起探讨,也希望本文能对您的kubernetes实战有所帮助