刘沙河 刘沙河
首页
  • Go语言基础

    • 数据类型
    • 反射
    • Go指针
  • Go语言进阶

    • go泛型
    • go条件编译
    • cgo教程
    • Go协程调度原理及GPM模型
    • Go内存管理
    • Go垃圾回收机制
    • Go语言内存对齐
  • Go语言实现原理

    • channel 实现原理
    • slice 实现原理
    • map 实现原理
    • sync.Mutex 实现原理
    • 乐观锁CAS 实现原理
    • singlefight 实现原理
  • gin框架

    • gin中间件原理
    • gin路由原理
  • gorm

    • GORM介绍和使用
    • GORM_CURD操作指南
  • go测试

    • benchmark基准测试
    • pprof 性能分析
  • python进阶

    • Numpy&Pandas
    • celery分布式任务队列
  • Django

    • Django 常见命令
    • middleware中间件
    • Django缓存系统
    • Django信号系统
    • Django REST Framework
  • Flask

    • Flask基础知识总结
    • Flask-SQLAlchemy
  • 爬虫

    • aiohttp
    • scrapy框架
  • Mysql

    • Mysql存储引擎和索引
    • MySQL主从复制
    • Mysql读写分离
    • 数据库分库分表
    • Mysql锁
    • Mysql事务和MVCC原理
    • 分库分表带来的读扩散问题
  • Redis

    • redis基础和数据类型
    • redis主从架构
    • redis哨兵架构
    • redis集群模式
    • 如何保证缓存和数据库双写一致
    • redis底层数据结构
    • redis分布式锁
  • Elasticsearch

    • es基本概念
    • es基础语法
    • es倒排索引
  • etcd

    • Go操作etcd
    • Raft原理
    • etcd分布式锁
  • kafka

    • 消息队列MQ总结
    • kafka 概述及原理
    • kafka 消费问题记录
    • 零拷贝技术
    • kafka分区规范
  • RabbitMQ

    • rabbitMQ基础
    • Go操作rabbitmq
  • RocketMQ

    • 可靠消息队列 rocketMQ
  • Http&Https

    • http&https
    • TCP和UDP
    • Ping 原理
  • RPC

    • RPC初识
    • grpc初识和实现
  • gRPC

    • grpc 初识
    • grpc 上下文 metadata
    • grpc 健康检查
    • grpc keepalive
    • grpc 命名解析
    • grpc 中间件&拦截器
    • grpc 负载均衡
    • grpc 身份认证
    • grpc 超时重试
    • grpc 链路追踪
    • grpc-gw将gRPC转RESTfu api
    • grpc-gw自定义选项
  • protobuf

    • protobuf 进阶
    • protobuf 编码原理
  • Docker

    • Docker基础
    • Docker常用命令
    • Dockerfile
    • Docker-Compose
    • Docker多阶段构建
    • Docker Config 教程
    • Docker Swarm 教程
    • Docker Stack 教程
    • Docker Buildx 教程
  • k8s

    • k8s 基础概念
    • k8s 集群架构
    • k8s 工作负载
    • Pod 网络
    • Service 网络
    • 外部接入网络
    • 一张图搞懂k8s各种pod
    • k8s 存储抽象
    • mac快速启动k8s
    • 自制申威架构k8s-reloader
  • go-kit

    • go-kit初识
    • go-kit启动http服务
    • go-kit集成gin启动服务
    • go-kit集成grpc和protobuf
    • go-kit中间件
    • go-kit服务注册发现与负载均衡
    • go-kit限流和熔断
    • go-kit链路追踪
    • go-kit集成Prometheus
  • 设计模式

    • 初识设计模式
    • 创建型模式
    • 结构型模式
    • 行为模式
  • 数据结构

    • 时间轮
    • 堆、双向链表、环形队列
    • 队列:优先队列
    • 队列:延迟队列
  • 算法

    • 递归算法
    • 枚举算法
    • 动态规划
    • 回溯算法
    • 分治算法
    • 贪心算法
    • LRU和LFU
    • 一致性哈希

