学科分类
目录
Docker

集群环境下的服务部署

在集群环境下部署服务需要将之前准备的另外两个工作节点worker1和worker2机器全部启动,并且一定要确保manager1、worker1和worker2都已加入同一个集群中,同时manager1、worker1和worker2中都已添加了本地私有仓库的服务地址。具体服务部署过程如下。

1.集群服务中的网卡选择性注册

正式在Docker Swarm集群环境下部署服务之前,还需要先来查看一个问题。在集群管理节点mamager1上使用docker network ls指令查看集群搭建后的网络列表详情,如图1所示。

图1 集群环境下默认网络列表

从图1可以看出,当集群环境搭建完成后,会默认增加名为docker_gwbridge和ingress的网络。其中ingress是集群环境下所有服务默认的网络管理方式,他主要用于在不同集群节点之间实现同一个服务的负载均衡,并且会默认为所有集群服务分配一个子网进行管理,而我们搭建微服务时,会根据需求自定义以overlay为驱动的网络用于多服务之间的通信管理。

这样,在搭建的集群环境下,就会出现多网卡网络管理的情况。由于他们分别对应不同的业务管理,所以可能会使得注册到Eureka中的服务地址有偏差,从而导致服务之间的通信失败,以及API网关代理的通信失败问题。

针对这个可能出现的问题,我们需要将自定义的网络,选择性的注册到Eureka注册中心上,具体的实现过程如下。

(1)根据微服务项目的需求,在集群环境下预先自定义一个以overlay为驱动的网络进行本地集群服务网络管理,具体操作指令如下。

$ docker network create -d overlay **--subnet 10.0.0.0/24** microservice_net

​ 执行上述指令后,会创建一个以overlay为驱动,名为microservice_net的网络,并且通过--subnet参数指定了该自定义网络的子网地址以10.0开头。

​ (2)在所有需要注册到Eureka注册中心的服务(包括microservice-gateway-zuul、microservice-orderservice和microservice-userservice服务)的配置文件application.yml中,添加指定注册到Eureka中心的优选服务子网地址信息,具体内容如下。

spring:
 cloud:
  inetutils:
   preferred-networks:
   - 10.0
eureka:
 instance:
  prefer-ip-address: true

上述配置中,首先使用preferred-networks设置了该服务优选的网段以10.0开头,这与上面自定义的子网地址属于同一个网段;然后设置了prefer-ip-address属性值为true,表示优选通过IP地址找到对应的服务名称。

​ (3)修改服务部署的编排文件docker-compose.yml,将所有服务启动时的网络设置为前面预先自定义的microservice_net网络来进行网络管理,将修改后的编排文件重命名为docker-compose-swarm.yml,如文件1所示。

文件1 docker-compose-swarm.yml

 1    version: "3"
 2    services:
 3      mysql:
 4        image: mysql:5.6
 5        restart: on-failure
 6        ports:
 7          - 3306:3306
 8        volumes:
 9          - microservice-mysql:/var/lib/mysql
 10        environment:
 11          MYSQL_ROOT_PASSWORD: root
 12          MYSQL_DATABASE: microservice_mallmanagement
 13        deploy:
 14          replicas: 1
 15          restart_policy:
 16            condition: on-failure
 17          placement:
 18            constraints: [node.role == manager]
 19      eureka-server:
 20        image: 192.168.197.143:5000/microservice-eureka-server:0.0.1-SNAPSHOT
 21        restart: on-failure
 22        ports:
 23          - 8761:8761
 24        deploy:
 25          replicas: 1
 26          restart_policy:
 27            condition: on-failure
 28      gateway-zuul:
 29        image: 192.168.197.143:5000/microservice-gateway-zuul:0.0.1-SNAPSHOT
 30        restart: on-failure
 31        ports:
 32          - 8050:8050
 33        depends_on:
 34          - eureka-server
 35        deploy:
 36          replicas: 1
 37          restart_policy:
 38            condition: on-failure
 39          placement:
 40            constraints: [node.role == manager]
 41      order-service:
 42        image: 192.168.197.143:5000/microservice-orderservice:0.0.1-SNAPSHOT
 43        restart: on-failure
 44        ports:
 45          - 7900:7900
 46        depends_on:
 47          - mysql
 48          - eureka-server
 49        deploy:
 50          replicas: 2
 51          restart_policy:
 52            condition: on-failure
 53      user-service:
 54        image: 192.168.197.143:5000/microservice-userservice:0.0.1-SNAPSHOT
 55        restart: on-failure
 56        ports:
 57          - 8030:8030
 58        depends_on:
 59          - mysql
 60          - eureka-server
 61        deploy:
 62          replicas: 2
 63          restart_policy:
 64            condition: on-failure
 65        visualizer:
 66          image: dockersamples/visualizer:stable
 67          ports:
 68            - 8081:8080
 69          volumes:
 70            - /var/run/docker.sock:/var/run/docker.sock          
 71    networks:
 72      default:
 73        external:
 74          name: microservice_net
 75    volumes:
 76      microservice-mysql:

