乐趣区

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

因为 K8S 目前切实是太火了,之前始终说要给 mall 我的项目出个 K8S 部署计划,这次它来啦!在更新完 K8S 系列教程后,是时候来波实际了,拿 mall-swarm 我的项目来实际真的是刚刚好。如果你有在 Docker 下部署该项目标经验,而且曾经学习了我的 K8S 系列教程的话,置信你可能轻松上手!

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

服务器布局

咱们先来说下服务器布局吧,之前始终应用的是单机部署所有服务,这次咱们应用两台服务器来部署。

  • 根底服务器(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 利用》。

组件 版本号
Mysql 5.7
Redis 5.0
MongoDb 4.3.5
RabbitMq 3.7.15
Nginx 1.10
Elasticsearch 7.6.2
Logstash 7.6.2
Kibana 7.6.2
Nacos 1.3.0
  • 本我的项目曾经提供好了 Docker Compose 脚本,间接执行如下命令即可,脚本地址:https://github.com/macrozheng…
docker-compose -f docker-compose-env.yml up -d
  • 某些零碎组件无奈启动问题,具体参考:《mall 在 Linux 环境下的部署(基于 Docker Compose)》
  • 部署实现后,查看 Docker 中运行的服务显示如下。
[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
  • Rancher 启动胜利后,通过如下地址就能够拜访它的主页了:http://192.168.3.102

批改 Nacos 配置

将我的项目 config 目录下的所有配置都增加到 Nacos 中,因为应用服务都部署到了 K8S 中,所以须要批改相干配置。

  • 将配置信息增加到 Nacos 中后显示信息如下,Nacos 拜访地址:http://192.168.3.101:8848/nac…

  • 批改 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
  • 通过 Nginx 即可拜访 mall-swarm 的接口文档,拜访地址:http://api.macrozheng.com:208…

总结

通过把 mall-swarm 我的项目部署到 K8S 上,咱们能够发现 K8S 也没有设想中到那么难,K8S 中的很多货色都是和 Docker 相通的!当咱们听到音讯称某个新技术要取代旧技术了,往往会困惑咱们学的那些旧技术是不是过期了,没用了?其实咱们大可不必放心,往往新技术都是在旧技术的根底上产生的,而且那些会旧技术的人会更容易把握新技术!

K8S 系列教程

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

  • K8S 太火了!花 10 分钟玩转它不香么?
  • 自从上了 K8S,我的项目更新都不带停机的!
  • 我把 SpringBoot 利用部署到了 K8S 上,怎么感觉用起来像 Docker!
  • 再见命令行!K8S 傻瓜式装置,图形化治理真香!
  • 看看人家那开源我的项目文档写的,那叫一个敌对!
  • 据说只有高端机器才配运行 K8S,网友:1G 内存的渣渣跑起来了!
  • 再见 Docker!5 分钟转型 containerd !

我的项目源码地址

https://github.com/macrozheng…

退出移动版