花开半夏,半夏花开
首页
  • Go语言基础

    • 数据类型
    • 反射
    • Go指针
  • Go语言进阶

    • go泛型
    • go条件编译
    • cgo教程
    • Go协程调度原理及GPM模型
    • Go内存管理
    • Go垃圾回收机制
    • Go语言内存对齐
  • Go语言实现原理

    • channel 实现原理
    • slice 实现原理
    • map 实现原理
    • sync.Mutex 实现原理
    • 乐观锁CAS 实现原理
    • singlefight 实现原理
  • gin框架

    • gin中间件原理
    • gin路由原理
  • gorm

    • GORM介绍和使用
    • GORM_CURD操作指南
  • go测试

    • benchmark基准测试
    • pprof 性能分析
  • python进阶

    • Numpy&Pandas
    • celery分布式任务队列
  • Django

    • Django 常见命令
    • middleware中间件
    • Django缓存系统
    • Django信号系统
    • Django REST Framework
  • Flask

    • Flask基础知识总结
    • Flask-SQLAlchemy
  • 爬虫

    • aiohttp
    • scrapy框架
  • Mysql

    • Mysql存储引擎和索引
    • MySQL主从复制
    • Mysql读写分离
    • 数据库分库分表
    • Mysql锁
    • Mysql事务和MVCC原理
    • 分库分表带来的读扩散问题
  • Redis

    • redis基础和数据类型
    • redis主从架构
    • redis哨兵架构
    • redis集群模式
    • 如何保证缓存和数据库双写一致
    • redis底层数据结构
    • redis分布式锁
  • Elasticsearch

    • es基本概念
    • es基础语法
    • es倒排索引
  • etcd

    • Go操作etcd
    • Raft原理
    • etcd分布式锁
  • kafka

    • 消息队列MQ总结
    • kafka 概述及原理
    • kafka 消费问题记录
    • 零拷贝技术
    • kafka分区规范
  • RabbitMQ

    • rabbitMQ基础
    • Go操作rabbitmq
  • RocketMQ

    • 可靠消息队列 rocketMQ
  • Http&Https

    • http&https
    • TCP和UDP
    • Ping 原理
  • RPC

    • RPC初识
    • grpc初识和实现
  • gRPC

    • grpc 初识
    • grpc 上下文 metadata
    • grpc 健康检查
    • grpc keepalive
    • grpc 命名解析
    • grpc 中间件&拦截器
    • grpc 负载均衡
    • grpc 身份认证
    • grpc 超时重试
    • grpc 链路追踪
    • grpc-gw将gRPC转RESTfu api
    • grpc-gw自定义选项
  • protobuf

    • protobuf 进阶
    • protobuf 编码原理
  • Docker

    • Docker基础
    • Docker常用命令
    • Dockerfile
    • Docker-Compose
    • Docker多阶段构建
    • Docker Config 教程
    • Docker Swarm 教程
    • Docker Stack 教程
    • Docker Buildx 教程
  • k8s

    • k8s 基础概念
    • k8s 集群架构
    • k8s 工作负载
    • Pod 网络
    • Service 网络
    • 外部接入网络
    • 一张图搞懂k8s各种pod
    • k8s 存储抽象
    • mac快速启动k8s
    • 自制申威架构k8s-reloader
  • go-kit

    • go-kit初识
    • go-kit启动http服务
    • go-kit集成gin启动服务
    • go-kit集成grpc和protobuf
    • go-kit中间件
    • go-kit服务注册发现与负载均衡
    • go-kit限流和熔断
    • go-kit链路追踪
    • go-kit集成Prometheus
  • 设计模式

    • 初识设计模式
    • 创建型模式
    • 结构型模式
    • 行为模式
  • 数据结构

    • 时间轮
    • 堆、双向链表、环形队列
    • 队列:优先队列
    • 队列:延迟队列
  • 算法

    • 递归算法
    • 枚举算法
    • 动态规划
    • 回溯算法
    • 分治算法
    • 贪心算法
    • LRU和LFU
    • 一致性哈希
  • Docker

    • Docker基础
    • Docker常用命令
    • Dockerfile
    • Docker-Compose
    • Docker多阶段构建
    • Docker 实现原理
    • Docker网络模式
    • Docker Machine 教程
    • Docker Config 教程
    • Docker Swarm教程
      • 基础概念
      • 运行原理
        • 1. nodes
        • 2. Service 与 tasks
        • 3 load balancing
      • 安装部署
        • 1. 准备工作
        • 2. docker-swarm安装
        • 3. swarm节点说明
        • 4. 集群节点管理
        • 5. Docker-swarm 命令汇
      • 图形界面
    • Docker Service
    • Docker Stack 教程
    • Docker Buildx 教程
  • k8s

  • docker+k8s
  • Docker
