Docker:Docker集群配置与应用(Docker Swarm)

前言

可以认为Docker Swarm(Go语言开发)将一个Docker主机池变成了一个单独的虚拟机。

学习目标

  • 了解 Docker Swarm,掌握 Swarm 集群建立及节点管理
  • 了解 Swarm 服务,学会在集群中部署和管理服务
  • 了解 Swarm 网络,掌握 overlay 网络的创建和使用
  • 了解 Swarm 高可用性和负载平衡,学会配置外部负载平衡器
  • 熟悉 Docker 栈,会使用它在集群中部署分布式应用程序

之前的学习都是基于单个 Docker 主机的,所有容器都是运行在同一个主机上的。实际生产环境往往会有多个 Docker 主机,涉及跨主机多子网的容器配置管理,复杂性大大提高。Docker Compose 支持多个服务的编排,但不支持跨主机部署,而集群(Cluster)将多个主机作为一个协同工作的有机整体,使其能够像单个系统那样工作,同时支持高可用、负载平衡和并行处理。在集群中部署应用程序时,用户不必关心应用程序具体部署在哪台主机上,只需关心所需的资源,应用程序由集群管理程序进行调度。Docker 从1.12版本开始通过内置 Swarm 模式实现集群管理,实现应用程序自动化部署、可伸缩、高可用和负载平衡。Docker栈能够以Swarn 网络为基础,使多个服务相互关联,并在多台主机上运行它们,便于将不同主机上的容器以服务的形式在集群中一步部署到位,为大规模分布式应用程序的部署和管理提供解决方案。
===>重点是 Swarm 集群的建立和管理,以及应用程序在集群中的部署和管理。

1. 建立Docker Swarm集群

Swarm是 Docker 官方提供的一款集群管理工具,其主要作用是把若干台 Docker 主机抽象为一个整体,并通过一个入口统一管理这些 Docker主机上的各种 Docker 资源。要通过 Docker Swarm 来部署和管理应用程序,首先要建立集群,对集群节点进行配置管理。

我们需要:

  1. 了解 Docker Swarm 的背景知识。
  2. 了解 Swarm 集群及其节点。
  3. 掌握 Swarm 集群的创建方法。
  4. 熟悉 Swarm 节点的管理操作。

1.1 为什么要使用容器集群

单主机的 Docker 引擎和单一的容器镜像只能解决单一服务的打包和测试问题,而要在生产环境中部署企业级应用,就需要容器集群。容器集群的设计目标是在主机集群之间提供一个能够自动化部署、扩容,以及运维的应用容器平台。

在 1.12 版本之前,Docker 在集群管理上依赖第三方解决方案,其中最著名的就是 Kubernetes。Kubernetes 简称 K8s,是 Google 提供的开源的容器编排引擎,用于管理云平台多主机上的容器化应用,支持容器化应用程序的自动化部署、伸缩和管理。Kubernetes 通常结合 Docker 工作,并且整合多个运行 Docker 容器的主机集群,它不仅支持 Docker,而且支持另一种容器技术 Rocket。Kubernetes 采用不同于 Docker 的配置和编排方法,比较复杂,适合大中型集群运行复杂应用程序的环境。

Docker 从 1.12 版本开始引入 Swarm 模式来实现集群管理。Swarm 本意是蜂群,表示动物的群体,Docker 使用这个概念表示由多个 Docker 引擎组成的一个整体,也就是集群。Docker Swarm 是Docker 原生的集群工具,因而无需使用额外的编排软件创建或管理集群。Docker 工具和 Docker API都可以无缝地在 Docker Swarm 上使用,只是使用环境从单机转变为更高级别的集群。Docker Swarm部署更简单,适合规模不大的应用程序环境,尤其适用于简单和快速开发。

用 Docker Swarm 创建集群非常简单,用户不需要额外安装任何软件,也不需要进行任何额外的配置,很适合作为学习和使用容器集群平台的起点,当然也可用于中小规模的 Docker 集群实际部署。

