标签:docker-swarm
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 的结构图
最上层的对外接口包括:
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"
......
主要修改这些,其他保持默认
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
Agent:
1.vim /etc/systemd/system/docker.service
添加: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
5.另外一台agent做相同的操作
6.在etcd中可以查看到
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
docker run --rm swarm list etcd://172.25.23.1:2379/swarm
docker -H 172.25.254.23:8000 ps -a
export DOCKER_HOST=tcp://0.0.0.0:8000
docker ps -a
测试:
(1)运行2个容器
docker run -d --name redis-1 redis
docker run -d --name redis-2 redis
docker info
会发现运行的redis-1,redis-2分别在agent1和agent2上运行,docker info,两个状态均是healthy。
(2)
将agent1上的docker容器停止,再新建一个redis-3的容器,会发现该容器会运行在agent2上,并且运行docker info命令,显示agent1上的docker是unhealthy状态。重启容器后恢复正常。
Agent1:
systemctl stop docker.service
Manager:
docker ps -a
docker info
docker run -d --name redis-3 redis
docker ps -a
Agent1:
systemctl start docker.service
docker start `docker ps -aq`
Manager:
本文出自 “11841085” 博客,转载请与作者联系!
标签:docker-swarm
原文地址:http://11851085.blog.51cto.com/11841085/1840413