Docker -swarm

Swarm Docker 公司在 2014 12 月初发布的一套较为简单的工具,用来管理 Docker 集群,它将一群 Docker 宿主机变成一个单一的,虚拟的主机。Swarm 使用标准的 Docker API接口作为其前端访问入口,换言之,各种形式的 Docker Client(docker client in go, docker_py,

docker )均可以直接与 Swarm 通信。Swarm 几乎全部用 Go 语言来完成开发。

Swarm deamon 只是一个调度器(Scheduler)加路由器(router),Swarm 自己不运行容器,它只是接受 docker 客户端发送过来的请求,调度适合的节点来运行容器,这意味着,即使Swarm 由于某些原因挂掉了,集群中的节点也会照常运行,Swarm 重新恢复运行之后,它会收集重建集群信息。下面是 Swarm 的结构图

wKioL1e25VrBwEe0AAFjRLUGaVM346.png

 


 

   wKiom1e25VuCfudVAAH5W8OovMY294.png 

最上层的对外接口包括:

docker API 用于管理镜像的生命周期。

swarm Mange CLI 用于集群管理。

LeaderShip 提供集群的 HA(high avaliable),防止单点故障

discovery service swarm 的发现服务,它会在每个 node 中注册一个 angent 将各个节点的 IP端口上报,manager 会从发现服务读取各节点信息。

schedule 调度模块,用于容器调度时选择最优节点,主要分如下两步(filter strategy)

filter(过滤),当创建或运行容器时,它会告诉调度器哪些节点是可用的(符合要求的)filter 可以分为两类,节点过滤和基于容器配置的过滤。 节点过滤:Constraints,约束过滤器,可以根据当前操作系统类型、内核版本、存储类型等条件进行过滤,当然也可以自定义约束,在启动 Daemon 的时候,通过 Label 来指定当前主机所具有的特点。Health filter,会根据节点状态进行过滤,会去除故障节点。 基于容器配置的过滤:

Affnity,亲和性过滤器,支持容器亲和性和镜像亲和性,比如一个 web 应用,我想将 DB 容器和 Web 容器放在一起,就可以通过这个过滤器来实现。Dependency,依赖过滤器。如果在创建容器的时候使用volume-from/link/net 某个容器,则创建的容器会和依赖的容器在同一个节点上。Ports filter,会根据端口的使用情况过滤。

strategy 根据策略选择最优节点:Binpack,在同等条件下,选择资源使用最多的节点,通过这一个策略,可以将容器聚集起来。Spread,在同等条件下,选择资源使用最少的节点,通过这一个策略,可以将容器均匀分

布在每一个节点上。Random,随机选择一个节点。

 

swarm create

Swarm swarm create 命令用于创建一个集群标志,用于 Swarm 管理 Docker 集群时,Docker Node 的节点发现功能。发起该命令之后,Swarm 会前往 Docker Hub 上内建的发现服务中获取一个全球唯一的token,用以唯一的标识 Swarm 管理的 Docker 集群。注:Swarm 的运行需要使用服务发现,目前该服务内建与 Docker Hub,该服务发现机制目

 

swarm manage

Swarm swarm manage 是最为重要的管理命令。一旦 swarm manage 命令在 Swarm 节点上被触发,则说明用户需要 swarm 开始管理 Docker 集群。从运行流程的角度来讲,swarm 经历的阶段主要有两点:启动 swarm、接收并处理 Docker 集群管理请求。

Swarm 启动的过程包含三个步骤:

发现 Docker 集群中的各个节点,收集节点状态、角色信息,并监视节点状态的变化;

初始化内部调度(scheduler)模块;

创建并启动 API 监听服务模块;

 

172.25.254.23swarm manager

172.25.23.1etcd

172.25.23.2swarm agent

172.25.23.3swarm agent

 

Selinux firewalld disabled rhel7.2

 

 

extcd

etcd 是一个分布式, 高性能, 高可用的键值存储系统

 

1.安装etcd

yum install -y etcd-2.2.5-1.el7.x86_64.rpm

2.修改配置文件

vim  /etc/etcd/etcd.conf

--->

# [member]

ETCD_NAME=172.25.23.1

ETCD_DATA_DIR="/var/lib/etcd/default.etcd"

ETCD_LISTEN_CLIENT_URLS="http://172.25.23.1:2379"

 

#[cluster]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.25.23.1:2380"

ETCD_INITIAL_CLUSTER="172.25.23.1=http://172.25.23.1:2380"

ETCD_INITIAL_CLUSTER_STATE="new"

ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"

ETCD_ADVERTISE_CLIENT_URLS="http://172.25.23.1:2379"

......

wKiom1e25YWCfeqcAAEJ__-tOd8257.png 

主要修改这些,其他保持默认

 

3. systemctl start etcd

 

4. etcdctl member list

---> Error:  dial tcp 127.0.0.1:4001: connection refused

 

监听端口错误

etcdctl -C 172.25.23.1:2379 member list

wKioL1e25aTjagkVAAAuKxmrNoM499.png 

 

 

Agent:

 

1.vim /etc/systemd/system/docker.service

wKiom1e25biwnW4jAACJfOhmAKc876.png 

添加:ExecStart=/usr/bin/docker daemon -H fd:// -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

 

2.systemctl reload

systemctl restart docker.service

 

3.docker load -i swarm.tar

docker load -i redis.tar

 

4.docker run -d swarm join --addr=172.25.23.2:2375 etcd://172.25.23.1:2379/swarm

 

docker ps -a 

wKioL1e25cqC-0-PAAA1pNpAWGU429.png 

 

5.另外一台agent做相同的操作

6.etcd中可以查看到

   wKioL1e25fjAVkOLAABLskmwFL4780.png 

 

 

Manager :

docker run -d -p 8000:2375 --name swarm_manage swarm manage -H 0.0.0.0:2375 etcd://172.25.23.1:2379/swarm

 

docker ps -a 

wKiom1e25hWRAi3GAABBkRn5DBs912.png 

 

docker run --rm swarm list etcd://172.25.23.1:2379/swarm

wKiom1e25ivw1vatAABIb1_ghqo391.png 

 

docker -H 172.25.254.23:8000 ps -a   

wKioL1e25mniqbm8AAB3cqPqnoI560.png 

export DOCKER_HOST=tcp://0.0.0.0:8000

docker ps -a

wKiom1e25mrDfctVAABu8c-O1I0399.png 

 

 

 

测试:

(1)运行2个容器

docker run -d --name redis-1 redis

docker run -d --name redis-2 redis

wKioL1e25mrT9cTHAADELESEnnE897.png 

 

docker info

wKiom1e25mvh8o3-AAEo6U8sUKY831.png 

会发现运行的redis-1redis-2分别在agent1agent2上运行,docker info,两个状态均是healthy

 

(2)

agent1上的docker容器停止,再新建一个redis-3的容器,会发现该容器会运行在agent2上,并且运行docker info命令,显示agent1上的dockerunhealthy状态。重启容器后恢复正常。

Agent1:

systemctl stop docker.service

 

Manager:

docker ps -a

wKioL1e25muAGA7hAACz9qDqbdg659.png 

 

docker info

wKioL1e25myxLxi4AAEuCbJkal0759.png 

 

docker run -d --name redis-3 redis

docker ps -a

wKiom1e25myzFSGyAADdMRXje8Y381.png 

 

Agent1:

systemctl start docker.service

docker start `docker ps -aq`

Manager:

wKioL1e25m2TjnWVAADinnB4kZA328.png 

wKiom1e25m6R4MrOAAEhYNAtBW8628.png