bigox
2023-11-06
目录

Docker Swarm教程

doc: https://docs.docker.com/engine/swarm/

# 基础概念

  • Docker Swarm是Docker的集群管理工具,它提供了标准的Docker API,所有任何已经与Docker守护程序通信的工具都可以使用Swarm轻松地扩展到多个主机
  • Docker Swarm就是用来管理Docker集群的,但是现在基本上使用的很少,一般都是用的K8S

# 运行原理

  • Swarm集群由多个运行在swarm mode的docker主机组成,docker主机分为管理节点(manager)和工作节点(work node)两种类型

    • 管理节点(manager):负责整个集群的管理工作包括集群配置、服务管理,服务的创建和调度等

    • 工作节点(work node):负责运行相应的服务来执行任务(运行容器服务)

      manager节点也可以运行的容器服务,但是一般不这么做,只是让它管理work node

  • Swarm集群的优点:

    • 在线修改Service的配置,包括networks和volumes,不需要重启docker服务

    • 可以将其它standalone模式的docker主机加入到Swarm集群(Standalone模式简单点说就是 manager 和 work 的一种管理关系模式)

  • 在Docker Swarm中有几个基本概念:nodes、Service、tasks、load balancing

# 1. nodes

  • Node是加入到Swarm集群中的Docker实例,即是一个docker节点,包含上面说的【管理节点(manager)和工作节点(work node)】

    • 在部署应用到Swarm集群的时候,会向管理节点提交service定义,管理节点会将这些这些work也就是tasks分发到work节点中

    • Work节点接收并执行管理节点分配的任务,work节点也会将当前tasks的状态通知到管理节点以维护节点的状态信息。

  • 管理节点(manager node)

    • Manager节点主要通过raft算法实现整个集群和运行的service的内部状态维护,Docker官方建议一个集群最好使用基数manager节点数(最大使用7个manager节点)保证可用性 ,Manager节点主要工作是完成以下tasks:
      • 维护cluster state
      • scheduling服务
      • service swarm mode集群服务
  • 工作节点(work node)

    • Work节点是容器实际运行的实例节点,在默认情况下manager节点也是work节点,而且在在Swarm集群中必须存在manager节点

    • manager节点状态、信息的同步根据Raft consensus group(Raft一致性算法)的网络进行通信同步的,而worker之间的通信依靠的是Gossip network通信协议实现的。

  • 管理节点与工作节点的切换

    • 在多节点的Swarm集群中,节点有两种模式:【Active模式,Drain模式】。

    • Swarm调度不会将任务分配到Drain模式,只会在Active模式的节点上分配任务。因此可以将manager节点设置为Drain模式(避免调度任务运行在manager节点,manager指做管理)

    • docker node promote: 命令可以修改节点模式,将worker节点变为manager节点,也可以将manager节点转换为worker节点。

# 2. Service 与 tasks

  • Service是manage和work节点上执行的task的定义,创建service的时候可以指定使用哪个container image以及执行的命令

  • 当Service部署到Swarm集群的时候,swarm管理节点会将service为标准(container image以及执行的命令),然后将service调度到集群的节点上,以一个或多个tasks执行,这些nodes上运行的tasks之间是相互独立的。

  • 在replicated service模式下,swarm管理节点会根据desired state中设置的scale分发replica tasks

  • 在globalservice模式,swarm集群会向每个可用的节点运行tasks

    图片

  • 如上service中有三个replicas tasks,每个实例是Swarm集群中的一个task

  • Task是Swarm集群中调度的最小单元,当创建或更新service时候给定了desired state,集群会调度tasks来实现这种理想状态

  • Task是一种单向机制,它整个周期过程中会完成一系列的状态(assigned、prepared和running等),tasks运行失败集群会remove这个tasks并创建新的tasks来替代。