从文件1可以看出,该文件去除了每个服务下的networks参数配置,并且在最下方通过external:name:microservice_net指定了外部已经预先自定义的网络microservice_net,让所有的服务使用该网络进行管理。至此,多网卡的注册问题就已经得到了解决。

2.集群服务部署

当搭建好集群部署环境、完成服务镜像的构建并解决多网卡注册的问题后,就可以根据docker-compose-swarm.yml服务编排文件部署微服务项目了。

(1)登录私有仓库

同10.4.1小节中非集群环境下的服务部署一样,此次进行集群环境下微服务部署时也必须先登录本地私有镜像仓库 ,进行登录认证,获取镜像的使用权限(Docker Hub远程仓库镜像则不需要登录认证)。具体操作指令如下。

$ docker login 192.168.197.143:5000

(2)部署服务

进入微服务项目中docker-compose-swarm.yml文件所在目录下,使用docker stack deploy部署服务,具体操作指令如下。

$ docker stack deploy \
  -c docker-compose-swarm.yml \
  --with-registry-auth \
  mallmanagement

​ 上述指令中,docker stack deploy -c docker-compose-swarm.yml表示使用当前目录下的docker-compose-swarm.yml文件部署服务到当前主机所在集群中;--with-registry-auth参数是对该集群下的所有节点进行通知,表示所有节点要到指定的本地私有仓库拉取镜像来启动服务(如果使用的是Docker Hub镜像仓库,此参数可省略);mallmanagement是自定义的整个集群服务的总名称。

​ 上述部署服务的指令是直接在后台启动整个微服务项目的,启动完成后,可以在集群管理节点上使用docker service ls指令查看服务列表详情,效果如图2所示。

图2 项目启动情况

从图2可以看出,集群环境下的所有服务的副本实例都已经正常启动。因为该微服务项目是部署在Docker Swarm集群服务上的,所以这些服务实例(此处共有8个服务实例)会随机分配到集群中的三个节点中(docker-compose-swarm.yml中配置有placement参数的服务实例会在指定节点上运行)。此时我们可以在集群管理节点上,使用docker stack 的相关指令查看整个微服务项目在集群节点的分配与启动情况,具体操作指令如下。

$ docker stack ps mallmanagement

上述指令中,docker stack ps用于查看整个微服务项目在集群节点的分配与启动情况,其中的mallmanagement就是在部署集群服务时指定的服务名称。

另外,由于在集群环境下部署服务是在后台启动的,所以在Docker客户端无法查看各个服务的启动详情。这里可以在集群管理节点上通过Docker service提供的服务日志指令来进一步查看某个具体服务从启动到运行的整个日志情况,具体操作指令如下。

$ docker service logs -f mallmanagement_order-service

上述指令中,docker service logs用于查看服务日志详情;-f参数用于指定需要查看服务日志的服务名称;mallmanagement_order-service就是docker service ls指令列举的某个具体的服务名称。

点击此处
隐藏目录