swarmkit
SwarmKit是用于在任何规模上编排分布式系统的工具包。 它包括节点发现的原语,基于raft的共识,任务调度等。
其主要优点是:
- 分布式:SwarmKit使用raft共识算法来协调,不依赖单一故障点执行决策。
- 安全:群集中的节点通信和成员资格是开箱即用的。 SwarmKit使用相互TLS进行节点认证,角色授权和传输加密,自动执行证书颁发和轮换。
- 简单:SwarmKit操作简单,可以最大限度地减少基础架构依赖。 它不需要外部数据库来操作。
Overview
运行SwarmKit的机器可以组合在一起,以形成一个Swarm,彼此协调任务。 一旦机器加入,它就成为一个Swarm Node。 节点可以是工作节点或管理器节点。
- Worker Nodes负责使用执行程序运行任务。 SwarmKit配有一个默认的Docker Container Executor,可以方便地交换出来。
- Manager Nodes另一方面接受来自用户的规范,并负责将所需状态与实际集群状态协调一致。
operator可以通过宣传一名worker到manager或将manager降级给worker来动态更新节点的角色。
服务中组织任务。 服务是更高级别的抽象,允许用户声明一组任务的所需状态。 服务定义应该创建什么类型的任务以及如何执行它们(例如,始终运行这么多副本)以及如何更新它们(例如滚动更新)。
Features
Some of SwarmKit's main features are:
Orchestration
Desired State Reconciliation: SwarmKit不断地将所需状态与当前的集群状态进行比较,并在必要时对两者进行对照。 例如,如果节点出现故障,SwarmKit将其任务重新排列到不同的节点上。
Service Types: 有不同类型的服务。 该项目目前正在与其中的两个开箱即用
- Replicated Services are scaled to the desired number of replicas.
- Global Services run one task on every available node in the cluster.
Configurable Updates: 在任何时候,您可以更改服务的一个或多个字段的值。 进行更新后,SwarmKit通过确保所有任务都使用所需的设置来协调所需的状态。 默认情况下,它执行锁步更新 - 即同时更新所有任务。 这可以通过不同的旋钮进行配置:
- Parallelism 定义可以同时执行多少次更新。
- Delay设置更新之间的最小延迟。 SwarmKit将通过关闭以前的任务,启动一个新的任务,等待它转换到RUNNING状态,然后等待其他配置的延迟。 最后,它将转移到其他任务上。
Restart Policies: 业务流程层监控任务,并根据指定的策略对故障作出反应。 操作员可以定义重新启动条件,延迟和限制(给定时间窗口中的最大尝试次数)。 SwarmKit可以决定在不同的机器上重新启动任务。 这意味着错误的节点将逐渐消除其任务。
Scheduling
Resource Awareness: SwarmKit知道节点上可用的资源,并将相应地安排任务。
Constraints: operators可以通过定义约束表达式来限制可以调度任务的节点集。 多个约束找到满足每个表达式的节点,即AND匹配。 约束可以匹配下表中的节点属性。 请注意,engine.label是从Docker Engine收集的,具有操作系统,驱动程序等信息。集群管理员为操作目的添加了node.labels。 例如,一些节点具有安全兼容的标签,可以按照符合要求运行任务。
node.id | node's ID | node.id == 2ivku8v2gvtg4 |
node.hostname | node's hostname | node.hostname != node-2 |
node.ip | node's IP address | node.ip != 172.19.17.0/24 |
node.role | node's manager or worker role | node.role == manager |
node.platform.os | node's operating system | node.platform.os == linux |
node.platform.arch | node's architecture | node.platform.arch == x86_64 |
node.labels | node's labels added by cluster admins | node.labels.security == high |
engine.labels | Docker Engine's labels |
|
Strategies: 目前,该项目正在发布一种扩展策略,只要满足约束和资源需求,就会尝试在最不负载的节点上安排任务。
Cluster Management
- State Store: 管理器节点保持强烈一致,基于复制(基于raft)和集群极快(内存中读取)视图,从而允许他们在容忍故障的同时做出快速的调度决策。
- Topology Management: 节点角色(Worker / Manager)可以通过API / CLI调用动态更改。
- Node Management: 操作员可以改变节点的所需可用性:将其设置为“已暂停”将防止任何进一步的任务被调度到其中,而Drained将具有相同的效果,同时也重新调度其他任务(主要用于维护方案)。
Security
- Mutual TLS: 所有节点使用相互TLS相互通信。 swarm manager作为根证书颁发机构,向新节点颁发证书。
- Token-based Join: 所有节点都需要加密令牌来加入群集,从而定义了该节点的角色。 令牌可以根据需要频繁地旋转,而不影响已连接的节点。
- Certificate Rotation: TLS证书在每个节点上都被透明地旋转和重新加载,允许用户设置旋转发生的频率(当前默认值为3个月,最小为30分钟)。
Build
Requirements:
- Go 1.6 or higher
- A working golang environment
- Protobuf 3.x or higher to regenerate protocol buffer files (e.g. using
make generate
)
SwarmKit is built in Go and leverages a standard project structure to work well with Go tooling. If you are new to Go, please see BUILDING.md for a more detailed guide.
Once you have SwarmKit checked out in your $GOPATH
, the Makefile
can be used for common tasks.
From the project root directory, run the following to build swarmd
and swarmctl
:
$ make binaries
Build the development environment
要构建Swarmkit,您必须设置一个Go开发环境。 How to Write Go Code包含完整的说明。 当设置正确时,您应该在环境中设置GOROOT和GOPATH。
设置Go开发环境后,请使用go get查看swarmkit:
go get -d github.com/docker/swarmkit
This command installs the source repository into theGOPATH
. 没有必要使用去查看SwarmKit项目。 但是,为了使这些指令正常工作,您需要将项目检出到GOPATH的正确子目录:$ GOPATH / src / github.com / docker / swarmkit。
Repeatable Builds
对于完整的开发经验,应该进入$ GOPATH / src / github.com / docker / swarmkit。 从那里,常规的go命令,如go test,应该在每个包中工作(please see Developing if they don't work)。
Docker提供了一个Makefile,以方便支持可重复的构建。 make setup将工具安装到GOPATH上,用于开发SwarmKit:
一旦这些命令在GOPATH中可用,运行make来获得完整的构建:
cd github.com/golang/lint/
go install
cd gordonklaus/ineffassign/
go install
$ make binaries
上面提供了一个可重复的构建,使用载入的./vendor目录的内容。 这包括格式化,审查,起绒,建造和测试。 创建的二进制文件将在./bin中可用。
为常见任务提供了几个目标。 有关详细信息,请参阅Makefile。
Update vendored dependencies
To update dependency you need just change vendor.conf
file and run vndr
tool:
go get github.com/LK4D4/vndr
vndr
It's possible to update only one dependency:
vndr github.com/coreos/etcd v3.0.9
but it should be in sync with vendor.conf
.
Also, you can update dependency from fork for testing:
vndr github.com/coreos/etcd <revision> https://github.com/LK4D4/etcd.git
Regenerating protobuf bindings
This requires that you have Protobuf 3.x or higher. Once that is installed the bindings can be regenerated with:
make setup
make generate
NB: As of version 3.0.0-7 the Debian protobuf-compiler
package lacks a dependency on libprotobuf-dev
which contains some standard proto definitions, be sure to install both packages. This is Debian bug #842158.
[root@mhc swarmkit]# pwd
/root/GoglandProjects/beegoTest/src/github.com/docker/swarmkit
[root@mhc swarmkit]# ls bin
protoc-gen-gogoswarm swarm-bench swarmctl swarmd swarm-rafttool
Usage Examples
Setting up a Swarm
These instructions assume that swarmd
and swarmctl
are in your PATH.
(Before starting, make sure /tmp/node-N
don't exist)
Initialize the first node:
$ swarmd -d /tmp/node-1 --listen-control-api /tmp/node-1/swarm.sock --hostname node-1
Before joining cluster, the token should be fetched:
$ export SWARM_SOCKET=/tmp/node-1/swarm.sock
$ swarmctl cluster inspect default
ID : 87d2ecpg12dfonxp3g562fru1
Name : default
Orchestration settings:
Task history entries: 5
Dispatcher settings:
Dispatcher heartbeat period: 5s
Certificate Authority settings:
Certificate Validity Duration: 2160h0m0s
Join Tokens:
Worker: SWMTKN-1-3vi7ajem0jed8guusgvyl98nfg18ibg4pclify6wzac6ucrhg3-0117z3s2ytr6egmmnlr6gd37n
Manager: SWMTKN-1-3vi7ajem0jed8guusgvyl98nfg18ibg4pclify6wzac6ucrhg3-d1ohk84br3ph0njyexw0wdagx
在两个附加终端中,加入两个节点。 从下面的示例中,使用第一个节点的地址替换127.0.0.1:4242,并使用上面获取的<Worker Token>。 在这个例子中,
<Worker Token>是SWMTKN-1-3vi7ajem0jed8guusgvyl98nfg18ibg4pclify6wzac6ucrhg3-0117z3s2ytr6egmmnlr6gd37n。 如果加入节点在与节点1相同的主机上运行,
请选择其他远程侦听端口,例如--listen-remote-api 127.0.0.1:4343。
If joining as a manager, also specify the listen-control-api.
$ swarmd -d /tmp/node-4 --hostname node-4 --join-addr 127.0.0.1:4242 --join-token <Manager Token> --listen-control-api /tmp/node-4/swarm.sock --listen-remote-api 127.0.0.1:4245 在第四个终端中,使用swarmctl来探索和控制集群。 运行swarmctl之前,将SWARM_SOCKET环境变量设置为在启动管理器时在-listen-control-api中指定的manager套接字的路径。
To list nodes:
$ export SWARM_SOCKET=/tmp/node-1/swarm.sock
$ swarmctl node ls
ID Name Membership Status Availability Manager Status
-- ---- ---------- ------ ------------ --------------
3x12fpoi36eujbdkgdnbvbi6r node-2 ACCEPTED READY ACTIVE
4spl3tyipofoa2iwqgabsdcve node-1 ACCEPTED READY ACTIVE REACHABLE *
dknwk1uqxhnyyujq66ho0h54t node-3 ACCEPTED READY ACTIVE
zw3rwfawdasdewfq66ho34eaw node-4 ACCEPTED READY ACTIVE REACHABLE
Creating Services
Start a redis service:
swarmctl service create --name redis --image consul:0.8.4
[root@mhc bin]# swarmctl service ls
ID Name Image Replicas
-- ---- ----- --------
upfohowk6xj4wu0ch6ajvbgx5 redis consul:0.8.4 1/1
[root@mhc bin]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
00b40ca561f5 consul:0.8.4 "docker-entrypoint.sh" About a minute ago Up About a minute 8300-8302/tcp, 8500/tcp, 8301-8302/udp, 8600/tcp, 8600/udp redis.1.e8rzq3bz3ehf8q9rn5iay6fz4
[root@mhc bin]# swarmctl service inspect redis
ID : upfohowk6xj4wu0ch6ajvbgx5
Name : redis
Replicas : 1/1
Template
Container
Image : consul:0.8.4
Task ID Service Slot Image Desired State Last State Node
------- ------- ---- ----- ------------- ---------- ----
e8rzq3bz3ehf8q9rn5iay6fz4 redis 1 consul:0.8.4 RUNNING RUNNING 2 minutes ago mhc
Updating Services
You can update any attribute of a service.
For example, you can scale the service by changing the instance count:
[root@mhc bin]# swarmctl service inspect redis
ID : upfohowk6xj4wu0ch6ajvbgx5
Name : redis
Replicas : 1/1
Template
Container
Image : consul:0.8.4
Task ID Service Slot Image Desired State Last State Node
------- ------- ---- ----- ------------- ---------- ----
e8rzq3bz3ehf8q9rn5iay6fz4 redis 1 consul:0.8.4 RUNNING RUNNING 2 minutes ago mhc
[root@mhc bin]# swarmctl service update redis --replicas 3
upfohowk6xj4wu0ch6ajvbgx5
[root@mhc bin]# swarmctl service ls
ID Name Image Replicas
-- ---- ----- --------
upfohowk6xj4wu0ch6ajvbgx5 redis consul:0.8.4 1/3
[root@mhc bin]# swarmctl service ls
ID Name Image Replicas
-- ---- ----- --------
upfohowk6xj4wu0ch6ajvbgx5 redis consul:0.8.4 3/3
[root@mhc bin]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b192f8ea48d8 consul:0.8.4 "docker-entrypoint.sh" 15 seconds ago Up 12 seconds 8300-8302/tcp, 8500/tcp, 8301-8302/udp, 8600/tcp, 8600/udp redis.2.7uyq4kf7im0zralfjlwfx2w5e
36c3500f8fb7 consul:0.8.4 "docker-entrypoint.sh" 18 seconds ago Up 12 seconds 8300-8302/tcp, 8500/tcp, 8301-8302/udp, 8600/tcp, 8600/udp redis.3.u9t5w4hdbyfvy9k7jrgejxpkn
00b40ca561f5 consul:0.8.4 "docker-entrypoint.sh" 6 minutes ago Up 6 minutes 8300-8302/tcp, 8500/tcp, 8301-8302/udp, 8600/tcp, 8600/udp redis.1.e8rzq3bz3ehf8q9rn5iay6fz4
将副本从1更改为6,强制SwarmKit创建5个附加任务,以符合所需的状态。
每个其他字段也可以更改,如图像,args,env,...
让我们从redis更改图像:3.0.5到redis:3.0.6(例如升级):
$ swarmctl service update redis --image redis:3.0.6
默认情况下,所有任务都会同时更新。
可以通过定义更新选项来更改此行为。
例如,为了一次更新任务2,并在更新之间等待至少10秒钟:
$ swarmctl service update redis --image redis:3.0.7 --update-parallelism 2 --update-delay 10s
$ watch -n1 "swarmctl service inspect redis" # watch the update
这将更新2个任务,等待它们运行,然后再等待10秒,然后再转到其他任务。 可以在创建服务时设置更新选项,稍后更新。 如果update命令没有指定更新选项,则将使用最后一组选项。
Node Management
SwarmKit监视节点运行状况。 在节点故障的情况下,它将任务重新安排到其他节点。
操作员可以手动定义节点的可用性,并可以暂停和排除节点。
我们把节点1放到维护模式中:
$ swarmctl node drain node-1
$ swarmctl node ls
ID Name Membership Status Availability Manager Status
-- ---- ---------- ------ ------------ --------------
3x12fpoi36eujbdkgdnbvbi6r node-2 ACCEPTED READY ACTIVE
4spl3tyipofoa2iwqgabsdcve node-1 ACCEPTED READY DRAIN REACHABLE *
dknwk1uqxhnyyujq66ho0h54t node-3 ACCEPTED READY ACTIVE
$ swarmctl service inspect redis
ID : 08ecg7vc7cbf9k57qs722n2le
Name : redis
Replicas : 6/6
Update Status
State : COMPLETED
Started : 2 minutes ago
Completed : 1 minute ago
Message : update completed
Template
Container
Image : redis:3.0.7
Task ID Service Slot Image Desired State Last State Node
------- ------- ---- ----- ------------- ---------- ----
8uy2fy8dqbwmlvw5iya802tj0 redis 1 redis:3.0.7 RUNNING RUNNING 23 seconds ago node-2
7h9lgvidypcr7q1k3lfgohb42 redis 2 redis:3.0.7 RUNNING RUNNING 2 minutes ago node-3
ae4dl0chk3gtwm1100t5yeged redis 3 redis:3.0.7 RUNNING RUNNING 23 seconds ago node-3
9fz7fxbg0igypstwliyameobs redis 4 redis:3.0.7 RUNNING RUNNING 2 minutes ago node-3
drzndxnjz3c8iujdewzaplgr6 redis 5 redis:3.0.7 RUNNING RUNNING 23 seconds ago node-2
7rcgciqhs4239quraw7evttyf redis 6 redis:3.0.7 RUNNING RUNNING 2 minutes ago node-2
如您所见,每个在节点1上运行的任务由对帐循环重新平衡到节点2或节点3。
swarmkit的更多相关文章
- swarmkit test
swarmd -d /tmp/node-1 --listen-control-api /tmp/node-1/swarm.sock --hostname mhc --engine-addr=tcp:/ ...
- Docker 1.12.0将要发布的新功能
Docker 1.12.0将要发布的新功能 导读 按计划,6/14 是1.12.0版本的 feature冻结 的日子,再有两个星期Docker 1.12.0也该发布了.这里列出来的新功能,都是已经合并 ...
- docker 1.12 版本 docker swarm 集群
博客已经迁移到 个人博客中 个人博客 更新地址: http://www.xf80.com/2016/10/25/docker-swarm-1.12/ docker 1.12 版本 的新特性 (1)do ...
- Docker改名为Moby了吗?
背景 在DockerCon17上,Docker发布了两个新的开源项目LinuxKit和Moby.而原来在Github上托管的docker也随着PR #32691的合入正式变为Moby.这究竟是什么情况 ...
- Docker技术浅谈:私有化部署的优势以及在顶象内部的应用实践
顶象全景式业务安全风控体系基于新一代风控体系构建,并采用Docker技术进行私有云和公有云部署.本文主要和大家分享下Docker容器技术和顶象风控系统私有化部署的优势以及Docker容器技术在顶象内部 ...
- docker-compose v3版本命令详解参考
参考和指南 这些主题描述了Compose文件格式的第3版.这是最新的版本. Compose and Docker 兼容性矩阵 有几个版本的Compose文件格式 - 1,2,2.x和3.x.下表是快速 ...
- Docker And Swarm Mode(一)
(一)节点的创建和配置 前言 虽然工作中一直在用Docker和Docker Swarm,但是总感觉有点陌生,总想自己亲手来写写和配置Docker 容器相关的事情,这篇文章主要是参考了Los Tech ...
- Docker Swarm Mode 学习笔记 (基本概念)
Swarm 是使用 SwarmKit 构建的 Docker 引擎内置(原生)的集群管理和编排工具 节点 运行 Docker 的主机可以主动初始化一个 Swarm 集群 docker swarm ...
- Docker 系列六(Docker Swarm 项目).
一.前言 随着互联网快速发展,以及微服务架构的流行,服务器的压力越来越大.上一篇介绍的 Docker Compose 项目,可以将多个容器捏合在一起,实现容器间的通信,比如 Web 项目对 DB.Ca ...
随机推荐
- 《DSP using MATLAB》示例Example7.25
今天清明放假的第二天,早晨出去吃饭时天气有些阴,十点多开始“清明时节雨纷纷”了. 母亲远在他乡看孙子,挺劳累的.父亲照顾生病的爷爷…… 我打算今天把<DSP using MATLAB>第7 ...
- ssh连接至Ubuntu服务器时,提示以下错误:REMOTE HOST IDENTIFICATION HAS CHANGED!
今天在使用Ubuntu搭建自己的git仓库的时候,搭建完成后clone时出现以下错误 经过搜索问题出现原因的描述如下:第一次使用SSH连接时,会生成一个认证,储存在客户端的known_hosts中. ...
- DispatcherServlet的初始化(二)
DispatcherServlet的初始化在springmvc的启动中有讲过,这一篇在上一篇的基础上接着讲.DispatcherServlet作为springmvc的前端控制器,还需要初始化其他的模块 ...
- guaua学习,工具专题
Preconditions 1,http://www.cnblogs.com/peida/p/Guava_Preconditions.html 1 .checkArgument(boolean) : ...
- Jetty小计,比之tomcat调试还是不方便
不需要额外的工程支持,不需要硬盘中有tomcat之类的额外文件 Jetty的Debug:右键Debug as... Maven Builder Jetty相关的配置文件如下: <profiles ...
- C#软件安全 反编译 加密与安全等等
我最近开发了一些C#语言的软件,但是由于这是一种解释型语言,也就是会转化成中间件语言,很容易就被反编译解密,包括exe和dll库等等,这时候我们真的需要使用一些技巧来将自己的成果进行加密,加壳等办法. ...
- 常见企业IT支撑【7、keepalived VRRP双主master】
我们知道,最简单的keepalive vrrp作出来的VIP实例,征用了2台服务器,生成1个VIP,也就是说,基础实配置实例中,我们的业务流量只会流向其中一台服务器,另一台就空闲了,明显示合, 能否做 ...
- REST API权限集成设计
REST API权限集成设计 应用分为两大部分,前端html+后端Rest服务,前端html和后端Rest服务部署完全分离. 目标:可访问资源都处于权限控制之下(意味着通过浏览器地址栏的任意url都会 ...
- (转)Inno Setup入门(九)——修改安装过程中的文字显示
本文转载自:http://blog.csdn.net/yushanddddfenghailin/article/details/17250837 前面说到过可以使用不用的语言文件实现不同的显示方式,方 ...
- java代码----------实现写出循环
总结:对于循环次数累加.等等总是不知道在哪一行插入 package com.mmm; //输出10个数字中,小于5的数字 public class hai { public static void m ...