k8s集群使用ingress实现网站入口动静分离实践(代码片段)

author author     2022-11-13     608

关键词:

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

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

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

2、dashborad面板的权限控制
解决方案参考:http://blog.51cto.com/ylw6006/2113542

3、应用程序日志的如何收集
解决方案参考:http://blog.51cto.com/ylw6006/2107307

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进行相应

技术分享图片
后端的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具体的部署方法可参考前文,前文传送门:http://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 "[email protected]"
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、创建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等端口连接不顺畅,极度影响用户体验,这个后续需要合力改进!

使用vagrant搭建k8s节点五---使用ingress实现域访问(代码片段)

一、Ingress介绍Kubernetes暴露服务的有三种方式,分别为LoadBlancerService、NodePortService、Ingress。官网对Ingress的定义为管理对外服务到集群内服务之间规则的集合,通俗点讲就是它定义规则来允许进入集群的请求被转发到集群... 查看详情

haproxy+varnish+lnmp实现高可用负载均衡动静分离集群部署

转自http://bbs.hfteams.com/forum.php?mod=viewthread&tid=11&extra=page%3D1HAProxy+Varnish+LNMP实现高可用负载均衡动静分离集群部署HAProxy高可用负载均衡集群部署基本信息:系统平台:VMwareWorkStation系统版本:CentOSLinuxrelease7.2.1511(Core)内核 查看详情

基于haproxy+varnish实现动静分离负载均衡的高可用集群

拓扑结构介绍        在实际的生产使用过程中,一个基本的能够应对日均百万PV的网络,一般会具有以下几种结构。650)this.width=650;"src="http://ot2trm1s2.bkt.clouddn.com/Linux/2017-11-01-linux-pro-command-6/%E5%9F%B 查看详情

haproxy+varnish+lnmp实现高可用负载均衡动静分离集群部署

HAProxy高可用负载均衡集群部署  基本信息:  系统平台:VMwareWorkStation  系统版本:CentOSLinuxrelease7.2.1511(Core)  内核版本:3.10.0-327.el7.x86_64   集群架构:  前端:HAProx 查看详情

haproxy+varnish+amp集群实现动静分离

    一、简介    Haproxy一个高性能的负载均衡服务软件,它可基于四层和七层之间进行调度,而且对各个节点具有健康状态检测的功能,当后端服务器故障时,会自动标记为不可用状态,当服务器上... 查看详情

利用nginx实现动静分离的负载均衡集群实战(代码片段)

...用nginx来作为负载,实现两台apache服务器的动静分离集群实战;本文收录于沐风晓月的专栏《linux基本功-系统服务实战》,更多内容可以关注我的博客:https://blog.csdn.net/wisdom_futrue文章目录前言一.实验环境1.1系统... 查看详情

前后端分离架构+k8s+ingress(代码片段)

...、概述在前面几篇文章中,已经讲到了前后端分离架构和ingress,链接如下:https://www.cnblogs.com/xiao987334176/p/12195722.htmlhttps://www.cnblogs.com/xiao987334176/p/12195797.html接下来使用k8s进行发布应用 二、演示3.0环境说明k8s集群系统dockerip... 查看详情

ingress-nginx+内部lb(nginx)实现业务负载均衡

注:本文使用k8s社区版ingress-nginx实现,涉及知识点:pod、pv、pvc、deployment、service、ingress、ingress-controller、nginx(loadbalance)一.ingress介绍1.ingress-nginx的kubernetes社区官网:  https://kubernetes.github.io/ingress-nginx/deploy/ 2.ingress功能:将Ngin... 查看详情

k8singress及ingresscontroller(代码片段)

目录使用KubernetesIngress对外暴露服务k8s对外暴露服务的方法每种方式都有各自的优缺点Ingress及IngressController简介IngressIngressController部署Ingress部署pod节点获取nodeport配置文件定义ingress管理podsvs查看Ingress信息修改主机hosts文件访问网... 查看详情

k8s学习-ingress(代码片段)

4.5、IngressIngress-Nginxgithub地址:https://github.com/kubernetes/ingress-nginxIngress-Nginx官方网站:https://kubernetes.github.io/ingress-nginx/通常情况下,Service和Pod的IP仅可在集群内部访问。集群外部的请求需要通过负载均衡转发到Service在Node上暴露 查看详情

动静分离

1.案例背景通过Nginx实现动静分离,即通过Nginx反向代理配置规则实现让动态资源和静态资源及其他业务分别由不同的服务器解析,以解决网站性能、安全、用户体验等重要问题。 2.需求分析当用户请求www.xindaichina.cn/upload/xx地... 查看详情

如何使用一个负载均衡器为两个域的两个入口配置 nginx-ingress

】如何使用一个负载均衡器为两个域的两个入口配置nginx-ingress【英文标题】:Howtoconfigurenginx-ingresswithoneloadbalancerfortwoingressfortwodomains【发布时间】:2020-07-0800:27:24【问题描述】:我有一个像下面这样的k8s集群#kubectl获取所有名称... 查看详情

linux里面为啥nginx要做动静分离?

...据库的访问,从而提高性能。此外,您还可以使用服务器集群来扩展您的网站的处理能力,以应对高流量。总之,要提高网站的性能和可用性,您可以根据您的具体情况来选择适合您的方案。内容分发网络(CDN)是一种分布式网... 查看详情

nginx---动静分离(代码片段)

...备(Nginx)动静分离需求分析动静分离实现步骤Nginx实现Tomcat集群搭建Nginx与Tomcat部署我们都知道了Nginx在高并发场景和处理静态资源是非常高性能的,但是在实际项目中除了静态资源还有就是后台业务代码模块,一般后台业... 查看详情

#云原生征文#深入了解ingress

深入了解Ingress为什么需要Ingress?Service可以使用NodePort暴露集群外访问端口,但是性能低下不安全缺少Layer7的统一访问入口,可以负载均衡、限流等Ingress公开了从集群外部到集群内服务的HTTP和HTTPS路由。流量路由由Ingress资源上... 查看详情

nginx和iis实现动静分离转载

...负载均衡,想了解的朋友,可以看这篇文章:《nginx和IIS实现负载均衡》,然后也就顺便研究了Nginx+IIS实现动静分离。所以,一起总结出来,与大家共同探讨。动静分离,说白了,就是将网站静态资源(HTML,JavaScript,CSS,img等... 查看详情

大型网站动静分离

...部门的完全不同的产品!360云加速(专业CDN产品)按实际使用收费(按照流量收费或者带宽收费)节点线路遍布大小运营商:电信、联通、移动、长宽、教育网…&h 查看详情

ingress部署

参考技术AIngress是一种Kubernetes资源,也是将Kubernetes集群内服务暴露到外部的一种方式。如果把kubernetes集群比作一个房子的话,那ingress就是这个房子的门,是外部访问集群内资源的唯一入口。ingress就是一个负载均衡的应用,它... 查看详情