Github标星6K!微服务电商项目在Kubernetes下的最佳实践!

2,394 阅读8分钟

SpringCloud实战电商项目mall-swarm(6.1k+star)地址:github.com/macrozheng/…

摘要

由于K8S目前实在是太火了,之前一直说要给mall项目出个K8S部署方案,这次它来啦!在更新完K8S系列教程后,是时候来波实践了,拿mall-swarm项目来实践真的是刚刚好。如果你有在Docker下部署该项目的经历,而且已经学习了我的K8S系列教程的话,相信你能够轻松上手!

服务器规划

我们先来说下服务器规划吧,之前一直使用的是单机部署所有服务,这次我们使用两台服务器来部署。

  • 基础服务器(192.168.3.101):用于部署mall-swarm的依赖服务,包括MySql、Redis、Elasticsearch等与应用无关的服务,采用Docker方式来部署。

  • 应用服务器(192.168.3.102):用于部署mall-swarm的应用服务,包括mall-admin、mall-portal、mall-search等应用服务,采用K8S方式来部署。

镜像打包及推送

为了方便部署,我们把mall-swarm的所有应用镜像都上传到Docker Hub上去。

  • 首先修改项目根目录下的pom.xml文件;
<properties>
    <!--改为你自己的Docker服务远程访问地址-->
    <docker.host>http://192.168.3.101:2375</docker.host>
</properties>
  • 使用Maven插件将所有镜像打包到Linux服务器上,直接使用根项目下的package命令即可;

  • 修改所有镜像标签名称,修改本地镜像标签名称为远程镜像标签名称;
docker tag mall/mall-gateway:1.0-SNAPSHOT macrodocker/mall-gateway:1.0-SNAPSHOT
docker tag mall/mall-auth:1.0-SNAPSHOT macrodocker/mall-auth:1.0-SNAPSHOT
docker tag mall/mall-monitor:1.0-SNAPSHOT macrodocker/mall-monitor:1.0-SNAPSHOT
docker tag mall/mall-admin:1.0-SNAPSHOT macrodocker/mall-admin:1.0-SNAPSHOT
docker tag mall/mall-portal:1.0-SNAPSHOT macrodocker/mall-portal:1.0-SNAPSHOT
docker tag mall/mall-search:1.0-SNAPSHOT macrodocker/mall-search:1.0-SNAPSHOT
  • 修改完成后查询macrodocker相关镜像显示如下,macrodocker为我们在Docker Hub上的仓库地址;
[root@local-linux ~]# docker images |grep macrodocker
macrodocker/mall-auth      1.0-SNAPSHOT        72df5f91f2d7        9 minutes ago       699MB
macrodocker/mall-gateway   1.0-SNAPSHOT        4055dfc1e601        9 minutes ago       708MB
macrodocker/mall-monitor   1.0-SNAPSHOT        492d9bb4375c        9 minutes ago       696MB
macrodocker/mall-portal    1.0-SNAPSHOT        8dd79675f40c        10 minutes ago      719MB
macrodocker/mall-search    1.0-SNAPSHOT        f0d0d80c590f        10 minutes ago      734MB
macrodocker/mall-admin     1.0-SNAPSHOT        15737ce903a9        11 minutes ago      715MB
  • 之后推送镜像到Docker Hub,如果你不想自己推送镜像,可以使用我已经上传好到镜像。
# 登录Docker Hub
docker login
# 推送到远程仓库
docker push macrodocker/mall-gateway:1.0-SNAPSHOT
docker push macrodocker/mall-auth:1.0-SNAPSHOT
docker push macrodocker/mall-monitor:1.0-SNAPSHOT
docker push macrodocker/mall-admin:1.0-SNAPSHOT
docker push macrodocker/mall-portal:1.0-SNAPSHOT
docker push macrodocker/mall-search:1.0-SNAPSHOT

基础服务器部署

我们依然使用Docker来部署依赖服务,mall-swarm运行需要的依赖服务如下,使用Docker Compose脚本安装更方便,Docker Compose使用请参考:《使用Docker Compose部署SpringBoot应用》