# 3 load balancing

负载均衡:Swarm集群使用ingress loading balancing提供集群服务,Swarm集群会自动为service分配PublishedPort,默认使用30000-32767范围

# 安装部署

# 1. 准备工作

  • 官方地址 https://docs.docker.com/engine/swarm/

  • 添加私服仓库地址

    由于官方镜像下载比较慢,由于网络原因可能拉取不下来,而集群的每个节点都需要安装镜像,所以使用私有仓库会快很多,当然也可以不使用私有仓库,直接自己下载上传。

    #编辑配置文件
    vi /etc/docker/daemon.json
    #增加仓库配置信息
    # 在daemon.json中添加以下 key,保存退出。此步用于让 docker 信任私有仓库地址
    {"insecure-registries":["192.168.242.130:5000"]} 
    
    
    #重新加载docker配置
    systemctl daemon-reload
    #重启docker
    systemctl restart docker
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

# 2. docker-swarm安装

这里模拟安装集群,以三个节点搭建集群在加上一个Harbor节点,节点信息如下

节点 Ip 说明
manager-01 192.168.242.131 swarm-manager 节点
work-01 192.168.242.132 swarm-work节点
work-02 192.168.242.133 swarm-work节点
harbor 192.168.242.130 harbor 私服

安装上述配置,克隆出相应的虚拟机,其中harbor之前已经存在,这里用之前的,所以一共克隆出三个服务器

图片

  • 查看网络情况

    docker network ls
    
    1

    图片

  • 初始化manager管理节点

    • 初始化manager管理节点

      #这里使用192.168.242.131这台主机作为manager 所以以下命令在192.168.242.131上执行 端口默认是2377
      docker swarm init --advertise-addr 192.168.242.131:2377 --listen-addr 192.168.242.131:2377
      # --advertise-addr 指定其他节点连接manager时的地址
      # --listen-addr 监控swarm集群manager的IP和端口
      
      1
      2
      3
      4
    • 执行上面命令后,就会初始化swarm集群,并且会告诉我们如何增加wrok 节点和manager节点

    图片

  • 再次查看网络情况

    #集群初始化后会新增集群网络
    docker network ls
    
    1
    2

    图片

  • 查看节点

    docker node ls
    
    1

    图片

  • 新加一个work节点

    • 通过上面初始化manager返回的命令,给集群加入新的节点,只需要在对应的主机上执行该命令即可

      docker swarm join --token your-token 192.168.242.131:2377
      
      1
  • 重新获取token

    #获取一个worker加入集群的token
    docker swarm join-token worker
    
    1
    2
  • 新加一个manager节点

    • 一个集群要有多个manager节点,上面加入了work节点,接下来在集群中加入一个manager节点,加入方式一样的,先获取manager的token

    • 获取manager节点的token

      #获取一个manager加入集群的token  ,这个命令要在之前的那个manager 192.168.242.131 上执行
      docker swarm join-token manager
      
      1
      2

      图片

    • 加入集群: 这里就用 192.168.242.133 这个主机作为一个manager加入集群

      图片

