2014 年 Docker 在容器界越来越火;这时容器的编排工具 Mesos 和 Kubernetes 也开始崭露头角。Docker 公司也开始筹划容器的编排和集群管理工具,推出了自己的通信协议项目 Beam.后来Beam 成为一个允许使用 Docker API 来控制的一种分布式系统;之后项目被重命名为 libswarm.在 2014 年 11 月,Docker 公司又对 libswarm 进行了重新设计,支持了远程调用 API,并且被重新命名为 Swarm。到此我们称之为 Swarm V1。
在 2016 年,为了解决中央服务可扩展性的问题,Docker 团队重新设计了 Swarm,并称之为 Swarm V2。此时的 Docker Swarm 已经可以支持超过 1000 多个节点的集群规模,并且 Docker 团队在发布 Docker 1.12 版本时,将 Docker Swarm 默认集成到了 Docker 引擎中。
Swarm的优点:
(1):分布式:Swarm 使用Raft(一种分布式一致性协议)协议来做集群间数据一致性保障,使用多个容器节点组成管理集群,从而避免单点故障。
(2):安全:Swarm 使用 TLS 双向认证来确保节点之间通信的安全,它可以利用双向 TLS 进行节点之间的身份认证,角色授权和加密传输,并且可以自动执行证书的颁发和更换。
(3):简单:Swarm 的操作非常简单,并且除 Docker 外基本无其他外部依赖,而且从 Docker 1.12 版本后, Swarm 直接被内置到了 Docker 中,可以说真正做到了开箱即用。
PS: 宇宙的尽头是k8s
Swarm 的架构整体分为管理节点(Manager Nodes)和工作节点(Worker Nodes),整体架构如下图:
swarm架构图
管理节点: 管理节点负责接受用户的请求,用户的请求中包含用户定义的容器运行状态描述,然后 Swarm 负责调度和管理容器,并且努力达到用户所期望的状态。
工作节点: 工作节点运行执行器(Executor)负责执行具体的容器管理任务(Task),例如容器的启动、停止、删除等操作。
管理节点和工作节点的角色并不是一成不变的,你可以手动将工作节点转换为管理节点,也可以将管理节点转换为工作节点。
(1)-Swarm 集群: Swarm 集群是一组被 Swarm 统一管理和调度的节点,被 Swarm纳管的节点可以是物理机或者虚拟机。其中一部分节点作为管理节点,负责集群状态的管理和协调,另一部分作为工作节点,负责执行具体的任务来管理容器,实现用户服务的启停等功能。
(2)-节点Swarm 集群中的每一台物理机或者虚拟机称为节点。节点按照工作职责分为管理节点和工作节点,管理节点由于需要使用 Raft 协议来协商节点状态,生产环境中通常建议将管理节点的数量设置为奇数个,一般为 3 个、5 个或 7 个。
(3)-服务是为了支持容器编排所提出的概念,它是一系列复杂容器环境互相协作的统称。一个服务的声明通常包含容器的启动方式、启动的副本数、环境变量、存储、配置、网络等一系列配置,用户通过声明一个服务,将它交给 Swarm,Swarm 负责将用户声明的服务实现。服务分为全局服务(global services)和副本服务(replicated services)。全局服务:每个工作节点上都会运行一个任务,类似于 Kubernetes 中的 Daemonset。副本服务:按照指定的副本数在整个集群中调度运行。
(4)-任务是集群中的最小调度单位,它包含一个真正运行中的 Docker 容器。当管理节点根据服务中声明的副本数将任务调度到节点时,任务则开始在该节点启动和运行,当节点出现异常时,任务会运行失败。此时调度器会把失败的任务重新调度到其他正常的节点上正常运行,以确保运行中的容器副本数满足用户所期望的副本数。
由于容器的 IP 只能在集群内部访问到,而且容器又是用后马上销毁,这样容器的 IP 也会动态变化,因此容器集群内部的服务想要被集群外部的用户访问到,服务必须要映射到主机上的固定端口。Swarm 使用入口负载均衡(ingress load balancing)的模式将服务暴露在主机上,该模式下,每一个服务会被分配一个公开端口(PublishedPort),你可以指定使用某个未被占用的公开端口,也可以让 Swarm 自动分配一个。
Swarm 集群的公开端口可以从集群内的任意节点上访问到,当请求达到集群中的一个节点时,如果该节点没有要请求的服务,则会将请求转发到实际运行该服务的节点上,从而响应用户的请求。公有云的云负载均衡器(cloud load balancers)可以利用这一特性将流量导入到集群中的一个或多个节点,从而实现利用公有云的云负载均衡器将流量导入到集群中的服务。
部署Docker
(1): 安装系统必须要的工具
dnf install -y yum-utils device-mapper-persistent-data lvm2
(2): 添加软件源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
(3):更新阿里云的软件源
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
(4):安装docker
dnf -y install docker-ce
(5):优化docker配置
mkdir /etc/docker/ vim /etc/docker/daemon.json
配置文件如下:
{ "exec-opts": ["native.cgroupdriver=systemd"], "registry-mirrors": [ "https://fz5yth0r.mirror.aliyuncs.com", "https://dockerhub.mirrors.nwafu.edu.cn/", "https://mirror.ccs.tencentyun.com", "https://docker.mirrors.ustc.edu.cn/", "https://reg-mirror.qiniu.com", "http://hub-mirror.c.163.com/", "https://registry.docker-cn.com" ], "storage-driver": "overlay2", "storage-opts": [ "overlay2.override_kernel_check=true" ], "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3" }}
初始化集群
Docker 1.12 版本后, Swarm 已经默认集成到了 Docker 中,因此我们可以直接使用 Docker 命令来初始化 Swarm,集群初始化的命令格式如下:
docker swarm init
advertise-addr 一般用于主机有多块网卡的情况,如果你的主机只有一块网卡,可以忽略此参数。`--advertise-addr
[root@vm157]# docker swarm initSwarm initialized: current node (q8f4cn68x0n3nfiogje32ikpi) is now a manager.To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-62w7v05zh7hlxj3szwn89a4xiz7zws82qv7fldoe0uvl7c1qft-1oezdisdz62gf34xfo0vjjjos 192.168.50.157:2377To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.[root@vm157-postgresql postgresql]# docker node lsID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSIONq8f4cn68x0n3nfiogje32ikpi * vm157-postgresql Ready Active Leader 20.10.17
集群初始化后, Swarm 会提示我们当前节点已经作为一个管理节点了,并且提示了如何把一台主机加入集群成为工作节点。
加入工作节点
docker swarm join --token SWMTKN-1-62w7v05zh7hlxj3szwn89a4xiz7zws82qv7fldoe0uvl7c1qft-1oezdisdz62gf34xfo0vjjjos 192.168.50.157:2377
默认加入的节点为工作节点,如果是生产环境,我们可以使用docker swarm join-token manager命令来查看如何加入管理节点
默认加入的节点为工作节点,如果是生产环境,我们可以使用docker swarm join-token manager命令来查看如何加入管理节点:
docker swarm join-token manager
复制 Swarm 输出的结果即可加入管理节点到集群中。
节点查看
节点添加完成后,我们使用以下命令可以查看当前节点的状态:
# docker node lsID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION1ehtnlcf3emncktgjzpoux5ga * swarm-manager Ready Active Leader 20.10.17pn7gdm847sfzydqhcv3vma97y * swarm-node1 Ready Active 20.10.174dtc9pw5quyjs5yf25ccgr8uh * swarm-node2 Ready Active 20.10.17est7ww3gngna4u7td22g9m2k5 * swarm-node3 Ready Active 20.10.17
到此,一个包含 1 个管理节点,3 个工作节点的 Swarm 集群已经搭建完成。
(1): 通过 docker service 命令创建服务
# docker service create --replicas 1 --name hello-world nginx24f9ng83m9sq4ml3e92k4g5byoverall progress: 1 out of 1 tasks1/1: running [==================================================>]verify: Service converged
使用docker service ls命令可以查看已经启动的服务; 当我们不再需要这个服务了,可以使用docker service rm命令来删除服务.
(2)通过 docker stack 命令创建服务
这里我们通过部署postgreSQL为例子.
创建yaml文件
mkdir /app/postgresqlvim docker-compose.yml
具体内容:
头条的排版可能有问题. 可能需要大家自己调整
version: '3.7'volumes: pgdata: external: False pg_db2: external: False pgadmin: external: Falsesecrets: postgres_admin_pwd: external: trueservices: postgresql: image: reg.aixbx.com/aixbx/postgres:12.4 #这里的镜像大家可以去dockerhub上找 # container_name: postgres_db #此处的secret我们需要先行创建 secrets: - postgres_admin_pwd ports: - "5432:5432" environment: POSTGRES_USER: admin POSTGRES_PASSWORD_FILE: /run/secrets/postgres_admin_pwd ALLOW_IP_RANGE: 192.168.0.0/16 #POSTGRES_HOST_AUTH_METHOD: 'ldap ldapserver=192.168.31.222 ldapport=389 ldapprefix="uid=" ldapsuffix=", ou=算法二部, ou=employee, ou=users, dc=aixbx, dc=com"' #POSTGRES_HOST_AUTH_METHOD: 'ldap ldapserver=192.168.31.222 ldapport=389 ldapbasedn="ou=users,dc=aixbx,dc=com" ldapbinddn="cn=admin,dc=aixbx,dc=com" ldapbindpass="1234aixuan1234" ldapsearchattribute=uid' volumes: - pgdata:/pgdata - pg_db2:/var/lib/postgresql/data deploy: replicas: 1 restart_policy: condition: on-failure pgadmin: image: aixbx/pgadmin:5.2 #这里的镜像大家可以去dockerhub上找 ports: - "5050:5050" environment: DEFAULT_SERVER: "0.0.0.0" #这里我配置LDAP登录 AUTHENTICATION_SOURCES: "['ldap', 'internal']" LDAP_AUTO_CREATE_USER: "True" LDAP_CONNECTION_TIMEOUT: "30" LDAP_SERVER_URI: "192.168.50.207:389" LDAP_USERNAME_ATTRIBUTE: "sAMAccountName" LDAP_SEARCH_BASE_DN: "ou=example,dc=example,dc=cn" LDAP_SEARCH_FILTER : "objectclass=*" LDAP_SEARCH_SCOPE: "SUBTREE" LDAP_BASE_DN: "ou=example,dc=example,dc=cn" LDAP_BIND_USER: "CN=Administrator,CN=Users,dc=example,dc=cn" LDAP_BIND_PASSWORD: "123456" volumes: - pgadmin:/var/lib/pgadmin/ deploy: replicas: 1 restart_policy: condition: on-failure
下面我们用docker service ls命令查看一下当前启动的服务
[root@vm157-postgresql postgresql]# docker service lsID NAME MODE REPLICAS IMAGE PORTS6lgbpbxkwv8l data-platform_pgadmin replicated 1/1 reg.aixbx.com/aixbx/pgadmin:5.2 *:5050->5050/tcpntq18jy53ycq data-platform_postgresql replicated 1/1 reg.aixbx.com/aixbx/postgres:12.4 *:5432->5432/tcp
Docker Swarm 是一个用来定义复杂应用的集群编排工具,可以帮我们把多台主机组成一个 Swarm 集群,并且帮助我们管理和调度复杂的容器服务。由于 Swarm 已经被内置于 Docker 中,因此 Swarm 的安装和使用也变得非常简单,只要你有 Docker 的使用经验,就可以很快地将你的应用迁移到 Swarm 集群中。
docker swarm的使用还是比较简单的,可以方便大家部署一些简单的应用.本文供大家学习 和理解.
最后: 宇宙的尽头现在是k8s. 后续还会继续更新docker以及k8s的内容.
希望大家点赞, 转发和关注. 你的关注是更新的动力了.
留言与评论(共有 0 条评论) “” |