博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
K8S集群使用Ingress实现网站入口动静分离实践
阅读量:6426 次
发布时间:2019-06-23

本文共 8194 字,大约阅读时间需要 27 分钟。

今年3月份在公司的内部k8s培训会上,和研发同事详细探讨了应用部署容器化部署的几个问题,问题简要如下:

1、java应用容器化部署

首先通过自动化部署工具编译出全量的war包,将war包直接编译到docker镜像后推送到私用仓库并版本化控制;其次通过更新deployment的yaml文件来实现部署和后续的滚动更新,应用程序需要进行容器化改造。

这里的难点和工作量在于容器的镜像制作以及版本化管理,之后准备采用harbor做企业私有仓库。

2、dashborad面板的权限控制

解决方案参考:

3、应用程序日志的如何收集

解决方案参考:

4、网站动静分离

首先所有的动态应用通过部署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进行响应

K8S集群使用Ingress实现网站入口动静分离实践

后端的tomcat配置信息
K8S集群使用Ingress实现网站入口动静分离实践

以内网测试环境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进行响应

K8S集群使用Ingress实现网站入口动静分离实践

K8S集群使用Ingress实现网站入口动静分离实践
后端的tomcat配置信息
K8S集群使用Ingress实现网站入口动静分离实践

这里补充说明一下,内网存在三套环境

1、开发环境: 主要用于开发人员开发、调试
2、测试环境1:用于测试人员验证
3、测试环境2:用于开发人员自测与验证

从网站的类型上可以分为底层服务和平台服务两种类型,大部分的底层服务是通过dobbo进行内部调用的,容器化之后只要POD之间的网络可以互联互通即可相互调用,少部分底层服务需要对外暴露http端口。平台服务都需要对外暴露http端口。

动静分离的nginx规则也主要是上述两类,其中以平台服务的数量居多,底层服务有动静分离规则的较少。

二、部署traefik 入口

traefik具体的部署方法可参考前文,前文传送门:

# kubectl get svc,pod,ingress -n kube-system

K8S集群使用Ingress实现网站入口动静分离实践

K8S集群使用Ingress实现网站入口动静分离实践
K8S集群使用Ingress实现网站入口动静分离实践

三、创建处理动态的应用

1、build动态部分的镜像并推送至私有仓库

# cat dockerfile                   FROM registry.59iedu.com/tomcat_base:v1.0MAINTAINER 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 .

K8S集群使用Ingress实现网站入口动静分离实践

# docker tag oprman-test2:v1 registry.59iedu.com/oprman-test2:v1# docker push registry.59iedu.com/oprman-test2:v1

K8S集群使用Ingress实现网站入口动静分离实践

2、通过yaml文件创建动态应用

# cat configmap.yaml apiVersion: v1kind: ConfigMapmetadata:  name: filebeat-oprman-test2-configdata:  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/v1beta1kind: Deploymentmetadata:  name: oprman-test2-tomcat  namespace: defaultspec:  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: v1kind: Servicemetadata:  name: oprman-test2-tomcat  labels:    name: oprman-test2-tomcatspec:  ports:  - port: 8080    protocol: TCP    targetPort: 8080    name: http  selector:name: oprman-test2-tomcat# kubectl create -f oprman-test2-tomcat-svc.yaml

K8S集群使用Ingress实现网站入口动静分离实践

演示仅部署底层服务的后端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: v1kind: PersistentVolumemetadata:  name: test2-static-dataspec:  capacity:    storage: 100Gi   accessModes:  - ReadWriteMany   nfs:     path: /home/test2-static-data    server: 192.168.115.5  persistentVolumeReclaimPolicy: Recycle ---kind: PersistentVolumeClaimapiVersion: v1metadata:  name: test2-static-dataspec:  accessModes:    - ReadWriteMany  resources:    requests:      storage: 100Gi# kubectl create -f test2-static-data-pv-pvc.yaml

3、准备静态资源

K8S集群使用Ingress实现网站入口动静分离实践
4、创建deployment

# cat test2-static-deployment.yaml apiVersion: extensions/v1beta1kind: Deploymentmetadata:  name: test2-staticapiVersion: extensions/v1beta1kind: Deploymentmetadata:  name: test2-static  labels:    name: test2-staticspec:  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/v1beta1kind: Ingressmetadata:  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

K8S集群使用Ingress实现网站入口动静分离实践

六、访问测试

1、修改host解析

K8S集群使用Ingress实现网站入口动静分离实践
2、底层服务后端tomcat访问测试
K8S集群使用Ingress实现网站入口动静分离实践
3、平台前端访问测试
K8S集群使用Ingress实现网站入口动静分离实践
4、平台后台入口访问测试(前面的nginx配置/admin部分,实际未静态的内容,输入用户名和密码之后才开始请求到后端的tomcat)
K8S集群使用Ingress实现网站入口动静分离实践

这里要重点说明一下,把分布式文件系统挂载到nginx主机上并发布出去给用户访问,实际上是非常不可取的一种方式,当nginx和mfs master主机之间的网络连接出现问题的时候,会导致nginx请求被堵塞,80、443等端口连接不顺畅,极度影响用户体验,这个后续需要合力改进!

转载地址:http://sruga.baihongyu.com/

你可能感兴趣的文章
WCF学习之旅—基于ServiceDebug的异常处理(十七)
查看>>
CLREX
查看>>
再也不用担心this指向的问题了
查看>>
使用putty远程连接linux
查看>>
【comparator, comparable】小总结
查看>>
Node 版本管理
查看>>
34、重分布配置实验之分发列表distribute-list
查看>>
命令模式-对象行为型
查看>>
VS2017配置、提高生产力、代码辨识度 (工欲善其事必先利其器)新手必备!
查看>>
[Phoenix] 七、如何使用自增ID
查看>>
路由基本配置(上)
查看>>
windows上传文件到linux乱码解决
查看>>
fpm打包zabbix-agent
查看>>
pythopn List(列表)
查看>>
学习笔记 十五: mariadb
查看>>
学习笔记 124: 预备知识总结
查看>>
windows server之AD(1)
查看>>
如何升级PowerShell
查看>>
oracle kill所有plsql developer进程
查看>>
python实现登录查询(可以模糊查询)
查看>>