组件版本号
Mysql5.7
Redis5.0
MongoDb4.3.5
RabbitMq3.7.15
Nginx1.10
Elasticsearch7.6.2
Logstash7.6.2
Kibana7.6.2
Nacos1.3.0
  • 本项目已经提供好了Docker Compose脚本,直接执行如下命令即可,脚本地址:github.com/macrozheng/…
docker-compose -f docker-compose-env.yml up -d
[root@local-linux ~]# docker ps
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                                                                                        NAMES
fef5695319d1        nacos/nacos-server:1.3.0     "bin/docker-startup.…"   3 months ago        Up 6 hours          0.0.0.0:8848->8848/tcp                                                                       nacos-registry
e7ec37fcafda        elasticsearch:7.6.2          "/usr/local/bin/dock…"   3 months ago        Up 6 hours          0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp                                               elasticsearch
427f0176c426        mongo:4.2.5                  "docker-entrypoint.s…"   3 months ago        Up 6 hours          0.0.0.0:27017->27017/tcp                                                                     mongo
5618ed50942a        redis:5                      "docker-entrypoint.s…"   3 months ago        Up 6 hours          0.0.0.0:6379->6379/tcp                                                                       redis
1744f412c6f4        rabbitmq:3.7.15-management   "docker-entrypoint.s…"   3 months ago        Up 6 hours          4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp   rabbitmq
6b26f63dfad6        mysql:5.7                    "docker-entrypoint.s…"   3 months ago        Up 6 hours          0.0.0.0:3306->3306/tcp, 33060/tcp                                                            mysql

应用服务器部署

我们将把mall-swarm中所有应用服务都部署到K8S上,使用Rancher来进行可视化管理。

安装Rancher

  • 首先需要安装Rancher,先下载Rancher的Docker镜像;
docker pull rancher/rancher:v2.5-head
  • 下载完成后在Docker容器中运行Rancher服务;
docker run -p 80:80 -p 443:443 --name rancher \
--privileged \
--restart=unless-stopped \
-d rancher/rancher:v2.5-head

修改Nacos配置

将项目config目录下的所有配置都添加到Nacos中,由于应用服务都部署到了K8S中,所以需要修改相关配置。

  • 修改mall-admin-prod.yaml配置,修改MySql和Redis连接地址即可,之前是通过--link的形式访问的,这次需要改为IP进行访问;
spring:
  datasource:
    url: jdbc:mysql://192.168.3.101:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: root
    password: root
  redis:
    host: 192.168.3.101 # Redis服务器地址
    database: 0 # Redis数据库索引(默认为0)
    port: 6379 # Redis服务器连接端口
    password: #不设置密码
  • 修改mall-gateway-prod.yaml配置,修改Redis连接地址及JWT的publicKey访问地址即可(当在K8S中创建服务后,可以通过服务名进行访问);
spring:
  redis:
    host: 192.168.3.101 # Redis服务器地址
    database: 0 # Redis数据库索引(默认为0)
    port: 6379 # Redis服务器连接端口
    password: #不设置密码
  security:
    oauth2:
      resourceserver:
        jwt:
          jwk-set-uri: 'http://mall-gateway-service:8201/mall-auth/rsa/publicKey'
  • 修改mall-portal-prod.yaml配置,修改MySql、MongoDb、Redis、RabbitMq连接地址即可;
spring:
  datasource:
    url: jdbc:mysql://192.168.3.101:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: root
    password: root
  data:
    mongodb:
      host: 192.168.3.101
      port: 27017
      database: mall-port
  redis:
    host: 192.168.3.101 # Redis服务器地址
    database: 0 # Redis数据库索引(默认为0)
    port: 6379 # Redis服务器连接端口
    password: #不设置密码
  rabbitmq:
    host: 192.168.3.101
    port: 5672
    virtual-host: /mall
    username: mall
    password: mall
    publisher-confirms: true #如果对异步消息需要回调必须设置为true
  • 修改mall-search-prod.yaml配置,修改MySql、Elasticsearch连接地址即可。
spring:
  datasource:
    url: jdbc:mysql://192.168.3.101:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: root
    password: root
  elasticsearch:
    rest:
      uris: http://192.168.3.101:9200

使用Rancher部署应用

