由于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命令即可;

  • image.png

  • 修改所有镜像标签名称,修改本地镜像标签名称为远程镜像标签名称;

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脚本安装更方便

image.png

  • 本项目已经提供好了Docker Compose脚本,直接执行如下命令即可,

docker-compose -f docker-compose-env.yml up -d
  • 某些系统组件无法启动问题
  • 部署完成后,查看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         

应用服务器部署

我们将把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

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

  • Rancher启动成功后,通过如下地址就可以访问它的主页了:http://192.168.3.102

    将配置信息添加到Nacos中后显示信息如下,
  • image.png

  • 修改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的接口文档

  • image.png

总结

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



作者:程序员知识圈
链接:https://www.jianshu.com/p/5f02239cc64b

相关资源:
rabbitmq入门和实战 - Dcsdn 

GitOps 初探 - Dcsdn 

IT运维运维管理 - Dcsdn

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