# 3. swarm节点说明

  • swarm集群中,只有manager节点可以执行swarm命令(比如docker node ls),work节点会报错,因为只有manager节点才可以管理集群,执行集群相关的命令

    work 节点只是不能执行swarm的集群命令,但是docker本身的命令是可以执行的,比如docker ps等

  • 可以分别在manager和node中查看节点的swarm信息,对比差异

    docker info
    
    1
  • 在使用docker node ls 命令查看集群的节点信息的时候,有两列需要注意一下:AVAILABILITY,MANAGER STATUS

    图片

    • Leader:该节点是集群管理和编排决策的主要管理器节点。

    • Reachable:该节点是管理者节点正在参与Raft选举。如果Leader节点不可用,则该节点有资格被选为新领导者。

    • Unavailable:该节点属于不能与其他manager通信的manager。如果manager节点不可用,可以将它加入群集,或者将工作器节点升级为管理器。

    • Active:调度程序可以将任务分配给当前节点。

    • Pause:调度程序不会将新任务分配给当前节点,但现有任务仍在运行。

    • Drain:调度程序不会向当前节点分配新任务。调度程序关闭所有现有任务并在可用节点上重新调度这些任务。

    • AVAILABILITY: 决定当前节点可用性,是否用于运容器,它有三个值;

    • 改变节点的可用性(availability)

      docker node update --availability drain 节点Id/名称
      
      1
    • MANAGER STATUS

      表示manger节点的状态,work节点为空,它也有三个状态值

# 4. 集群节点管理

  • 节点权限提升/降低

    • 节点manager和work两种,他们的权限不一样,我们可以手动的对节点权限提升/降低,也是将manager降级为work,将work升级为manager节点

    • 升级降级的命令都要在manager节点执行。

    • 将work升级为manager节点

      #将worker节点提升为manager节点,在manager节点执行如下命令:
      docker node promote 节点名称|节点ID
      
      1
      2
  • 将manager降级为work

    将manager节点降低为worker节点,在manager节点执行如下命令:
    docker node demote 节点名称|节点ID
    docker node ls
    
    1
    2
    3
  • work脱离集群

    #在要脱离集群的节点上使用一下命令, 主动离开集群,让节点处于down状态,才能删除
    docker swarm leave
    #指向完后,等一会在manager节点使用命令:docker node ls  就会发现该节点已经脱离集群管理
    
    1
    2
    3
  • 删除脱离集群的节点

    docker node rm 节点名称|节点ID
    
    1
  • manager脱离集群

    • manager节点不能脱离集群,使用docker swarm leave会报错。

    • manager节点不能脱离集群,只能强制退出,manager退出后意味着整个swarm 不复存在。

      #manager节点强制退出
      docker swarm leave --force
      
      1
      2

# 5. Docker-swarm 命令汇

  • swarm命令汇总

    命令 描述
    docker swarm init 初始化一个 swarm 群集
    docker swarm join 加入群集作为节点或管理器
    docker swarm join-token 管理用于加入群集的令牌
    docker swarm leave 离开 swarm 群集
    docker swarm unlock 解锁 swarm 群集
    docker swarm unlock-key 管理解锁钥匙
    docker swarm update 更新 swarm 群集
  • node命令汇总

    命令 描述
    docker node demote 从 swarm 群集管理器中降级一个或多个节点
    docker node promote 将一个或多个节点推入到群集管理器中(也就是升级节点)
    docker node inspect 显示一个或多个节点的详细信息
    docker node ls 列出 swarm 群集中的节点
    docker node ps 列出在一个或多个节点上运行的任务,默认为当前节点
    docker node rm 从 swarm 群集删除一个或多个节点
    docker node update 更新一个节点

# 图形界面

  • docker-swarm的图形界面需要安装在manager节点上,不然无法操作节点

    #docker官网地址
    https://hub.docker.com/r/dockersamples/visualizer
    
    1
    2
  • 拉取镜像

    docker pull dockersamples/visualizer:latest
    
    1
  • 运行镜像

    # /var/run/docker.sock 是必须要的挂载目录  HOST是指定Ip,需要是manager节点的Ip
    docker run -itd --name visualizer -p 8099:8080 -e HOST=192.168.198.131 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock 192.168.242.130:5000/edwinedu/dockersamples/visualizer:latest
    
    1
    2
  • 访问图形界面

    http://192.168.242.131:8099/
    
    1
上次更新: 2024/01/16, 22:03:50
Docker Config 教程
Docker Service

← Docker Config 教程 Docker Service→

最近更新
01
go与http代理
05-24
02
自制申威架构k8s-reloader
12-06
03
Docker Buildx 教程
12-01
更多文章>
Theme by Vdoing | Copyright © 2020-2024 小刘扎扎 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式