[云原生专题-18]:容器-docker自带的集群管理工具swarm-手工搭建集群服务全过程详细解读

文火冰糖的硅基工坊      2022-02-17     707

关键词:

作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122743643


目录

准备工作:集群规划

第一步:搭建云服务器

1.1 安装服务器

1.2 安装后检查

第二步:搭建docker环境(云平台手工操作)

第三步:搭建集群角色(swarm)

2.1 搭建leader manager 角色(swarm int)

2.2 搭建普通 manager 角色  (swarm join as mananger)

2.3 搭建worker 角色  (swarm join as worker)

2.4 查看集群的节点情况

第四步:搭建集群服务(docker service)--在管理节点上执行命令

4.1 docer service命令

4.2 新创建服务

4.3 查看服务

4.4 验证服务

4.5 服务实例的弹性增加

4.6 服务实例的弹性删除

4.7 在线滚动升级服务镜像的版本: service update

4.8 停止某个节点接受服务请求


准备工作:集群规划

第一步:搭建云服务器

1.1 安装服务器

(1)服务器

  • 创建5台服务器, 即实例数=5,一次性创建5台服务器
  • 5台服务器在同一个默认网络中
  • 1核2G
  • 标准共享型
  • 操作系统选择CentOS

(2)网络

  • 分配共有IP地址
  • 默认专有网络
  • 按流量使用,1M带宽

(3)默认安全组

  • 设定公网远程服务服务器的用户名和密码
  •  添加80端口,用于后续nginx服务的测试。

 

1.2 安装后检查

(1)通过公网IP登录到每台服务器

 

(2) 为服务器划分角色

leader mananger:172.24.130.164

normal manager:172.24.130.165

worker1:172.24.130.166

worker2:172.24.130.167

worker3:172.24.130.168

(3)安装ifconfig和ping工具

$ yum install -y yum-utils

$ yum install iputils

$ yum install net-tools.x86_64

(4)通过私网IP可以ping通

第二步:搭建docker环境(云平台手工操作)

CentOS Docker 安装 | 菜鸟教程

How nodes work | Docker Documentation

2.1  为每台虚拟服务器安装docker环境

(1)分别ssh到每台虚拟服务器中

(2)一键安装docker环境

# 增加阿里云镜像repo

$ yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

$ curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

2.2 为每台虚拟服务器启动docker环境

$ systemctl start docker

$ docker version

$ docker ps

$ docker images
[root@Test ~]# docker info
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  app: Docker App (Docker Inc., v0.9.1-beta3)
  buildx: Docker Buildx (Docker Inc., v0.7.1-docker)
  scan: Docker Scan (Docker Inc., v0.12.0)

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 20.10.12
 Storage Driver: overlay2
  Backing Filesystem: xfs
  Supports d_type: true
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 7b11cfaabd73bb80907dd23182b9347b4245eb5d
 runc version: v1.0.2-0-g52b36a2
 init version: de40ad0
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 4.18.0-348.2.1.el8_5.x86_64
 Operating System: CentOS Linux 8
 OSType: linux
 Architecture: x86_64
 CPUs: 1
 Total Memory: 759.7MiB
 Name: Test
 ID: QOVF:RC73:VI4W:TAUR:3NIE:GSAW:6HMY:L2SM:LRWF:DYIZ:5BJT:SQTB
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

第三步:搭建集群角色(swarm)

2.1 搭建leader manager 角色(swarm int)

(1)命令


$ docker swarm init --advertise-addr 172.24.130.164 #这里的 IP 为创建机器时分配的私有ip。

(2)输出

[root@Test ~]# docker swarm init --advertise-addr 172.24.130.164
Swarm initialized: current node (tkox6q8o48l7b2aofzygzvjow) is now a manager.

如何添加woker:

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-23znzigz1ycuuy1hmp77a4nxp2w8ffvri3zwelc8fx4aeo2xr6-bpda5otyc47k1iz064353adwj 172.24.130.164:2377

如何添加manager:

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

以上输出,证明已经初始化成功。需要把以下这行复制出来,在增加工作节点时会用到。

在集群中,

