• docker三剑客:swarm mesos k8s

一、知识剖析

  • Swarm是Docker公司在2014年12月初发布的一套较为简单的工具,用来管理Docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机。Swarm使用标准的Docker API接口作为其前端访问入口,换言之,各种形式的Docker Client(docker client in go, docker_py, docker等)均可以直接与Swarm通信。
  • Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受docker客户端发送过来的请求,调度适合的节点来运行容器,这意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,当Swarm重新恢复运行之后,它会收集重建集群信息
  • 下面是Swarm的结构图

在这里插入图片描述

  • swarm集群
    使用的是docker自带的swarm mode,也就是docker集群的管理和编排。所谓的编排就是指多台集群的管理, 主机的配置,容器的调度等。
    swarm mode是docker engine中自带的一种模式,很容易使用,并且无须安装其他的软件。 在使用swarm mode的时候,几台主机上都要先安装好docker。

二、swarm集群的搭建

实验环境:(安装docker并开启)

  • docker1:172.25.79.1 swarm
  • docker2: 172.25.79.2 node
  1. 在docker1上做初始化
[root@docker1 ~]# docker swarm init
Swarm initialized: current node (onmfjan5xiq2ek6vf6oalpvqp) is now a manager.

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

    docker swarm join --token SWMTKN-1-4sryx0i44mb46qyb1sbfjm62fask1rfqf3jbze2sp8uccpe8f5-dzz2ltd01e5kldf4puhu09s9s 172.25.19.1:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
##注意:在当前主机上启动swarm模式,要保存初始化后token,因为在节点加入时要使用token作为通讯的密钥
  1. docker1和docker2加入swarm集群中
[root@docker2 ~]# docker swarm join --token SWMTKN-1-4sryx0i44mb46qyb1sbfjm62fask1rfqf3jbze2sp8uccpe8f5-dzz2ltd01e5kldf4puhu09s9s 172.25.19.1:2377
 [root@docker3 ~]# docker swarm join --token SWMTKN-1-4sryx0i44mb46qyb1sbfjm62fask1rfqf3jbze2sp8uccpe8f5-dzz2ltd01e5kldf4puhu09s9s 172.25.19.1:2377
- 查看节点状态
[root@server1 ~]# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
o4abf7l821zrls2aa1m4cj7pu    server3   Ready   Active        
u5mihispcziw1svmyjh9jx9g2 *  server1   Ready   Active        Leader
zrkp0dz7mzef7f6f5j08ec0c1    server2   Ready   Active 
  1. 都导入nginx镜像
[root@docker1 ~]# docker load -i nginx.tar 
[root@docker2 ~]# docker load -i nginx.tar 
[root@docker3 ~]# docker load -i nginx.tar 
  1. 部署一个服务群集
[root@docker1 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
9899107ae90e        bridge              bridge              local
076f11525d73        docker_gwbridge     bridge              local
3281f4c216de        host                host                local
i47byuadtg61        ingress             overlay             swarm
6b89c5ac48c1        none                null                local

[root@docker1 ~]# docker network create -d overlay my_net1
a8gg980w0j9s5ilmsffms9sbw

##在manager节点部署nginx服务,服务数量为3个 ,使用nginx镜像
[root@docker1 ~]# docker service create --name web --network my_net1 publish 80:80 --replicas 30 nginx

[root@docker1 ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
ey3kgh65bp2g        web                 replicated          3/3                 nginx:latest        *:80->80/tcp
  1. 编写测试页面
[root@docker1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                NAMES
8b6c0052888f        nginx:latest        "nginx -g 'daemon of…"   About a minute ago   Up About a minute   80/tcp               web.2.6x5cwmlgodu8v5yx5961nry80
[root@docker1 ~]# vim index.html
server1
[root@docker1 ~]# docker cp index.html 8b6c0052888f:/usr/share/nginx/html

##docker2,docker3同理
  1. 测试负载均衡( 测试的时候把真机火墙关掉 )
[root@server1 ~]# for i in {1..10}; do curl 172.25.79.1; done
server3
server3
server2
server1
server2
server1
server3
server3
server2
server1
[root@server1 ~]# docker service ps nginx
ID            NAME     IMAGE  NODE     DESIRED STATE  CURRENT STATE           ERROR  PORTS
j939nrzgr8do  nginx.1  nginx  server3  Running        Running 9 seconds ago          
st431kqieqod  nginx.2  nginx  server1  Running        Running 10 seconds ago         
tr263kopgsbo  nginx.3  nginx  server2  Running        Running 9 seconds ago  
  1. 添加 6 个nginx 服务
[root@server1 ~]#  docker service scale nginx=6
unable to pin image nginx to digest: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io on 114.114.114.114:53: read udp 172.25.79.1:37142->114.114.114.114:53: i/o timeout
nginx scaled to 6

##查看有6个nginx 进程是 Running :
[root@server1 ~]# docker service ps nginx
ID            NAME     IMAGE  NODE     DESIRED STATE  CURRENT STATE            ERROR  PORTS
j939nrzgr8do  nginx.1  nginx  server3  Running        Running 3 minutes ago           
st431kqieqod  nginx.2  nginx  server1  Running        Running 3 minutes ago           
tr263kopgsbo  nginx.3  nginx  server2  Running        Running 3 minutes ago           
zryz1niphg19  nginx.4  nginx  server1  Running        Preparing 6 seconds ago         
6mwqzfqg8f8o  nginx.5  nginx  server2  Running        Preparing 5 seconds ago         
x3ci0tq8ldh4  nginx.6  nginx  server3  Running        Preparing 5 seconds ago 
  • 添加监控
  1. 导入镜像并创建监控
[root@docker1 ~]# docker load -i visualizer.tar 
[root@docker1 ~]# docker load -i nginx.tar
[root@docker1 ~]# docker service create \
  --name=viz \
  --publish=8080:8080/tcp \
  --constraint=node.role==manager \
  --mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
  dockersamples/visualizer
  1. 查看监控和节点是否在线
[root@server1 docker]#  docker service ls
ID            NAME   MODE        REPLICAS  IMAGE
4cqg0b6nwe44  nginx  replicated  6/6       nginx
vydqo176ak6p  viz    replicated  1/1       dockersamples/visualizer
##注意:开启viz服务慢,需要不断刷新等待建立完成,出现1/1才成功
  1. 浏览器:输入172.25.19.1:8080,可以看到6个nginx的进程被平均分在了三台机子上
    在这里插入图片描述
  • 滚动更新
  1. 重新添加一个镜像
[root@docker1 ~]# docker load -i rhel7.tar 
[root@docker1 ~]# docker service update --image rhel7:v1 --update-delay 5s --update-parallelism 1 web     ##每隔五秒更新,每次更新一个机子

##docker  ps -aq | wc -l  ##可看到每个机子上开启了多少个(一般都是平均)
  1. 浏览器的监控镜像由nginx变成了rhel7
    在这里插入图片描述
  • 测试高可用
  • 此时是在只有3个进程的基础上测试的
  1. 停掉一个node:
[root@docker2 share]# systemctl stop docker
  1. 此时的负载均衡就在server1和server3主机上实现
[root@docker1 ~]# for i in {1..10}; do curl 172.25.79.1; done
docker3
docker1
docker3
docker1
docker3
docker1
docker3
docker1
docker3
docker1
  1. 浏览器的监控显示server2故障,并且6个nginx进程被平均分到docker1和docker上
    在这里插入图片描述
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