Docker 服务编排 Mesos Swarm Kubernetes 三种模式实践

提起Docker容器化 不得不提服务编排,众所周知目前Docker常用的服务编排模式有三种, Mesos DockerSwarm Kubernetes,下面将详细介绍这三种服务编排模式的架构和环境搭建。

一. Mesos

1.Mesos架构图

下图是在Mesos官网上对mesos架构的介绍

即使不看下面的英文描述,从这张图上我们也看看出Mesos的整体架构,主体为主从结构master/slave或者master/agent模式,对master节点来说为了避免单点,引入了多个master,多个master向Zookeeper注册自己,用zk实现选举。master节点运行一些任务调度器(scheduler),agent节点运行任务执行器(executor),一个agent节点可以运行多个执行器,有执行器来执行具体任务(task)。

2.Mesos任务执行调度过程

任务调度如下图:

从图中可以看出,这个调度分为四个过程:

1.Mesos Agent将自己所在机器(物理机,虚拟机,容器)的资源信息(可用的处理器,内存,磁盘等资源)上报给Mesos Master的资源分配组件(Allocation Module)。

2.master节点向framework发送资源邀约(resource offer),通知framework在agent上可用的资源信息。

3.框架调度程序(FW Scheduler)把需要在agent上运行的两个任务的信息发给master。

4.master将任务发送给agent,agent将需要的资源分配给执行器(Executor),执行器一次启动两个任务(task)。

当agent节点任务运行结束或者资源空闲时将循环此流程。

3.Mesos层级架构

下面的图将Mesos和Linux操作系统做了对比,很好说明了Mesos设计模式和Mesos和Framework 及Task之间的关系。

Mesos相对于Linux,BSD系统的内核,Framework相当于Linux的系统服务或者外壳,二者都是在此之上运行具体的任务。不同之处在于Mesos调度的是多台机器。

4.Mesos上手实践

以最简单的多结点服务为例,我有一个基于SpringBoot的已经打好Docker镜像的web服务,目前的需求是我们需要把这个服务部署在三个节点防止单点故障,并且以后随着环境的变化(用户访问量的增加/减少,容灾灾备等)我们还要对这个服务随时进行扩缩容。针对当前的需求分析后设计如下基于Apache Mesos的部署架构图。

简单介绍一下,再生产中我们的Mesos Framework选用Marathon,Marathon是一个中间层的生产级容器编排平台,可以运行在数据中心操作系统(DC / OS)和Apache Mesos上。具体资料可以从官方Github地址获取:http://mesosphere.github.io/marathon。使用Marathon lb实现自动负载均衡。

首先有三台机器分别为 server01 server02 server03,将server01作为Mesos master节点,server02 和 server03 作为slave节点,由于个人测试机器有限所以Zookeeper和Marathon Marathon lb 都部署在server01上,生产环境强烈建议部署独立的Zookeeper集群,Marathon也脱离Mesos独立部署。

4.1 Mesos 安装

Mesos安装方式有好几种,源码编译安装,二进制包安装,使用Docker镜像来运行Mesos。

前两种安装方式介绍在Mesos官网Getting Started 就可以找到,http://mesos.apache.org/getting-started,参考文档很容易就可以装好,我们介绍第三张基于Docker的安装方式,减少对容器环境的依赖,也方便管理。

如果不了解MesosDocker镜像的话,我们可以先去看看DockerHub上有没有已经做好的镜像,https://hub.docker.com,搜索mesos,可以看到已经有mesosphere为我们打好的镜像,mesosphere为dockerHub贡献的很多非常实用的镜像。

找到需要的镜像

点击去看看它的一些描述信息,ReadMe and Dockerfiles: https://github.com/mesosphere/docker-containers/tree/master/mesos

据此我们大致知道如何来运行master个slave的镜像,可以选择一个镜像版本,我就选择1.6.2了。

接下来开始安装,登录到master机器(server01),执行 docker version 确认docker安装信息。

关于安装并启动Zookeeper,参考我这篇文章,zookeeper 安装

新建一个放置启动脚本的路径,创建启动脚本。

mkdir -p /data/mesos
cd /data/mesos
vim mesos-master.sh

对之前提供的启动命令进行调整,修改zk地址,指定net模式,修改挂载日志和临时文件路径,指定镜像版本,关闭host查询,指定hostname,具体如下(IP为虚拟):

#!/bin/bash
docker run -d --net=host \
  --hostname=36.107.107.175 \
  -e MESOS_PORT=5050 \
  -e MESOS_ZK=zk://127.0.0.1:2181/mesos \
  -e MESOS_QUORUM=1 \
  -e MESOS_REGISTRY=in_memory \
  -e MESOS_LOG_DIR=/var/log/mesos \
  -e MESOS_WORK_DIR=/var/tmp/mesos \
  -v "/data/mesos/log/mesos:/var/log/mesos" \
  -v "/data/mesos/tmp/mesos:/var/tmp/mesos" \
  mesosphere/mesos-master:1.6.2 --no-hostname_lookup --hostname=mesos.mrpei.cn

确认已启动Zookeeper后,执行如下脚本即可启动Mesos master

sh mesos-master.sh

查看容器信息

docker ps

如果启动失败,可以执行

docker logs [container id]

查看日志,定位问题。

类似的 在slave机器上也执行以上操作,下面给出slave的启动脚本:

#!/bin/bash
docker run -d --net=host --privileged \
  --hostname=36.107.107.180 \
  -e MESOS_PORT=5051 \
  -e MESOS_MASTER=zk://36.107.107.175:2181/mesos \
  -e MESOS_SWITCH_USER=0 \
  -e MESOS_CONTAINERIZERS=docker,mesos \
  -e MESOS_LOG_DIR=/var/log/mesos \
  -e MESOS_WORK_DIR=/var/tmp/mesos \
  -v "$(pwd)/log/mesos:/var/log/mesos" \
  -v "$(pwd)/tmp/mesos:/var/tmp/mesos" \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /sys:/sys \
  -v /usr/bin/docker:/usr/local/bin/docker \
  mesosphere/mesos-slave:1.6.2 --no-systemd_enable_support

都启动以后可以访问master的5050端口,可以看到Mesos的基本信息面板。

agent信息

4.2 Marathon 和 Marathon lb安装

有了上面的经验,我们对这两个组件也采用运行docker容器的方式来启动。DockerHub查看Marathon 和 Marathon lb的镜像。其实mesosphere已经为我们准备好了,我们去看看这两个镜像的描述信息。

对于Marathon可以看到如下信息:

我们可以根据提供的信息编写一个启动脚本:

#!/bin/bash
docker run -d --net=host \
 mesosphere/marathon:v1.5.15 \
 --master zk://36.107.107.175:2181/mesos \
 --zk zk://36.107.107.175:2181/marathon

启动Marathon:

sh marathon.sh

Marathon lb镜像信息如下:

编写启动脚本如下:

#!/bin/bash
docker run -d -p 8090:9090 \
 -e PORTS=8090 mesosphere/marathon-lb:v1.13.0 sse --group external --marathon http://36.107.107.175:8080

启动Marathon lb:

sh marathon-lb.sh

查看镜像启动情况:

访问8090查看Marathon UI

4.3 部署web服务

Marathon UI里 点击create application 填写id 需要的资源 和 镜像地址,端口映射信息,由于之前我已经把镜像打好推到了dockerHub,所以直接填写镜像pull的地址即可。点击create即可。

关于镜像仓库:标准企业生产环境是有自己的私有镜像仓库的,用的比较多的是 Vmware 开源的 Harbor,我之前在一台机器上起着Harbor来着,由于机器资源有限,并且三台机器并不是一家云服务供应商,1M带宽下 镜像 push pull 都很慢,所以在这里就没有引入Docker 私有仓库的问题。如果要使用私有仓库,可以直接在三台机器上分别执行 docker login 登录到私服就可以了。

二. Swarm

 

转载于:https://my.oschina.net/mrpei123/blog/3044002

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您解答这个问题。 首先,为了创建一个具有伸缩性的Docker集群,我们需要选择一个适合的容器编排工具。目前比较流行的容器编排工具有KubernetesDocker Swarm和Apache Mesos等。在这里,我们选择Kubernetes作为我们的容器编排工具。 接下来,我们需要安装Kubernetes并搭建Docker服务Kubernetes有一个独立的二进制文件kubeadm,它可以帮助我们快速搭建一个Kubernetes集群。我们可以在每台服务器上安装Docker,并使用kubeadm在这些服务器上启动Kubernetes集群。具体步骤如下: 1. 在每台服务器上安装Docker。可以使用以下命令安装Docker: ``` sudo apt-get update sudo apt-get install docker.io ``` 2. 在每台服务器上安装kubeadm、kubelet和kubectl。可以使用以下命令安装: ``` sudo apt-get update && sudo apt-get install -y apt-transport-https curl curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list deb https://apt.kubernetes.io/ kubernetes-xenial main EOF sudo apt-get update sudo apt-get install -y kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl ``` 3. 在其中一台服务器上初始化Kubernetes集群。可以使用以下命令初始化: ``` sudo kubeadm init --pod-network-cidr=10.244.0.0/16 ``` 4. 安装网络插件。Kubernetes需要一个网络插件来为容器分配IP地址。这里我们选择使用Calico作为网络插件。可以使用以下命令安装: ``` kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml ``` 5. 将其他服务器加入Kubernetes集群。可以使用kubeadm提供的命令来将其他服务器加入集群: ``` sudo kubeadm join <ip_address_of_master>:<port> --token <token> --discovery-token-ca-cert-hash sha256:<hash> ``` 这里的`<ip_address_of_master>`是Kubernetes的主节点IP地址,`<port>`是Kubernetes API服务器的端口号,`<token>`和`<hash>`是kubeadm初始化集群时生成的。 6. 部署应用程序。现在我们可以使用Kubernetes来部署我们的应用程序了。可以使用kubectl提供的命令来部署应用程序,例如: ``` kubectl create deployment myapp --image=myimage:v1 ``` 这里的`myapp`是应用程序的名称,`myimage:v1`是Docker镜像的名称和版本号。 7. 扩展应用程序。现在我们可以使用Kubernetes来扩展我们的应用程序了。可以使用kubectl提供的命令来扩展应用程序,例如: ``` kubectl scale deployment/myapp --replicas=3 ``` 这里的`myapp`是应用程序的名称,`--replicas=3`表示我们要将应用程序的副本数扩展到3。 以上就是基于Kubernetes创建Docker集群并搭建Docker服务的步骤。使用Kubernetes,我们可以轻松地管理Docker容器并实现伸缩性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值