--token为集群的标识,其组成为token-id + leader mananger ip地址 + leader mananger的端口号。

(3) docker swarm用法

[root@Test ~]# docker swarm

Usage:  docker swarm COMMAND

Manage Swarm

Commands:
  ca          Display and rotate the root CA
  init        Initialize a swarm
  join        Join a swarm as a node and/or manager
  join-token  Manage join tokens
  leave       Leave the swarm
  unlock      Unlock swarm
  unlock-key  Manage the unlock key
  update      Update the swarm

Run 'docker swarm COMMAND --help' for more information on a command.
 

2.2 搭建普通 manager 角色  (swarm join as mananger)

(1) 在leader manager上执行如下命令,获取以manager的身份加入到swarm集群中的方法

$ docker swarm join-token manager

To add a manager to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-23znzigz1ycuuy1hmp77a4nxp2w8ffvri3zwelc8fx4aeo2xr6-262vije87ut842ejp8cmfdwqn 172.24.130.164:2377

(2)登录到mananger-2上,执行上述输出结果中的命令,

docker swarm join --token SWMTKN-1-23znzigz1ycuuy1hmp77a4nxp2w8ffvri3zwelc8fx4aeo2xr6-262vije87ut842ejp8cmfdwqn 172.24.130.164:2377

This node joined a swarm as a manager.
 

2.3 搭建worker 角色  (swarm join as worker)

(1)在leader mananger节点上执行如下命令

$ docker swarm join-token worker

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-23znzigz1ycuuy1hmp77a4nxp2w8ffvri3zwelc8fx4aeo2xr6-bpda5otyc47k1iz064353adwj 172.24.130.165:2377
 

(2)在每个worker机器分别执行如下命令:

[root@Test ~]# docker swarm join --token SWMTKN-1-23znzigz1ycuuy1hmp77a4nxp2w8ffvri3zwelc8fx4aeo2xr6-bpda5otyc47k1iz064353adwj 172.24.130.164:2377

This node joined a swarm as a worker.

2.4 查看集群的节点情况

(1)docker node命令

[root@Test ~]# docker node

Usage:  docker node COMMAND

Manage Swarm nodes

Commands:
  demote      Demote one or more nodes from manager in the swarm
  inspect     Display detailed information on one or more nodes
  ls          List nodes in the swarm
  promote     Promote one or more nodes to manager in the swarm
  ps          List tasks running on one or more nodes, defaults to current node
  rm          Remove one or more nodes from the swarm
  update      Update a node

从上述命令可以看出,可以通过rm命令把部分节点从swarm集群中删除。也可以通过ls命令展现当前集群中的所有节点。

(2)查看集群中的所有节点