当使用Rancher创建Deployment时,如果镜像下载过慢会出现超时,可以进入到Rancher容器中手动进行下载。

  • 首先进入Rancher容器内部;
docker exex -it rancher /bin/bash
  • 通过crictl命令下载应用镜像,下载过程有点慢而且没有进度条,需要耐心等待;
k3s crictl pull macrodocker/mall-gateway:1.0-SNAPSHOT
k3s crictl pull macrodocker/mall-auth:1.0-SNAPSHOT
k3s crictl pull macrodocker/mall-monitor:1.0-SNAPSHOT
k3s crictl pull macrodocker/mall-admin:1.0-SNAPSHOT
k3s crictl pull macrodocker/mall-portal:1.0-SNAPSHOT
k3s crictl pull macrodocker/mall-search:1.0-SNAPSHOT
  • 下载完成后查看镜像显示内容如下;
root@ae85f823208f:/var/lib/rancher# k3s crictl images |grep macrodocker
docker.io/macrodocker/mall-admin     1.0-SNAPSHOT        15737ce903a94       308MB
docker.io/macrodocker/mall-auth      1.0-SNAPSHOT        72df5f91f2d74       293MB
docker.io/macrodocker/mall-gateway   1.0-SNAPSHOT        4055dfc1e6016       301MB
docker.io/macrodocker/mall-monitor   1.0-SNAPSHOT        492d9bb4375c6       291MB
docker.io/macrodocker/mall-portal    1.0-SNAPSHOT        8dd79675f40c1       312MB
docker.io/macrodocker/mall-search    1.0-SNAPSHOT        f0d0d80c590f1       325MB
  • 镜像都下载完成后,我们就可以使用Rancher来可视化创建Deployment了,这里以YAML的方式来创建;

  • 直接将项目k8s文件夹中的mall-admin-deployment.yaml文件内容复制下即可;

  • 之后再使用mall-admin-service.yaml文件创建Service;

  • 这里仅以mall-admin应用为例创建Deployment和Service,其他应用创建过程基本相同,脚本均在项目的k8s文件夹中。

效果展示

使用Rancher部署完所有应用服务之后,让我们来看看效果。

  • 首先查看所有创建的Deployment;

  • 查看所有创建的Service;

  • 如果你想查看应用的启动日志,在Pod列表查看即可;

  • 由于应用服务被部署在Rancher容器内部,无法直接访问,我们可以使用Nginx反向代理来访问,Nginx服务运行在2080端口上;
docker run -p 2080:2080 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx  \
-v /mydata/nginx/conf:/etc/nginx \
-d nginx:1.10
  • 接下来需要获得Rancher容器运行的IP地址,使用如下命令即可;
[root@linux-local ~]# docker inspect rancher |grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAddress": "172.17.0.2",
  • 创建完Nginx容器后,添加配置文件api.conf,将api.macrozheng.com域名的访问反向代理到K8S中的mall-gateway-service服务上去;
server {
    listen       2080;
    server_name  api.macrozheng.com; #修改域名

    location / {
        proxy_set_header Host $host:$server_port;
        proxy_pass   http://172.17.0.2:30201; #修改为代理服务地址
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

}
  • 再修改访问Linux服务器的本机host文件,添加如下记录;
192.168.3.102 api.macrozheng.com
  • 其实也可以不用Nginx来进行反向代理,创建容器的时候将mall-gateway-service的端口映射出来即可;
docker run -p 80:80 -p 443:443 -p 8201:30201 --name rancher \
--privileged \
--restart=unless-stopped \
-d rancher/rancher:v2.5-head

总结

通过把mall-swarm项目部署到K8S上,我们可以发现K8S也没有想象中到那么难,K8S中的很多东西都是和Docker相通的!当我们听到消息称某个新技术要取代旧技术了,往往会困惑我们学的那些旧技术是不是过时了,没用了?其实我们大可不必担心,往往新技术都是在旧技术的基础上产生的,而且那些会旧技术的人会更容易掌握新技术!

K8S系列教程

再次推荐一波我的K8S系列教程,K8S实战看这些就对了!

项目源码地址

github.com/macrozheng/…