diff --git a/README.md b/README.md index 76d5c1f..771b6ff 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ Docker —— 从入门到实践 =============== -v0.4.2 +v0.5.0 [Docker](docker.com) 是个伟大的项目,它彻底释放了虚拟化的威力,极大降低了云计算资源供应的成本,同时让应用的分发、测试、部署和分发都变得前所未有的高效和轻松! -本书既适用于具备基础 Linux 知识的 Docker 初学者,也希望可供理解原理和实现的高级用户参考。同时,书中给出的实践案例,可供在进行实际部署时借鉴。前六章为基础内容,供用户理解 Docker 的基本概念和操作;7 ~ 9 章介绍一些高级操作;第 10 章给出典型的应用场景和实践案例;11 ~ 13 章介绍关于 Docker 实现的相关技术。14 ~ 17章介绍相关的一些开源项目。 +本书既适用于具备基础 Linux 知识的 Docker 初学者,也希望可供理解原理和实现的高级用户参考。同时,书中给出的实践案例,可供在进行实际部署时借鉴。前六章为基础内容,供用户理解 Docker 的基本概念和操作;7 ~ 9 章介绍一些高级操作;第 10 章给出典型的应用场景和实践案例;11 ~ 13 章介绍关于 Docker 实现的相关细节技术。后续章节则分别介绍一些相关的热门开源项目。 在线阅读:[GitBook](https://www.gitbook.io/book/yeasy/docker_practice) 或 [DockerPool](http://dockerpool.com/static/books/docker_practice/index.html)。 @@ -13,7 +13,7 @@ v0.4.2 ![Docker 技术入门与实战](docker_primer.png) -《[Docker 技术入门与实战](http://item.jd.com/11598400.html)》一书已经正式出版,包含大量第一手实战案例,欢迎大家阅读使用。 +《[Docker 技术入门与实战](http://item.jd.com/11598400.html)》一书已经正式出版,包含大量第一手实战案例和更为深入的技术剖析,欢迎大家阅读使用。 * [China-Pub](http://product.china-pub.com/3770833) * [京东图书](http://item.jd.com/11598400.html) @@ -21,11 +21,12 @@ v0.4.2 * [亚马逊图书](http://www.amazon.cn/%E5%9B%BE%E4%B9%A6/dp/B00R5MYI7C/ref=lh_ni_t?ie=UTF8&psc=1&smid=A1AJ19PSB66TGU) ## 主要版本历史 -* 0.5: 2015-? +* 0.5: 2015-06-29 * 添加 Compose 项目 * 添加 Machine 项目 * 添加 Swarm 项目 * 完善 Kubernetes 项目内容 + * 添加 Mesos 项目内容 * 0.4: 2015-05-08 * 添加 Etcd 项目 * 添加 Fig 项目 @@ -50,7 +51,7 @@ v0.4.2 * 修正错别字和表达不通顺的地方。 -本书源码在 Github 上维护,欢迎参与:[https://github.com/yeasy/docker_practice](https://github.com/yeasy/docker_practice)。贡献者 [名单](https://github.com/yeasy/docker_practice/graphs/contributors)。 +Docker 自身仍在快速发展中,生态环境也在蓬勃成长。源码开源托管在 Github 上,欢迎参与维护:[https://github.com/yeasy/docker_practice](https://github.com/yeasy/docker_practice)。贡献者 [名单](https://github.com/yeasy/docker_practice/graphs/contributors)。 ## 参加步骤 * 在 GitHub 上 `fork` 到自己的仓库,如 `docker_user/docker_practice`,然后 `clone` 到本地,并设置用户信息。 diff --git a/SUMMARY.md b/SUMMARY.md index 172d9b0..a5ba3aa 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -105,6 +105,11 @@ * [基本概念](kubernetes/concepts.md) * [kubectl 使用](kubernetes/kubectl.md) * [架构设计](kubernetes/design.md) +* [Mesos 项目](mesos/README.md) + * [简介](mesos/intro.md) + * [安装与使用](mesos/installation.md) + * [原理与架构](mesos/architecture.md) + * [配置项解析](mesos/configuration.md) * [附录一:命令查询](appendix_command/README.md) * [附录二:常见仓库介绍](appendix_repo/README.md) * [Ubuntu](appendix_repo/ubuntu.md) diff --git a/_images/marathon.png b/_images/marathon.png new file mode 100644 index 0000000..130c664 Binary files /dev/null and b/_images/marathon.png differ diff --git a/_images/mesos-architecture.png b/_images/mesos-architecture.png new file mode 100644 index 0000000..9a0a8de Binary files /dev/null and b/_images/mesos-architecture.png differ diff --git a/_images/mesos.png b/_images/mesos.png new file mode 100644 index 0000000..c3ad762 Binary files /dev/null and b/_images/mesos.png differ diff --git a/mesos/README.md b/mesos/README.md new file mode 100644 index 0000000..012b3e1 --- /dev/null +++ b/mesos/README.md @@ -0,0 +1 @@ +# Mesos 项目 diff --git a/mesos/architecture.md b/mesos/architecture.md new file mode 100644 index 0000000..19d749c --- /dev/null +++ b/mesos/architecture.md @@ -0,0 +1,64 @@ +## Mesos 基本原理与架构 + +首先,Mesos 自身只是一个资源调度框架,并非一整套完整的应用管理平台,本身是不能干活的。但是它可以比较容易的跟各种应用管理或者中间件平台整合,一起工作,提高资源使用效率。 + +### 架构 +![mesos-arch](../_images/mesos-architecture.png) +master-slave 架构,master 使用 zookeeper 来做 HA。 + +master 单独运行在管理节点上,slave 运行在各个计算任务节点上。 + +各种具体任务的管理平台,即 framework 跟 master 交互,来申请资源。 + + +### 基本单元 + +#### master +负责整体的资源调度和逻辑控制。 + +#### slave +负责汇报本节点上的资源给 master,并负责隔离资源来执行具体的任务。 + +隔离机制当然就是各种容器机制了。 + +#### framework +framework 是实际干活的,包括两个主要组件: + +* scheduler:注册到主节点,等待分配资源; +* executor:在 slave 节点上执行本framework 的任务。 + +framework 分两种:一种是对资源需求可以 scale up 或者 down 的(Hadoop、Spark);一种是对资源需求大小是固定的(MPI)。 + +### 调度 +对于一个资源调度框架来说,最核心的就是调度机制,怎么能快速高效的完成对某个 framework 资源的分配(最好是能猜到它的实际需求)。 + +#### 两层调度算法: +master 先调度一大块资源给某个 framework,framework 自己再实现内部的细粒度调度。 + +调度机制支持插件。默认是 DRF。 + +#### 基本调度过程 +调度通过 offer 方式交互: + +* master 提供一个 offer(一组资源) 给 framework; +* framework 可以决定要不要,如果接受的话,返回一个描述,说明自己希望如何使用和分配这些资源(可以说明只希望使用部分资源,则多出来的会被 master 收回); +* master 则根据 framework 的分配情况发送给 slave,以使用 framework 的 executor 来按照分配的资源策略执行任务。 + +#### 过滤器 +framework 可以通过过滤器机制告诉 master 它的资源偏好,比如希望分配过来的 offer 有哪个资源,或者至少有多少资源。 + +主要是为了加速资源分配的交互过程。 + +#### 回头机制 +master 可以通过回收计算节点上的任务来动态调整长期任务和短期任务的分布。 + + +### HA + +#### master +master 节点存在单点失效问题,所以肯定要上 HA,目前主要是使用 zookpeer 来热备份。 + +同时 master 节点可以通过 slave 和 framework 发来的消息重建内部状态(具体能有多快呢?这里不使用数据库可能是避免引入复杂度。)。 + +#### framework 通知 +framework 中相关的失效,master 将发给它的 scheduler 来通知。 diff --git a/mesos/configuration.md b/mesos/configuration.md new file mode 100644 index 0000000..5b447d8 --- /dev/null +++ b/mesos/configuration.md @@ -0,0 +1,108 @@ +## Mesos 配置项解析 + +Mesos 的 [配置项](http://mesos.apache.org/documentation/latest/configuration/) 可以通过启动时候传递参数或者配置目录下文件的方式给出(推荐方式,一目了然)。 + +分为三种类型:通用项(master 和 slave 都支持),只有 master 支持的,以及只有 slave 支持的。 + + +### 通用项 +* `--ip=VALUE` 监听的 IP 地址 +* `--firewall_rules=VALUE` endpoint 防火墙规则,`VALUE` 可以是 JSON 格式或者存有 JSON 格式的文件路径。 +* `--log_dir=VALUE` 日志文件路径,默认不存储日志到本地 +* `--logbufsecs=VALUE` buffer 多少秒的日志,然后写入本地 +* `--logging_level=VALUE` 日志记录的最低级别 +* `--port=VALUE` 监听的端口,master 默认是 5050,slave 默认是 5051。 + +### master 专属配置项 +* `--quorum=VALUE` 必备项,使用基于 replicated-Log 的注册表时,复制的个数 +* `--work_dir=VALUE` 必备项,注册表持久化信息存储位置 +* `--zk=VALUE` 必备项,zookeepr 的接口地址,支持多个地址,之间用逗号隔离,可以为文件路径 +* `--acls=VALUE` ACL 规则或所在文件 +* `--allocation_interval=VALUE` 执行 allocation 的间隔,默认为 1sec +* `--allocator=VALUE` 分配机制,默认为 HierarchicalDRF +* `--[no-]authenticate` 是否允许非认证过的 framework 注册 +* `--[no-]authenticate_slaves` 是否允许非认证过的 slaves 注册 +* `--authenticators=VALUE` 对 framework 或 salves 进行认证时的实现机制 +* `--cluster=VALUE` 集群别名 +* `--credentials=VALUE` 存储加密后凭证的文件的路径 +* `--external_log_file=VALUE` 采用外部的日志文件 +* `--framework_sorter=VALUE` 给定 framework 之间的资源分配策略 +* `--hooks=VALUE` master 中安装的 hook 模块 +* `--hostname=VALUE` master 节点使用的主机名,不配置则从系统中获取 +* `--[no-]log_auto_initialize` 是否自动初始化注册表需要的 replicated 日志 +* `--modules=VALUE` 要加载的模块,支持文件路径或者 JSON +* `--offer_timeout=VALUE` offer 撤销的超时 +* `--rate_limits=VALUE` framework 的速率限制,比如 qps +* `--recovery_slave_removal_limit=VALUE` 限制注册表恢复后可以移除或停止的 slave 数目,超出后 master 会失败,默认是 100% +* `--slave_removal_rate_limit=VALUE slave` 没有完成健康度检查时候被移除的速率上限,例如 1/10mins 代表每十分钟最多有一个 +* `--registry=VALUE` 注册表的持久化策略,默认为 `replicated_log`,还可以为 `in_memory` +* `--registry_fetch_timeout=VALUE` 访问注册表失败超时 +* `--registry_store_timeout=VALUE` 存储注册表失败超时 +* `--[no-]registry_strict` 是否按照注册表中持久化信息执行操作,默认为 false +* `--roles=VALUE` 集群中 framework 可以所属的分配角色 +* `--[no-]root_submissions` root 是否可以提交 framework,默认为 true +* `--slave_reregister_timeout=VALUE` 新的 lead master 节点选举出来后,多久之内所有的 slave 需要注册,超时的 salve 将被移除并关闭,默认为 10mins +* `--user_sorter=VALUE` 在用户之间分配资源的策略,默认为 drf +* `--webui_dir=VALUE` webui 实现的文件目录所在,默认为 `/usr/local/share/mesos/webui` +* `--weights=VALUE` 各个角色的权重 +* `--whitelist=VALUE` 文件路径,包括发送 offer 的 slave 名单,默认为 None +* `--zk_session_timeout=VALUE` session 超时,默认为 10secs +* `--max_executors_per_slave=VALUE` 配置了 `--with-network-isolator` 时可用,限制每个 slave 同时执行任务个数 + +### slave 专属配置项 +* `--master=VALUE` 必备项,master 所在地址,或 zookeeper 地址,或文件路径,可以是列表 +* `--attributes=VALUE` 机器属性 +* `--authenticatee=VALUE` 跟 master 进行认证时候的认证机制 +* `--[no-]cgroups_enable_cfs` 采用 CFS 进行带宽限制时候对 CPU 资源进行限制,默认为 false +* `--cgroups_hierarchy=VALUE` cgroups 的目录根位置,默认为 `/sys/fs/cgroup` +* `--[no-]cgroups_limit_swap` 限制内存和 swap,默认为 false,只限制内存 +* `--cgroups_root=VALUE` 根 cgroups 的名称,默认为 mesos +* `--container_disk_watch_interval=VALUE` 为容器进行硬盘配额查询的时间间隔 +* `--containerizer_path=VALUE` 采用外部隔离机制(`--isolation=external`)时候,外部容器机制执行文件路径 +* `--containerizers=VALUE` 可用的容器实现机制,包括 mesos、external、docker +* `--credential=VALUE` 加密后凭证,或者所在文件路径 +* `--default_container_image=VALUE` 采用外部容器机制时,任务缺省使用的镜像 +* `--default_container_info=VALUE` 容器信息的缺省值 +* `--default_role=VALUE` 资源缺省分配的角色 +* `--disk_watch_interval=VALUE` 硬盘使用情况的周期性检查间隔,默认为 1mins +* `--docker=VALUE` docker 执行文件的路径 +* `--docker_remove_delay=VALUE` 删除容器之前的等待时间,默认为 6hrs +* `--[no-]docker_kill_orphans` 清除孤儿容器,默认为 true +* `--docker_sock=VALUE` docker sock 地址,默认为 `/var/run/docker.sock` +* `--docker_mesos_image=VALUE` 运行 slave 的 docker 镜像,如果被配置,docker 会假定 slave 运行在一个 docker 容器里 +* `--docker_sandbox_directory=VALUE` sandbox 映射到容器里的哪个路径 +* `--docker_stop_timeout=VALUE` 停止实例后等待多久执行 kill 操作,默认为 0secs +* `--[no-]enforce_container_disk_quota` 是否启用容器配额限制,默认为 false +* `--executor_registration_timeout=VALUE` 执行应用最多可以等多久再注册到 slave,否则停止它,默认为 1mins +* `--executor_shutdown_grace_period=VALUE` 执行应用停止后,等待多久,默认为 5secs +* `--external_log_file=VALUE` 外部日志文件 +* `--frameworks_home=VALUE` 执行应用前添加的相对路径,默认为空 +* `--gc_delay=VALUE` 多久清理一次执行应用目录,默认为 1weeks +* `--gc_disk_headroom=VALUE` 调整计算最大执行应用目录年龄的硬盘留空量,默认为 0.1 +* `--hadoop_home=VALUE` hadoop 安装目录,默认为空,会自动查找 HADOOP_HOME 或者从系统路径中查找 +* `--hooks=VALUE` 安装在 master 中的 hook 模块列表 +* `--hostname=VALUE` slave 节点使用的主机名 +* `--isolation=VALUE` 隔离机制,例如 `posix/cpu,posix/mem`(默认)或者 `cgroups/cpu,cgroups/mem` +* `--launcher_dir=VALUE` mesos 可执行文件的路径,默认为 `/usr/local/lib/mesos` +* `--modules=VALUE` 要加载的模块,支持文件路径或者 JSON +* `--perf_duration=VALUE` perf 采样时长,必须小于 perf_interval,默认为 10secs +* `--perf_events=VALUE` perf 采样的事件 +* `--perf_interval=VALUE` perf 采样的时间间隔 +* `--recover=VALUE` 回复后是否重连上旧的执行应用 +* `--recovery_timeout=VALUE` slave 恢复时的超时,太久则所有相关的执行应用将自行退出,默认为 15mins +* `--registration_backoff_factor=VALUE` 跟 master 进行注册时候的重试时间间隔算法的因子,默认为 1secs,采用随机指数算法,最长 1mins +* `--resource_monitoring_interval=VALUE` 周期性监测执行应用资源使用情况的间隔,默认为 1secs +* `--resources=VALUE` 每个 slave 可用的资源 +* `--slave_subsystems=VALUE` slave 运行在哪些 cgroup 子系统中,包括 memory,cpuacct 等,缺省为空 +* `--[no-]strict` 是否认为所有错误都不可忽略,默认为 true +* `--[no-]switch_user` 用提交任务的用户身份来运行,默认为 true +* `--fetcher_cache_size=VALUE` fetcher 的 cache 大小,默认为 2 GB +* `--fetcher_cache_dir=VALUE` fetcher cache 文件存放目录,默认为 /tmp/mesos/fetch +* `--work_dir=VALUE` framework 的工作目录,默认为 /tmp/mesos + +下面的选项需要配置 `--with-network-isolator` 一起使用 +* `--ephemeral_ports_per_container=VALUE` 分配给一个容器的临时端口,默认为 1024 +* `--eth0_name=VALUE` public 网络的接口名称,如果不指定,根据主机路由进行猜测 +* `--lo_name=VALUE` loopback 网卡名称 +* `--egress_rate_limit_per_container=VALUE` 每个容器的 egress 流量限制速率 +* `--[no-]network_enable_socket_statistics` 是否采集每个容器的 socket 统计信息,默认为 false diff --git a/mesos/installation.md b/mesos/installation.md new file mode 100644 index 0000000..1b0c7c7 --- /dev/null +++ b/mesos/installation.md @@ -0,0 +1,191 @@ +## Mesos + Marathon 安装与使用 + +Marathon 是可以跟 Mesos 一起协作的一个 framework,用来运行持久性的应用。 + +### 安装 +一共需要安装四种组件,mesos-master、marathon、zookeeper 需要安装到所有的主节点,mseos-slave 需要安装到从节点。 + +mesos 利用 zookper 来进行主节点的同步,以及从节点发现主节点的过程。 + +#### 源码编译 + +下载源码 +```sh +git clone https://git-wip-us.apache.org/repos/asf/mesos.git +``` + +安装依赖 + +```sh +#jdk-7 +sudo apt-get update && sudo apt-get install -y openjdk-7-jdk +#autotools +sudo apt-get install -y autoconf libtool +#Mesos dependencies. +sudo apt-get -y install build-essential python-dev python-boto libcurl4-nss-dev libsasl2-dev maven libapr1-dev libsvn-dev +``` + +编译&安装 +```sh +$ cd mesos + +# Bootstrap (Only required if building from git repository). +$ ./bootstrap + +$ mkdir build +$ cd build && ../configure +$ make +$ make check && make install +``` + +#### [软件源安装](https://mesosphere.com/downloads/) +以 ubuntu 系统为例。 + +安装 Docker,不再赘述,可以参考 [这里](http://yeasy.gitbooks.io/docker_practice/content/install/index.html)。 + +```sh +# Setup +sudo apt-key adv --keyserver keyserver.ubuntu.com --recv E56151BF +DISTRO=$(lsb_release -is | tr '[:upper:]' '[:lower:]') +CODENAME=$(lsb_release -cs) + +# Add the repository +echo "deb http://repos.mesosphere.io/${DISTRO} ${CODENAME} main" | \ + sudo tee /etc/apt/sources.list.d/mesosphere.list + +sudo apt-get -y update && sudo apt-get -y install zookeeper mesos marathon +``` + +#### [基于 Docker](https://github.com/sekka1/mesosphere-docker) +将基于如下镜像: + +* ZooKeeper:https://registry.hub.docker.com/u/garland/zookeeper/ +* Mesos:https://registry.hub.docker.com/u/garland/mesosphere-docker-mesos-master/ +* Marathon:https://registry.hub.docker.com/u/garland/mesosphere-docker-marathon/ + +其中 mesos-master 镜像将作为 master 和 slave 容器使用。 + +导出本地机器的地址到环境变量。 +```sh +HOST_IP=10.11.31.7 +``` + +启动 Zookeepr 容器。 +```sh +docker run -d \ +-p 2181:2181 \ +-p 2888:2888 \ +-p 3888:3888 \ +garland/zookeeper +``` + +启动 Mesos Master 容器。 +```sh +docker run --net="host" \ +-p 5050:5050 \ +-e "MESOS_HOSTNAME=${HOST_IP}" \ +-e "MESOS_IP=${HOST_IP}" \ +-e "MESOS_ZK=zk://${HOST_IP}:2181/mesos" \ +-e "MESOS_PORT=5050" \ +-e "MESOS_LOG_DIR=/var/log/mesos" \ +-e "MESOS_QUORUM=1" \ +-e "MESOS_REGISTRY=in_memory" \ +-e "MESOS_WORK_DIR=/var/lib/mesos" \ +-d \ +garland/mesosphere-docker-mesos-master +``` + +启动 Marathon。 +```sh +docker run \ +-d \ +-p 8080:8080 \ +garland/mesosphere-docker-marathon --master zk://${HOST_IP}:2181/mesos --zk zk://${HOST_IP}:2181/marathon +``` + +启动 Mesos slave 容器。 +```sh +docker run -d \ +--name mesos_slave_1 \ +--entrypoint="mesos-slave" \ +-e "MESOS_MASTER=zk://${HOST_IP}:2181/mesos" \ +-e "MESOS_LOG_DIR=/var/log/mesos" \ +-e "MESOS_LOGGING_LEVEL=INFO" \ +garland/mesosphere-docker-mesos-master:latest +``` + +接下来,可以通过访问本地 8080 端口来使用 Marathon 启动任务了。 + + +### 配置说明 + +#### ZooKeepr + +ZooKeepr 是一个分布式应用的协调工具,用来管理多个 Master 节点的选举和冗余,监听在 2181 端口。 + +配置文件在 /etc/zookeeper/conf/ 目录下。 + +首先,要修改 myid,手动为每一个节点分配一个自己的 id(1-255之间)。 + +zoo.cfg 是主配置文件,主要修改如下的三行(如果你启动三个 zk 节点)。 +```sh +server.1=zookeeper1:2888:3888 +server.2=zookeeper2:2888:3888 +server.3=zookeeper3:2888:3888 +``` + +主机名需要自己替换,并在 /etc/hosts 中更新。 + +第一个端口负责从节点连接到主节点的;第二个端口负责主节点的选举通信。 + +#### Mesos + +Mesos 的默认配置目录分别为: + +* /etc/mesos:共同的配置文件,最关键的是 zk 文件; +* /etc/mesos-master:主节点的配置,等价于启动 mesos-master 时候的默认选项; +* /etc/mesos-slave:从节点的配置,等价于启动 mesos-master 时候的默认选项。 + +###### 主节点 +首先在所有节点上修改 /etc/mesos/zk,为 主节点的 zookeeper 地址列表,例如: +```sh +zk://ip1:2181,ip2:2181/mesos +``` +创建 /etc/mesos-master/ip 文件,写入主节点监听的地址。 + +还可以创建 /etc/mesos-master/cluster 文件,写入集群的别名。 + +之后,启动服务: +```sh +sudo service mesos-master start +``` +更多选项可以参考[这里](http://open.mesosphere.com/reference/mesos-master/)。 + +###### 从节点 + +在从节点上,修改 /etc/mesos-slave/ip 文件,写入跟主节点通信的地址。 + +之后,启动服务。 +```sh +sudo service mesos-slave start +``` + +更多选项可以参考[这里](http://open.mesosphere.com/reference/mesos-slave/)。 + +此时,通过浏览器访问本地 5050 端口,可以看到节点信息。 + +![mesos](../_images/mesos.png) + +#### Marathon +启动 marathon 服务。 +```sh +sudo service marathon start +``` + +启动成功后,在 mesos 的 web界面的 frameworks 标签页下面将能看到名称为 marathon 的框架出现。 + +同时可以通过浏览器访问 8080 端口,看到 marathon 的管理界面。 + +![marathon](../_images/marathon.png) + +此时,可以通过界面或者 REST API 来创建一个应用,Marathon 会保持该应用的持续运行。 diff --git a/mesos/intro.md b/mesos/intro.md new file mode 100644 index 0000000..4f400bf --- /dev/null +++ b/mesos/intro.md @@ -0,0 +1,2 @@ +## 简介 +Mesos 是一个集群资源的自动调度平台,Apache 开源项目,它的定位是要做数据中心操作系统的内核。目前由 Mesosphere 公司维护,更多信息可以自行查阅 [Mesos 项目地址](http://mesos.apache.org/)或 [Mesosphere](https://mesosphere.com)。