『高级篇』docker之DockerSwarm的集群环境搭建(28)
2019-02-14 10:49:26
李明
  • 访问次数: 382
  • 注册日期: 2018-07-09
  • 最后登录: 2022-11-17

原创文章,欢迎转载。转载请注明:转载自 IT人故事会 ,谢谢!原文链接地址: 『高级篇』docker之DockerSwarm的集群环境搭建(28) 上次了解了docker Swarm,这次一起动手操作,搭建swarm的集群环境,一起测试下三种环境下的服务发现和负载均衡,一个自定义下的overlay下的网络发现,一个Ingress下的服务发现,一个是Ingress+link下的,跟上次Mesos一样我们先建立三台服务虚拟机。 源码: https://github.com/limingios/msA-docker swarm分支


v2-0209e1ba9b378449cea1f7a539df0540_b.pn


server01

docker运行状态,切换到root用户

docker version


v2-5f832049e9ab824063ada696975f7bd0_b.pn


默认情况下network的结构

docker network ls


v2-30a07341c2383b67b67632c004666b0d_b.pn


查看ip地址

ifconfig


v2-c128f810341dd42cd088881e3654f841_b.pn


设置manager,初始化manager节点,添加一个work在swarm上,运行下面的命令可以添加work,加入到这个manage中。

docker swarm init --advertise-addr 192.168.66.101


v2-69def5db14828a540362ab37d40f6226_b.pn


server02

执行添加到manager的命令。


v2-bef90135eb3d4df940d3849dd1d9412f_b.pn


server03

执行添加到manager的命令。


v2-fc77199d033280abb9fd76fdaabaeac3_b.pn


在server01中添加了server02 和server03的work后,查看网络

之前是只有三个,一个bridge,一个host,一个none;多了个docker_gwbridge,一个ingress。ingress的overlay网络,这个网络需要借助docker-gwbridge这个网桥进行连接。如果是

docker network ls


v2-6af1937908630b675e9a87d011d6570b_b.pn


docker swarm的如何高可用

目前的manager只有一个,如果manager节点挂了,这个集群也就挂了。docker swarm 有高可用的状态,就是将server02 和server03 ,manager节点本身也可以提供服务运行的状态,即便我们三个节点都是manager也是可以运行服务的。现在把三个节点都变成manager节点试一下。

docker node ls


v2-e083ea2d04a4fde835cb6f5ae119dea2_b.pn


升级server02成为manager。变成了Reachable,这个跟zookeeper的原理是一样的,当一个leader挂了之后,通过选取可以产生一个新的leader。

docker node promote docker-swarm-02
docker node promote docker-swarm-03


v2-a18d390257a49a6bdd62f712ea7abb77_b.pn



v2-3dc36580252e22bae2f163fa68304ecf_b.pn


PS:以上就完成高可用的docker swarm的集群环境,其实真心比其他的简单。

测试集群环境

  • 小的镜像测试

创建一个小的镜像,完成ping www.baidu.com

docker service create --name test1 alpine ping www.baidu.com
docker service ls


v2-486dd211d7c64fd634b8ce60b1a8348d_b.pn


docker service logs test1


v2-1456a5a9aa06e6756e34aaf3dd3a21ff_b.pn


  • nginx的环境测试

docker service create --name nginx nginx
docker service ls


v2-a4d883797c67e3c87753342becbe9b0f_b.pn


曾经有老铁问我,如果是容器创建了需要修改创建时候的配置怎么办,我告诉他想给当前容器做个tag打成一个镜像A,然后通过镜像A,生成新的一个新的容器在run里增加你的配置,记住前提是要把原来的容器删除。对于docker swarm中的service 难道也需要删除?其实不需要直接通过docker service update来完成。

docker service ls
docker service update --publish-add 8080:80 nginx
docker service ls


v2-bb7b6a347f77ef9b28e9dc3199f42d2f_b.pn


现在的nginx 太少了只有1个,如果挂了,还要打电话让人解决。其实还是有办法的。多起几个。可以多等一会,时间就不紧急了,吃了饭再过去。

docker service scale nginx=3
docker service ls


v2-c7992d21681e60baa2b6761424525280_b.pn



v2-e13b4bd29ba4d03c4dcf678ca96d156a_b.pn


  • 默认使用的Ingress下的overlay网络,两个service之前是无法通过service的名称进行访问的。可以试试。

自定义网络添加到docker swarm中。

  • 删除刚才创建nginx 和test1

docker service rm nginx test1


v2-6ce3e709faebad54ca7eb33106fb6cec_b.pn


  • 创建网络

docker network create -d overlay idig8-overlay


v2-3c9a8a5ac28d3c49b3f86b35d91efb84_b.pn


  • 创建一个service指定网络

nginx

docker service create --network idig8-overlay --name nginx -p 8080:80 nginx

alpine

docker service create --network idig8-overlay --name alpine alpine ping www.baidu.com


v2-f5bab95b7df604d48955c97a595daa6f_b.pn


  • 查看alpine所在的机器,进入容器,ping nginx

查看是在server02这台机器上。

docker service ps alpine


v2-cf10c6c33c0b94c94e29213764b2905a_b.pn


进入server02机器,ping 容器名称是nginx的 发现可以ping通

docker ps
docker exec -it 387dd735de74 sh
ping nginx


v2-375b505a2839e1ce32dbbd1a6285de1e_b.pn



v2-39964e9e2e44a412bfbd8549473eaba3_b.pn


PS:当前的网络Ingress,容器之间的访问方式可以通过名字访问。在自定义的网络下swarm每个service,都创建一个dnsadress,一定要是自定义的overlay的。

  • dnsrr的方式

描述是参数不对,在dnsrr下不能开放端口的,他们之间是冲突的。dnsrr是给只通过名字访问。如果不加入overlay的网络它就是独立的。

docker service create --name nginx-b --endpoint-mode dnsrr -p  8090:80 nginx


v2-374aa79ac23fd050e7a76e78bddebb8c_b.pn


如果想dnsrr网络可以被访问,可以针对这个service增加overlay的网络

docker service updata --network-add idig8-overlay nginx-b
  • docker stack

单机模式下,我们可以使用 Docker Compose 来编排多个服务,而在Docker Swarm 通过 Docker Stack 我们只需对已有的 docker-compose.yml 配置文件稍加改造就可以完成 Docker 集群环境下的多服务编排。

version: "3.4"
services:
  alpine:
    image: alpine
    command:
      - "ping"
      - "www.baidu.com"
    networks:
      - "idig8-overlay"
    deploy:
      replicas: 2
      restart_policy:
        condition: on-failure
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
    depends_on:
      - nginx
  nginx:
    image: nginx
    networks:
      - "idig8-overlay"
    ports:
      - "8080:80"
networks:
  idig8-overlay:
    external: true


v2-3dce2d31b9c3709384fa4b3936397da1_b.pn


查看stack的命令,上边走的是vip负载均衡的方式而不是dnsrr的方式。

docker stack ls
# -c 文件名 组名
docker stack deploy -c service.yml  test


v2-e698a8335214c1c7793c3971d3fba733_b.pn



v2-9244bc54c7830718fb9b1abe0b7b2b02_b.pn



v2-7bd0fc0ddff5e31a044bd24ccbbeffb7_b.pn


PS:dockerSwarm的服务发现,负载均衡。


v2-5e0719d9fc7dd03ce32e624534c0b631_b.pn