1.2 什么是Swarm集群

一个Swarm 集群包含多个以Swarm 模式运行的 Docker 主机,它们充当管理器(Manager),负责管理成员和代理;或者充当工作者(Worker),负责运行 Swarm 服务。一台 Docker 主机可以是管理器,也可以是工作者,或者同时兼任这两种角色。

Swarm 集群管理的对象主要是服务,而不是独立的容器。服务用于定义要在节点上执行的任务,是整个集群系统的核心结构,也是用户与 Swarm 交互的基本单元,用户在创建服务时可以指定要使用的容器镜像和要在容器中执行的命令。Swarm 服务相对于独立容器的一个关键优势是,无需重启服务就可以修改服务的配置,如要连接的网络和卷。

任务(Task)定义容器和要在容器中运行的命令,它是 Swarm 集群的原子调度单位。管理器节点根据服务规模中设置的副本数量将任务分配给工作者节点。一旦任务被分配给某个节点,就不能转移到另一个节点,只能在所分配的节点上正常运行或运行失败。

当 Docker 以 Swarm 模式运行时,独立容器仍然可以在加入Swarm 集群的 Docker主机上运行。

只有 Swam 管理器能够管理 Swarm 集群,而独立容器可以由任何守护进程启动。Docker 守护进程可以作为管理器或工作者加入Swarm 集群。

与使用 Docker Compose 定义和运行容器编排单主机上的多个服务一样,管理员也可以定义和运行Swarm 服务栈(Service Stack),实现多个节点多个服务的集群部署。

1.3 Docker Swarm特性

Docker目前的版本包括原生的 Swarm 模式,其主要特性列举如下。

  1. 实现与 Docker 引擎集成的集群管理。
  2. 去中心化设计。Swarm 节点的角色分为管理器和工作者,任一节点的故障都不影响应用程序的使用。
  3. 声明式服务模型。Docker 引擎使用声明式方法在应用栈中定义各种服务所需的状态。
  4. 可伸缩服务。
  5. 状态自动调整。管理器节点持续监视集群状态并调整实际状态与期望状态之间的差异。
  6. 多主机连网。
  7. 服务发现(Service Discovery )。管理器节点为 Swarm 集群中的每个服务分配一个唯一的 DNS 名称,并平衡正在运行的容器的负载。
  8. 默认安全机制。Swarm 集群中的每个节点都强制进行 TLS相互认证和加密,以保护其自身与所有其他节点之间的通信。
  9. 滚动更新。—旦有更新推出,就可以以增量方式将服务更新应用于节点。如果出现任何问题,则可以将任务回滚到以前版本。

1.4 Swarm节点

Swarm 集群架构如图所示,整个集群由一个或多个节点组成。这些节点可以是运行 Docker 引擎的物理机或虚拟机,节点按角色分为管理器节点工作者节点两种类型。
在这里插入图片描述

(1)管理器节点
管理器节点负责下列集群管理任务。

  • 维护集群状态。
  • 调度服务。
  • 提供 Swarm 模式的 HTTP API 端点。

管理器使用 Raft 共识算法,可以维持整个 Swarm 集群及其中运行的所有服务的内部状态一致性。
Raft 要求大多数管理器(也称为法定人数)同意对集群的更新建议,如节点添加或者删除。如果仅用于测试,则一个集群使用单个管理器就可以。在单个管理器的集群中,若管理器发生故障,服务会继续运行,但需要创建一个新的集群以进行恢复。

为充分利用 Swarm 模式的容错功能,Docker 建议用户根据自己的高可用性要求部署奇数个节点。
当存在多个管理器时,如果管理器节点发生故障,不用停机就可以恢复。可以按照下列建议确定管理器节点数量。

  • 3个管理器的 Swarm 集群最多允许一个管理器节点的失效。
  • 5个管理器的 Swarm 集群最多允许两个管理器节点的同时失效。
  • N个管理器的 Swarm 集群最多允许(N-1)/2 个管理器节点的同时失效。
    Docker 建议一个集群最多包含 7 个管理器节点,添加更多的管理器节点并不意味着更强的可扩展
    性或更高的性能,情况往往正好相反。

