集群环境下的服务部署
在集群环境下部署服务需要将之前准备的另外两个工作节点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指令列举的某个具体的服务名称。