[root@Test ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
notb2otq9cd6ie5tcs99ozoam     Test       Ready     Active                          20.10.12
s59g2ygqm8lbrngpxhyt3zzg3     Test       Ready     Active                          20.10.12
stea3vvu3hj9x619yb64e5kjo     Test       Ready     Active                          20.10.12
tkox6q8o48l7b2aofzygzvjow     Test       Ready     Active         Leader           20.10.12
zclgojyadj75g4qtx5bmyj9kk *   Test       Ready     Active         Reachable        20.10.12

从上面的输出可以看出,5个节点都按照各自规划的身份,已经加入到网络,

现在就可以,集群中节点部署服务docker service了。

第四步:搭建集群服务(docker service)--在管理节点上执行命令

4.1 docer service命令

[root@Test ~]# docker service

Usage:  docker service COMMAND

Manage services

Commands:
  create      Create a new service
  inspect     Display detailed information on one or more services
  logs        Fetch the logs of a service or task
  ls          List services
  ps          List the tasks of one or more services
  rm          Remove one or more services
  rollback    Revert changes to a service's configuration
  scale       Scale one or multiple replicated services
  update      Update a service

4.2 新创建服务

在一个工作节点上创建一个名为 helloworld 的服务,这里是随机指派给一个工作节点:

#  展现当前已有的service
$ docker service ls

# 删除已有的service(现在测试已经部署的service)
$ docker service rm

# 部署自己的service 
$ [root@Test ~]# docker service create --replicas 2 --name my_nginx -p 80:80 nginx

[root@Test ~]# docker service create --replicas 2 --name my_nginx -p 80:80 nginx
d326pd2c5mmiosc9m5lwbdp2f
overall progress: 2 out of 2 tasks
1/2: running   [==================================================>]
2/2: running   [==================================================>]
verify: Service converged

4.3 查看服务

(1)查看所有服务

[root@Test ~]#  docker service ls
ID             NAME       MODE         REPLICAS   IMAGE          PORTS
d326pd2c5mmi   my_nginx   replicated   2/2        nginx:latest   *:80->80/tcp

这里有一个服务,my_nginx  ,有两个实例,服务的端口为80.

(2)在master上查看指定service的详情

[root@Test ~]# docker service ps my_nginx
ID             NAME         IMAGE          NODE      DESIRED STATE   CURRENT STATE           ERROR     PORTS
k9n4h3u0fprx   my_nginx.1   nginx:latest   Test      Running         Running 6 minutes ago
7jainolzyb20   my_nginx.2   nginx:latest   Test      Running         Running 6 minutes ago

(3)每台服务器查看在自身服务上的部署情形

选择其中服务器:

[root@Test ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS     NAMES
3b7a1a984b42   nginx:latest   "/docker-entrypoint.…"   5 minutes ago    Up 5 minutes    80/tcp    my_nginx.7.lctwil7sohn4l0h62vbvgagju

4.4 验证服务

在5个服务器公网地址,分别执行http远程访问

http://116.62.229.233/
http://120.26.75.192/
http://120.27.251.144/
http://121.199.64.187/
http://120.27.193.74/

 我们会发现一个神奇的现象:

虽然我们只部署了nginx服务的两个实例,但居然通过集群服务器的所有地址,都可以访问相同的nginx服务。

这其实就是集群服务的优势:

无论后续部署多少个实例,都可以通过相同的IP地址访问服务,自动实现work节点的负载均衡,以及多个IP地址的汇集功能 。

也就是说,5个公网IP地址是为集群共享,所有部署的服务,也是为集群共享。

由docker swarm来实现上述功能。

4.5 服务实例的弹性增加

我们可以根据实际用户的访问流量,非常方便、简洁、快速地、弹性部署服务的实例。

[root@Test ~]# docker service scale my_nginx=8

my_nginx scaled to 8
overall progress: 8 out of 8 tasks
1/8: running   [==================================================>]
2/8: running   [==================================================>]
3/8: running   [==================================================>]
4/8: running   [==================================================>]
5/8: running   [==================================================>]
6/8: running   [==================================================>]
7/8: running   [==================================================>]
8/8: running   [==================================================>]
verify: Service converged
[root@Test ~]# docker service ls
ID             NAME       MODE         REPLICAS   IMAGE          PORTS
d326pd2c5mmi   my_nginx   replicated   8/8        nginx:latest   *:80->80/tcp
[root@Test ~]# docker service ps my_nginx
ID             NAME         IMAGE          NODE      DESIRED STATE   CURRENT STATE            ERROR     PORTS
k9n4h3u0fprx   my_nginx.1   nginx:latest   Test      Running         Running 25 minutes ago
7jainolzyb20   my_nginx.2   nginx:latest   Test      Running         Running 25 minutes ago
5ib5pvokzul3   my_nginx.3   nginx:latest   Test      Running         Running 53 seconds ago
h0l58xuot3b1   my_nginx.4   nginx:latest   Test      Running         Running 53 seconds ago
fj6nfnh4iwhc   my_nginx.5   nginx:latest   Test      Running         Running 52 seconds ago
m4qhmh2ng8ff   my_nginx.6   nginx:latest   Test      Running         Running 52 seconds ago
lctwil7sohn4   my_nginx.7   nginx:latest   Test      Running         Running 53 seconds ago
9mk5v48d6m9x   my_nginx.8   nginx:latest   Test      Running         Running 53 seconds ago

登录到每个服务器上,查看这8个服务中,部署在自身服务器上有 几个:

[root@Test ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS     NAMES
3b7a1a984b42   nginx:latest   "/docker-entrypoint.…"   5 minutes ago    Up 5 minutes    80/tcp    my_nginx.7.lctwil7sohn4l0h62vbvgagju
174f62943bf2   nginx:latest   "/docker-entrypoint.…"   29 minutes ago   Up 29 minutes   80/tcp    my_nginx.2.7jainolzyb2012xuzswo1nfpr
[root@Test ~]#

4.6 服务实例的弹性删除

[root@Test ~]#  docker service scale my_nginx=4
my_nginx scaled to 4
overall progress: 4 out of 4 tasks
1/4: running   [==================================================>]
2/4: running   [==================================================>]
3/4: running   [==================================================>]
4/4: running   [==================================================>]
verify: Service converged


[root@Test ~]# docker service ls
ID             NAME       MODE         REPLICAS   IMAGE          PORTS
d326pd2c5mmi   my_nginx   replicated   4/4        nginx:latest   *:80->80/tcp
[root@Test ~]#

4.7 在线滚动升级服务镜像的版本: service update

$ docker service update --image XXX

4.8 停止某个节点接受服务请求

[root@Test ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
notb2otq9cd6ie5tcs99ozoam     Test       Ready     Active                          20.10.12
s59g2ygqm8lbrngpxhyt3zzg3     Test       Ready     Active                          20.10.12
stea3vvu3hj9x619yb64e5kjo     Test       Ready     Active                          20.10.12
tkox6q8o48l7b2aofzygzvjow *   Test       Ready     Active         Leader           20.10.12
zclgojyadj75g4qtx5bmyj9kk     Test       Ready     Active         Reachable        20.10.12
[root@Test ~]# docker node update --availability drain notb2otq9cd6ie5tcs99ozoam
notb2otq9cd6ie5tcs99ozoam

[root@Test ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
notb2otq9cd6ie5tcs99ozoam     Test       Ready     Drain                           20.10.12
s59g2ygqm8lbrngpxhyt3zzg3     Test       Ready     Active                          20.10.12
stea3vvu3hj9x619yb64e5kjo     Test       Ready     Active                          20.10.12
tkox6q8o48l7b2aofzygzvjow *   Test       Ready     Active         Leader           20.10.12
zclgojyadj75g4qtx5bmyj9kk     Test       Ready     Active         Reachable        20.10.12
[root@Test ~]#

通过一条简单的命令,就可以让某个节点停止提供服务。

备注:

停止服务,并不是,其服务器的IP地址不可访问,而是在SWARM在该节点不参与负载均衡调度。

对该服务器的所有访问,都会均衡到其他服务器上。


作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122743643

[云原生专题-15]:容器-docker主机管理工具-dockermachine

作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客本文网址: https://blog.csdn.net/HiWangWenBing/article/details/122730096目录前言:第1章什么是dockermachine1.1Dockermachine教程1.2DockerMa 查看详情

云原生之docker实战使用docker部署rabbitmq集群(代码片段)

【云原生之Docker实战】使用Docker部署Rabbitmq集群一、Rabbitmq介绍1.Rabbitmq简介2.Rabbitmq特点3.Rabbitmq的工作机制二、检查本地dokcer状态1.检查docker版本2.查看docker状态3.查看docker信息三、创建容器前准备工作1.创建数据卷2.创建网络3.查... 查看详情

[云原生专题-10]:容器-docker的修改保存共享:commitsaveload-v(代码片段)

作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122709124目录前言:第1章Docker的修改:docker exec第2章docker修改内... 查看详情

云原生之docker容器的存储管理(代码片段)

一、检查本地docker环境1.检查宿主机系统版本[root@docker~]#cat/etc/centos-releaseCentOSLinuxrelease7.6.1810(Core)2.检查docker版本[root@docker~]#docker-vDockerversion20.10.18,buildb40c2f6二、创建一个测试httpd容器1.创建测试目录[root& 查看详情

#云原生征文#深入万物基础-容器

深入万物基础-容器一、思考我们在k8s里面的容器和docker的容器有什么异同?其实docker之前有自己的一套编排软件:dockerswarm它可以在多台主机中创建一个docker集群,但是也仅限于此了,docker在很早就放弃了这个项目。dockermachine... 查看详情

云原生kubernetes系列第五篇kubeadmv1.20部署k8s集群架构(人生这道选择题,总会有遗憾)(代码片段)

系列文章目录😜即日起,更新云原生相关知识,喜欢的小伙伴可以给我点个三连喔😜收录至专栏云原生😜【云原生Docker系列第一篇】Docker镜像管理😜【云原生Docker系列第二篇】Docker容器管理😜【云... 查看详情

云原生docker进阶--阿里云服务器安装dockercompose与初体验

一、什么是DockerCompose?docker-compose是基于docker的开源项目,托管于github上,由python实现,调用docker服务的API负责实现对docker容器集群的快速编排,即通过一个单独的yaml文件,来定义一组相关的容器来为一个项目服务。DockerCompose... 查看详情

[云原生专题-11]:容器-如何构建自己的docker镜像:dockerdockerfile(代码片段)

作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122713131目录前言:第1章(方法1):动态构建:基于... 查看详情

猿创征文|云原生领域之容器日常使用工具推荐(代码片段)

猿创征文|云原生领域之容器日常使用工具推荐一、云原生介绍1.云原生定义2.容器技术简介3.云原生相关工具导航二、Docker1.Docker介绍①Docker简介②Docker特点③Docker的三个基本概念④Docker的架构图2.Docker的优势3.Docker的使用效果①... 查看详情

云原生之docker的容器资源管理

云原生之Docker的容器资源管理一、检查本地docker环境1.检查系统版本2.检查Docker状态二、Cgroup和NameSpace介绍1.Cgroup简介2.NameSpace简介3.容器的资源隔离三、容器的资源限额1.容器中CPU的使用限额①运行一个压力测试容器②新开启终端... 查看详情

dockerswarm

参考技术ASwarm是使用SwarmKit构建的Docker引擎内置(原生)的集群管理和编排工具。DockerSwarm是Docker官方三剑客项目之一,提供Docker容器集群服务,是Docker官方对容器云生态进行支持的核心方案。使用它,用户可以将多个Docker主机... 查看详情

云原生第十篇--docker主机集群化方案dockerswarm(代码片段)

Docker主机集群化方案DockerSwarm一、dockerswarm介绍二、dockerswarm概念与架构2.1架构2.2概念三、dockerswarm集群部署3.1容器镜像仓库Harbor准备3.2主机准备3.2.1主机名3.2.2IP地址3.2.3主机名与IP地址解析3.3.4主机时间同步3.2.5主机安全设置3.3docke... 查看详情

[云原生专题-22]:k8s-集群编排工具k8s与swarm比较与技术选择

作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122750196目录前言第1章K8S与SWARM的位置1.1在软件架构中的1.2在软件工程中... 查看详情

『云原生·docker』docker-compose容器编排(代码片段)

...主要分为以下六大部分,正在更新中,尽请期待!『云原生·生之门』『云原生·前置知识』『云原生·Docker』『云原生·Kubernetes』『云原生·KubeSphere』『云原生·DevOps』🚩点击关注本专栏提示:已经更新的或正在更新的... 查看详情

云原生swarm解决dockerserver的集群化管理和部署(代码片段)

...使用方式:swarm能做什么:管理节点高可用,原生支持管理节点高可用,采用raft共 查看详情

云原生之docker实战容器的资源限制使用方法

【云原生之Docker实战】容器的资源限制使用方法一、容器资源限制介绍二、检查本地Docker状态三、查看本地容器系统相关文件1.查看容器配置目录2.查看内存相关文件3.查看cpu相关文件四、容器内存资源的限制1.查看内存限制的选... 查看详情

云原生容器技术3云原生容器技术概要介绍-容器技术基础-docker

参考https://edu.aliyun.com/lesson_2553_27359#_27359 查看详情

云原生之docker容器安装以及入门docker部署web应用&&云原生基石

一.前言1.1Docker是什么?Docker是一个应用打包、分发、部署的工具。基本就是一个轻量的虚拟机。虚拟机里只有我们需要的东西,其他多余的东西是必要的。我们看下图,来看一下它和普通的虚拟机对比图:如下:1.2打包、分发、... 查看详情