K8S集群使用Ingress实现网站入口动静分离实践
今年3月份在公司的内部k8s培训会上,和研发同事详细探讨了应用部署容器化部署的几个问题,问题简要如下:
1、java应用容器化部署
首先通过自动化部署工具编译出全量的war包,将war包直接编译到docker镜像后推送到私用仓库并版本化控制;其次通过更新deployment的yaml文件来实现部署和后续的滚动更新,应用程序需要进行容器化改造。这里的难点和工作量在于容器的镜像制作以及版本化管理,之后准备采用harbor做企业私有仓库。
2、dashborad面板的权限控制
解决方案参考:https://blog.51cto.com/ylw6006/21135423、应用程序日志的如何收集
解决方案参考:https://blog.51cto.com/ylw6006/21073074、网站动静分离
首先所有的动态应用通过部署tomcat pod的方式来响应,静态的资源统一部署一个nginx pod方式来响应;
其次,动静分离的规则配置交给traefik ingress实现;
最后,静态资源的文件统一存放在pv上,更新静态资源不需要去编译docker镜像.
一、动静分离举例说明
以内网测试环境2的虚拟主机站点配置(底层服务)为例:
域名test2.oprman.com(PS:研发大爷喜欢自己YY域名)的静态资源配置如下
1、/ ——> 对应/usr/local/6.0_files/oprman_test2目录
2、/mfs ——> 对应/mnt/mfs目录(这个实际上是一个分布式文件系统的挂载点)域名test2.oprman.com的动态资源配置如下
1、/web ——> 后端tomcat进行响应
2、/api ——> 后端tomcat进行响应
后端的tomcat配置信息
以内网测试环境2的虚拟主机站点配置(平台服务)为例:
域名resourcesharing.test2.59iedu.com的静态资源配置如下
1、/ ——> 对应/data/static_files/test2/zygxpt/portal目录
2、/mfs ——> 对应/mnt/mfs目录(这个实际上是一个分布式文件系统的挂载点)
3、/admin ——> 对应/data/static_files/test2/zygxpt/admin目录
4、/login ——> 对应/data/static_files/test2/zygxpt/login目录
5、/play ——> 对应/data/static_files/test2/zygxpt/play目录域名test2.oprman.com的动态资源配置如下
1、/web ——> 后端tomcat进行响应
后端的tomcat配置信息
这里补充说明一下,内网存在三套环境
1、开发环境: 主要用于开发人员开发、调试
2、测试环境1:用于测试人员验证
3、测试环境2:用于开发人员自测与验证从网站的类型上可以分为底层服务和平台服务两种类型,大部分的底层服务是通过dobbo进行内部调用的,容器化之后只要POD之间的网络可以互联互通即可相互调用,少部分底层服务需要对外暴露http端口。平台服务都需要对外暴露http端口。
动静分离的nginx规则也主要是上述两类,其中以平台服务的数量居多,底层服务有动静分离规则的较少。
二、部署traefik 入口
traefik具体的部署方法可参考前文,前文传送门:https://blog.51cto.com/ylw6006/2073718
# kubectl get svc,pod,ingress -n kube-system
三、创建处理动态的应用
1、build动态部分的镜像并推送至私有仓库
# cat dockerfile FROM registry.59iedu.com/tomcat_base:v1.0 MAINTAINER yangliangwei "ylw@fjhb.cn" COPY ROOT-20180509.tgz /home/ RUN tar zxf /home/ROOT-20180509.tgz -C /home/tomcat/webapps/ && rm -rf /home/ROOT-20180509.tgz # docker build -t oprman-test2:v1 .
# docker tag oprman-test2:v1 registry.59iedu.com/oprman-test2:v1 # docker push registry.59iedu.com/oprman-test2:v1
2、通过yaml文件创建动态应用
# cat configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: filebeat-oprman-test2-config data: filebeat.yml: | filebeat.prospectors: - input_type: log paths: - "/log/*" output.elasticsearch: hosts: ["192.168.1.19:9600"] index: "filebeat-oprman-test2" # kubectl create -f configmap.yaml
# cat oprman-test2-tomcat-dp.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: oprman-test2-tomcat namespace: default spec: replicas: 1 template: metadata: labels: name: oprman-test2-tomcat spec: containers: - image: registry.59iedu.com/filebeat:v5.4.0 imagePullPolicy: Always name: filebeat volumeMounts: - name: app-logs mountPath: /log - name: filebeat-oprman-test2-config mountPath: /etc/filebeat/ - image: registry.59iedu.com/oprman-test2:v1 name : oprman-test2-tomcat imagePullPolicy: Always env: - name: JAVA_OPTS value: "-Xmx2048m -Xms512m" ports: - containerPort: 8080 volumeMounts: - name: app-logs mountPath: /home/tomcat/logs volumes: - name: app-logs emptyDir: {} - name: filebeat-oprman-test2-config configMap: name: filebeat-oprman-test2-config # kubectl create -f oprman-test2-tomcat-dp.yaml
# cat oprman-test2-tomcat-svc.yaml apiVersion: v1 kind: Service metadata: name: oprman-test2-tomcat labels: name: oprman-test2-tomcat spec: ports: - port: 8080 protocol: TCP targetPort: 8080 name: http selector: name: oprman-test2-tomcat # kubectl create -f oprman-test2-tomcat-svc.yaml
演示仅部署底层服务的后端tomcat处理动态请求,平台的后端tomcat部署办法一样,出于文章篇幅考虑就不再赘述。
四、创建处理静态部分的应用
1、我们采用configmap的方式来处理静态部分的请求路由,动态部分的请求路由将交给
Ingress来实现。nginx配置文件针对平台部分的配置因为路径都一样,所以域名采用$host进行通配,底层的需要单独配置。(好在底层服务需要暴露http的并不多)
# cat nginx.conf user nginx; worker_processes auto; error_log /usr/share/nginx/html/nginx-error.log; pid /run/nginx.pid; # Load dynamic modules. See /usr/share/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf; events { worker_connections 102400; use epoll; } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; server_tokens off; access_log /usr/share/nginx/html/nginx-default-access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; include /etc/nginx/conf.d/*.conf; include /etc/nginx/conf/extra/*.conf; server { listen 80 default_server; index index.html index.htm; access_log /usr/share/nginx/html/logs/test2-static-access.log main; location / { root /usr/share/nginx/html/$host/portal; index index.html index.htm; } location /admin{ root /usr/share/nginx/html/$host; index index.html index.htm; } location /login { root /usr/share/nginx/html/$host; index index.html index.htm; } location /play { root /usr/share/nginx/html/$host; index index.html index.htm; } location /mfs { root /mnt/mfs; } } server { listen 80; server_name test2.oprman.com; index index.html index.htm; access_log /usr/share/nginx/html/logs/test2-static-access.log main; location / { root /usr/share/nginx/html/test2.oprman.com; index index.html index.htm; } location /mfs { root /mnt/mfs; } } } # kubectl create configmap test2-static-etc --from-file nginx.conf
2、创建pv、pvc
# cat test2-static-data-pv-pvc.yaml apiVersion: v1 kind: PersistentVolume metadata: name: test2-static-data spec: capacity: storage: 100Gi accessModes: - ReadWriteMany nfs: path: /home/test2-static-data server: 192.168.115.5 persistentVolumeReclaimPolicy: Recycle --- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: test2-static-data spec: accessModes: - ReadWriteMany resources: requests: storage: 100Gi # kubectl create -f test2-static-data-pv-pvc.yaml
3、准备静态资源
4、创建deployment
# cat test2-static-deployment.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: test2-static apiVersion: extensions/v1beta1 kind: Deployment metadata: name: test2-static labels: name: test2-static spec: replicas: 2 template: metadata: labels: name: test2-static spec: containers: - name: test2-static image: registry.59iedu.com/nginx:latest volumeMounts: - mountPath: /usr/share/nginx/html name: test2-static-data - mountPath: /etc/nginx/nginx.conf subPath: nginx.conf name: test2-static-etc ports: - containerPort: 80 volumes: - name: test2-static-data persistentVolumeClaim: claimName: test2-static-data - name: test2-static-etc configMap: name: test2-static-etc items: - key: nginx.conf path: nginx.conf # kubectl create -f test2-static-deployment.yaml
五、创建统一入口ingress
# cat test2-ingress.yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: name: traefik-oprman-test2 namespace: default annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: resourcesharing.test2.59iedu.com http: paths: - path: / backend: serviceName: test2-static servicePort: 80 - host: test2.oprman.com http: paths: - path: / backend: serviceName: test2-static servicePort: 80 - path: /web backend: serviceName: oprman-test2-tomcat servicePort: 8080 - path: /api backend: serviceName: oprman-test2-tomcat servicePort: 8080 # kubectl create -f test2-ingress.yaml
六、访问测试
1、修改host解析
2、底层服务后端tomcat访问测试
3、平台前端访问测试
4、平台后台入口访问测试(前面的nginx配置/admin部分,实际未静态的内容,输入用户名和密码之后才开始请求到后端的tomcat)
这里要重点说明一下,把分布式文件系统挂载到nginx主机上并发布出去给用户访问,实际上是非常不可取的一种方式,当nginx和mfs master主机之间的网络连接出现问题的时候,会导致nginx请求被堵塞,80、443等端口连接不顺畅,极度影响用户体验,这个后续需要合力改进!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
RDS2016 Multipoint Role
Windows server 2016在国内还没用起来,Windows server 2019已经出来,可惜Server 2016中许多新功能大家可能还并不了解,后续老王会陆续为大家介绍,Multipoint Role是Windows server 2016 远程桌面服务的重要改变,将原来单独的Windows Multipoint Server版本现在合并到远程桌面服务的一个角色,本文我们主要介绍Multipoint role (下文简称WMR) 与VDI的区别,以及使用WMR的场景。 之所以老王要写这篇文章呢,其一希望为大家带来一个新的概念,原来微软除了RDS VDI还有一套这样的系统,其二是希望为广大用户拨开迷雾,让大家了解到底我需要的是WMR还是VDI WMR前身是Windows Multipoint Server,一直以来是作为一个单独的OS版本发行,WMS与2010发布,历经2011,2012三个大版本,到Server2016正式发布时已经合并至远程桌面服务里面的一种架构,下文我们介绍时将以WMR作为介绍,事实上2016 WMR 与WMS 2012功能差别并不大,只不过是合并...
- 下一篇
10个提升工作效率的Secure CRT小窍门 - 你玩转了几个?
10个SecureCRT 小窍门 - 你玩转几个? SecureCRT,相信不用我过多介绍了吧,一款通过telnet,ssh登录远端设备的终端软件。 无论是搞网络的,做系统的甚至写程序的,连接设备必用软件,容易上手,稳定性高,功能强大。 但是,面对SecureCRT密密麻麻的功能菜单,大家熟悉几个? 别把SecureCRT用成Putty 让我猜猜你平时怎么使用SecureCRT。 第一步:打开软件。 第二步:点开左边的会话管理栏,选择你要连接的设备。 第三步:双击连接,走你! 第四步:开始弹键盘协奏曲。 这应该是大家日常工作中,最频繁的SecureCRT使用习惯和方法吧。 但是,要光这样用,可能就屈了才了。SecureCRT的功能强大得让人受不了。 从基本的连接设备,到高级的运行脚本和python程序等,它都支持。 而今天,我就同你一起分享10个非常简单,但是又能让你的工作事半功倍的SecureCRT小窍门。 让你不再把SecureCRT用成Putty。 注:什么是Putty? Putty也是一款telnet和ssh的终端免费小软件。 功能单一,界面不是太友好,工作效率相比Secure...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Linux系统CentOS6、CentOS7手动修改IP地址