运维开发网

基于go的微服务搭建(五) - 部署docker swarm

运维开发网 https://www.qedev.com 2020-05-15 19:40 出处:网络 作者:运维开发网整理
标题: 部署docker swarm 这部分,我们启动我们的accountservice,运行在本地的docker swarm集群中.同时讨论几个容器部署的重要概念 这篇博客主要讲一下几点: docker swarm和容器部署 用docker作为容器运行accountservice 建立一个本地的docker swarm集群 将accountservice作为swarm服务部署 基测和结果 其实写

标题: 部署docker swarm

这部分,我们启动我们的accountservice,运行在本地的docker swarm集群中.同时讨论几个容器部署的重要概念

这篇博客主要讲一下几点:

  • docker swarm和容器部署
  • 用docker作为容器运行accountservice
  • 建立一个本地的docker swarm集群
  • 将accountservice作为swarm服务部署
  • 基测和结果

其实写完这一章,我发现这一章和go没有关系.但希望你喜欢.

什么是容器部署


在实践开始之前,一个容器部署的简单介绍:

当一个应用越来越复杂,并且开始有更高的负载,将会有成百个服务在很多硬件上运行.容器部署让我们在一个节点上管理我们的硬件

一篇文章上总结的:

抽象主机的基础结构,部署工具允许用户在一个部署目标上控制整个集群.

这总结的很好.用kubernetes或者docker swarm这种容器部署工具来部署我们的各个服务在不同的节点上.对于docker来说,swarm模式管理docker engine的集群.kubernetes用一种稍微不同的抽象方法,但是整体概念上是一致的.

容器部署不仅控制我们服务的生命周期,也提供其他服务,例如:服务发现,负载均衡,内部地址和日志.

docker swarm核心概念


在docker swarm中,有三个核心概念:

  • 节点: 一个节点就是一个docker engine的实例.理论上讲,他是一个拥有cpu资源,内存和网络接口的主机.一个节点可以是一个manager节点或者worker节点.
  • 服务: 服务就是worker节点上运行的指令.一个服务可以是复制的或者全局的.一个服务可以抽象的看成是任意数量的容器组成的逻辑上的服务.这个服务可以用它的名字来调用,而不需要知道它内部的网络结构.
  • 任务: 一个任务可以是Docker容器,docker文件定义任务为:拥有并运行Docker容器和指令.manager节点分发任务给worker节点的服务.

下图展示一个简单的微服务框架.两个服务accountservice和quotes-service抽象为两个节点,运行在五个容器的实例中.

![图片上传中...]

代码


这部分没有改go方面的代码.

基于go的微服务搭建(五) - 部署docker swarm

加入quote-service

只有一个服务的微服务不能看出微服务的全貌.让我们部署一个基于spring boot的quotes-service.我把这个容器镜像放在docker hub中的eriklupander/quotes-service.

> docker service create --name=quotes-service --replicas=1 --network=my_network eriklupander/quotes-service

如果你输入docker ps来看那些Docker容器在运行:

> docker ps
CONTAINER ID    IMAGE                       COMMAND                 CREATED         STATUS                           PORTS                                           NAMES
98867f3514a1    eriklupander/quotes-service "java -Djava.security"  12 seconds ago  Up 10 seconds

注意,我们没有暴露一个外界端口给这个服务,所以我们只能在集群内部的端口8080内请求.我们会集成这个服务在第七部分同时看一下服务探索和负载均衡.

如果你加入了dvizz,你应该能看到quotes-service和accountservice

copyall.sh脚本

我们来做一个脚本帮助我们编译和部署.在root/goblog文件夹中,创建一个脚本文件叫做copyall.sh

#!/bin/bash
export GOOS=Linux
export CGO_ENABLE=0

cd accountservice; go get; go build -o accountservice-Linux-amd64;echo build `pwd`;cd ..

export GOOS=darwin
docker build -t someprefix/accountservice accountservice/

docker service rm accountservice
docker service create --name=accountservice --replicas=1 --network=my_network -p=6767:6767
someprefix/accountservice

这段脚本编译执行文件,重新编译docker镜像,部署到docker swarm服务上.

我喜欢脚本的简化,虽然有时我用gradle plugin.

性能


现在开始,所有的基测都在docker swarm上进行.这意味之前的结果不能用来和之后的比较

cpu使用率和内存使用会用 docker stats来收集.我们也会用gatling测试.

如果你喜欢压力测试,第二节的仍然可以用,但需要改变-baseUrl参数

> mvn gatling:execute -dusers=1000 -Dduration=30 -DbaseUrl=http://$ManagerIP:6767

内存使用率

> docker stats $(docker ps | awk '{if(NR>1) print $NF}')

CONTAINER                                    CPU %               MEM USAGE / LIMIT    
accountservice.1.k8vyt3dulvng9l6y4mj14ncw9   0.00%               5.621 MiB / 1.955 GiB
quotes-service.1.h07fde0ejxru4pqwwgms9qt00   0.06%               293.9 MiB / 1.955 GiB

启动后,包含Linux和我们accountservice的容器用5.6mb的内存,java开发的quotes-service用了300mb.虽然这可以通过调整jvm来降低.

cpu和内存使用压力测试


CONTAINER                                    CPU %               MEM USAGE / LIMIT   
accountservice.1.k8vyt3dulvng9l6y4mj14ncw9   25.50%              35.15 MiB / 1.955 GiBB

在1K req/s下,虚拟机中运行的swarm和在第二三节中的OS x系统相比,内存稍微升高,cpu大略相同.

性能


![图片上传中...]


延迟上升到4ms.这和直接运行有所升高,原因有几点.我认为gatling测试通过桥接的网络和swarm上的路由会有一些延迟.但是4ms的延迟也不错.毕竟我们从boltDB读数据,序列化到json并输出到HTTP.

总结


我们学习如何启动docker swarm和部署accountservice到swarm上.下一节,我们会给我们的微服务加入healthcheck.

0

精彩评论

暂无评论...
验证码 换一张
取 消