(2)工作者节点
  工作者节点也是 Docker 引擎的实例,其唯一目的是运行容器。工作者节点不加入 Raft 分布式状态存储,不进行调度决策,也不提供 Swarm 模式的 HTTP API 服务。

  可以创建单个管理器节点的集群,但集群中不能只有工作者节点而没有管理器节点。默认情况下,所有管理器节点同时也是工作者节点

(3)改变节点的角色
  可以将工作者节点升级为管理器节点。例如,要对管理器节点进行离线维护时,可能需要升级工作者节点。当然,也可以将管理器节点降级为工作者节点。

1.5 Swarm 集群管理命令

  • docker swarm ca: 显示和轮转根 CA
  • docker swarm init: 初始化集群
  • docker swarm join: 作为节点加入集群
  • docker swarm join-token: 管理加入集群的令牌
  • docker swarm leave: 脱离集群
  • docker swarm unlock: 解锁集群
  • docker swarm unlock-key: 管理解锁密钥
  • docker swarm update: 更新集群

建立集群必须使用初始化集群命令,基本语法如下。

docker swarm init --advertise-addr [参数]

执行此命令时,--advertse-addr 选项用于将管理器节点的ip地址通告给集群中的其他节点,该地址必须是固定ip地址。默认情况下,Docker Swarm 为全局作用域 overlay 网络分配默认的地址池 10.0.0.0/8,每个网络都将从这个地址池中被依次分配一个子网。要配置自定义默认地址池,可以使用 --default-addr-pool 选项定义,其中子网掩码使用 CIDR 记法。--listen-addr 选项指定用于承载 Swarm 流量的ip和端口,通常与--advertise-addr选项的参数值一致,但是当节点上有多个iP 地址的时候,可用于指定某个具体ip地址。还可以使用--force-new-custer选项强制从当前状态创建新的集群,这个操作会删除当前管理器节点以外的所有管理器节点。

执行 docker swarm init命令会生成两个随机的令牌(Token)作为其他节点加入集群的密钥:一个是工作者令牌,另一个是管理器令牌。当一个节点加入集群时,其角色是工作者还是管理器就取决于传递的是哪个令牌。

建立集群之后,其他主机加入集群需要使用 docker swarm join 命令,其基本语法如下。

docker swarm join [选项] 主机:端口

该命令的主机和端口参数分别指集群创建者的|P 地址和集群管理的通信端口(通常是2377)。该命令最重要的选项是–token,用来传递初始化集群所生成的令牌。

docker swarm update 命令使用新的选项值更新现有的集群,此命令在管理器节点上运行。

集群涉及自动锁定,执行 docker swarm initdocker swarm update 命令时可设置–autolock 选项值为 true 来生成一个加密密钥,以自动锁定管理器。所有管理器存储的私钥和数据都将受到该加密密钥的保护,如果不提供该密钥,将无法访问。密钥通过 docker swarm unlock 命令提供以重新激活管理器。也可以执行 docker swarm update --autolock=false 命令取消集群的锁定。默认情况下没有自动锁定集群。

Swarm 集群节点管理命令

这些命令都只能在管理器节点上运行

  • docker node demote:将一个或多个管理器节点降级为工作者节点。
  • docker node inspect:显示一个或多个节点的详细信息。
  • docker node ls:列出 Swarm 集群中的节点。
  • docker node promote:将一个或多个节点升级为管理器节点。
  • docker node ps:列出在一个或多个节点(默认为当前节点)上运行的任务。
  • docker node rm:从 Swarm 集群中删除一个或多个节点。
  • docker node update:更新节点的选项,如可用性、标签或角色。

1.6 Docker Swarm 集群搭建

// TODO

  • 24
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

boy快快长大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值