运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

三剑客之swarm、监控、脚本、图形界面

1、swarm功能介绍

Swarm 是 Docker 社区提供的唯一一个原生支持 Docker 集群管理的工具,swarm和docker是无缝衔接,且操作简单,小巧灵活。Swarm可以把多个 Docker 主机组成的系统转换为单一的虚拟 Docker 主机,使得容器可以组成跨主机的子网网络,组成docker集群。
一般来说swarm很适合小规模集群使用,性能表现良好;对于容器的调度很灵活;它提供api接口,支持更多功能模块的兼容;Docker Swarm 为 Docker 化应用的核心功能(诸如多主机网络和存储卷管理)提供原生支持。
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面
docker swarm节点分为manager节点和worker节点,他们之间的连接是通过http。任务 (Task)是最小的调度单位,目前来说就是一个单一的容器。服务 (Services) 是指一组任务的集合,服务定义了任务的属性。
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

在 Docker 1.12 版本发布之后,swarm内嵌在docker中,成为 Docker 的一个子命令,无需额外安装,使用便利

2、Docker Swarm实现

现在准备四台虚拟机,server1(172.25.11.1)、server2(172.25.11.2)、server3(172.25.11.3)、server4(172.25.11.4)都已经安装docker,我们想在server1中部署harbor仓库,server2做Docker Swarm集群的manager,server3和server4做Docker Swarm集群的worker。
这里加入harbor仓库的目的是可以加速docker pull拉取镜像,不然本地找不到就去网上拉取,速度很慢。因为前面已经搭建harbor,这里不再赘述,详见以前博客运维实操——docker容器(四)搭建远程容器仓库harbor、漏洞扫描和内容信任.
server2、server3、sever4都提前安装了docker-ce

(1)准备工作

首先server1关闭上个haproxy实验的环境
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

docker-compose up -d后台开启harbor
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

为了免密,通信方便,之前server1已经给了server2和server3,现在再给一份server4
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

server1把证书发给server2、server3、server4
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

为了使server2、server3、server4可以访问到仓库地址,我们需要在/etc/docker中写入daemon.json文件,告诉仓库地址。
server2、server3、server4都需要有daemon.json文件
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

然后都重启docker,docker info查看可以知道仓库地址
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

server2、server3、server4都要加入仓库的地址解析
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

为了后续的效果,提前给仓库导入myapp镜像,他包括myapp:v1和myapp:v2
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

修改标签为仓库中的library库,并上传至harbor仓库中
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

进入web可以查看已经上传至仓库
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

(2)初始化

server2初始化swarm集群,谁初始化,谁默认就是manager
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

注意初始化的结果里有其他节点加入的token,保留好

(3)节点加入集群

server3和server4加入集群
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

在server2中,docker node ls查看节点是否成功加入,可以看到server2是leader
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

(4)创建集群服务

docker service create --name webservice --publish 80:80 --replicas 3 myapp:v1
创建集群服务,命名为webservice,物理机的80端口映射到容器内的80端口,副本数量为3,使用myapp:v1镜像
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

查看服务正常
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

(5)测试

curl 172.25.9.2/hostname.html 可以看到访问的服务自动负载均衡,三个服务,一人一次
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

(6)扩容

扩充服务的数量为6,平均的分布在三个服务器上
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

(7)测试

curl 172.25.9.2/hostname.html 可以看到访问的服务自动负载均衡,六个结点,一人一次
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

3、Docker Swarm监控

github上可以搜索visualizer
我们想要有个监控方便查看

为了不影响接下来的实验结果,先将上面的实验清理
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

首先导入visualizer镜像
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面
修改标签为仓库library中,上传镜像
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

创建服务,副本6个。
创建监控,名字叫viz,8080端口映射到8080。
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

访问172.25.11.2:8080,可以看到六个服务,一个监控
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

扩容到20个
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

查看
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

把原来的v1更新为v2,parallelism参数是表示一次更新几个,这里是一次更新五个;delay参数是表示延迟几秒,这里是每隔5秒更新一次。网页也可以清晰的看出这个过程
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

假如更新的版本发现有问题,可以回滚,默认是一个一个回滚
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

现在又恢复为v1了
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

4、编写脚本自动创建

在前面的操作中,我们采用命令行的方式建立了swarm集群,但是这样的命令行并不是每一个运维或开发人员都熟记的,而且操作起来会比较麻烦,想要一个脚本直接执行。

删除上面的实验环境
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

编写docker-compose脚本

[root@server2 ~]# cat docker-compose.yml
version: "3.8"
services:
  web:
    image: myapp:v1
    ports:
      - "80:80" 			%端口映射,主机80映射容器80
    networks:
      - webnet 				%网络接口为webnet
    deploy:
      replicas: 6 			%副本数量为6
      update_config:
        parallelism: 2 		%每次更新的数量为2
        delay: 5s  			%更新时间间隔
      restart_policy:
        condition: on-failure

  visualizer:
    image: visualizer:latest
    ports:
      - "8080:8080" 		%监控端口为主机映射8080到容器的8080
    stop_grace_period: 1m30s
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints:
          - "node.role==manager"

networks:
  webnet:

运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

使用脚本部署集群,名为mycluster
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

修改脚本,
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

重新部署即为更新版本,扩容为60个
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

网页也可以看到60个
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

修改脚本
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

重新部署,把v1更新为v2
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

监控查看,20个20个更新的
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

docker stack ps mycluster,查看到原来的v1也在,这是为了回滚的时候有。
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

swarm集群在创建成功时会自动添加虚拟网卡
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

5、swarm图形界面

光有监控还是不够理想,想要为swarm集群管理添加图形化管理界面。
准备portainer-agent.tar和portainer.tar
为了更好的区分,在仓库中新建一个项目portainer,公开
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

导入镜像,修改标签,上传到仓库的portainer项目中
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

网页仓库可以看到
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

编写portainer-agent-stack.yml文件

version: '3.2'

services:
  agent:
    image: portainer/agent
    environment:
      # REQUIRED: Should be equal to the service name prefixed by "tasks." when
      # deployed inside an overlay network
      AGENT_CLUSTER_ADDR: tasks.agent
      # AGENT_PORT: 9001
      # LOG_LEVEL: debug
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /var/lib/docker/volumes:/var/lib/docker/volumes
    networks:
      - agent_network
    deploy:
      mode: global
      placement:
        constraints: [node.platform.os == linux]

  portainer:
    image: portainer/portainer
    command: -H tcp://tasks.agent:9001 --tlsskipverify
    ports:
      - "9000:9000"
    volumes:
      - portainer_data:/data
    networks:
      - agent_network
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints: [node.role == manager]

networks:
  agent_network:
    driver: overlay
    attachable: true

volumes:
  portainer_data:

执行portainer-agent-stack.yml文件部署服务
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

查看portainer开启了9000端口
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

网页访问172.25.11.2:9000进入图形界面
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

输入账户密码,即可进入管理界面,首次进入需要设定管理账户和密码
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

scale修改数字,直接就可以扩容,很方便
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

监控到六个
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

添加仓库信息
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

添加服务game2048,8000端口映射为80
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

成功开启
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

网页输入172.25.11.3:8000
运维实操——docker容器(十)三剑客之swarm、监控、脚本、图形界面

如果要离开集群
对于worker输入docker swarm leave
对于manager输入docker swarm leave --force

上一篇:深度剖析原理!网易云音乐java开发


下一篇:Linux中find常见用法示例 ·find path -option [ -print ] [ -exec -ok command ] {} \;