docker swarm 集群搭建和臫servoce对服务扩容

层次关系

docker 用来搭建容器,一个个容器自己搭建累,
docker-compose 来批量运行容器,形成一个项目,项目需要高可用,需要集群化
docker swarm来对docker集群进行编排管理的,后期用k8s代替swarm,基本十台左右的集群 没必要用k8s,用swarm也可以.

ca          Display and rotate the root CA  #显示swarm的证书
init        Initialize a swarm
      --advertise-addr string                  Advertised address (format: <ip|interface>[:port])   给swarm添加一个Ip(这里可以选私网也可以选公网,私网流量免费)
      --autolock                               Enable manager autolocking (requiring an unlock key to start a stopped manager)
      --availability string                    Availability of the node ("active"|"pause"|"drain") (default "active")
      --cert-expiry duration                   Validity period for node certificates (ns|us|ms|s|m|h) (default 2160h0m0s)
      --data-path-addr string                  Address or interface to use for data path traffic (format: <ip|interface>)
      --data-path-port uint32                  Port number to use for data path traffic (1024 - 49151). If no value is set
                                               or is set to 0, the default port (4789) is used.
      --default-addr-pool ipNetSlice           default address pool in CIDR format (default [])
      --default-addr-pool-mask-length uint32   default address pool subnet mask length (default 24)
      --dispatcher-heartbeat duration          Dispatcher heartbeat period (ns|us|ms|s|m|h) (default 5s)
      --external-ca external-ca                Specifications of one or more certificate signing endpoints
      --force-new-cluster                      Force create a new cluster from current state
      --listen-addr node-addr                  Listen address (format: <ip|interface>[:port]) (default 0.0.0.0:2377)
      --max-snapshots uint                     Number of additional Raft snapshots to retain
      --snapshot-interval uint                 Number of log entries between Raft snapshots (default 10000)
      --task-history-limit int                 Task history retention limit (default 5)


join        Join a swarm as a node and/or manager
      --advertise-addr string   Advertised address (format: <ip|interface>[:port])
      --availability string     Availability of the node ("active"|"pause"|"drain") (default "active")
      --data-path-addr string   Address or interface to use for data path traffic (format: <ip|interface>)
      --listen-addr node-addr   Listen address (format: <ip|interface>[:port]) (default 0.0.0.0:2377)
      --token string            Token for entry into the swarm

join-token  docker swarm join-token [OPTIONS] (worker|manager)  显示加入管理节点或者工作节点的令牌
	 -q, --quiet    Only display token
	 --rotate   Rotate join token

leave       Leave the swarm
unlock      Unlock swarm
unlock-key  Manage the unlock key
update      Update the swarm

swarm 节点 分管理节点(Manager)和工作节点(Worker)

只有manager才能进行操作配置,manager之间相互通信相互管理,manager控制worker,但是worker不能控制manager
swarm 根据Raft算法一致性,需要至少3个管理节点运行集群服务才能正常运行

swarm的命令如下

这里要清楚一点 集群就是多台服务器,如果按照三主三从的原则,就是6台服务器, 那么假如第一台服务器,私网ip为172.18.0.2
那么docker swarm init --advertise-addr 172.18.0.2 就会把这台服务器创建成管理节点的master,另外可以通过提示得到加入工作节点和新增管理节点的命令

第二台机器粘贴 docker swarm join --token SWMTKN-1-2rv9be2a6dfyodnbp4p954ya40ai6jl2h5qu6m4duc1zd9iged-91nqungv5xgu3u5lfo4y3sdq7 172.18.0.2:2377 就会变成工作节点
通过docker node ls可以看到有leader标识为管理节点

同时在第一台管理节点上 通过打印docker swarm join-token worker/manager,会显示加入管理和工作节点的命令,再其他的服务器粘贴即可加入对应节点

docker swarm join-token worker
    docker swarm join --token SWMTKN-1-2rv9be2a6dfyodnbp4p954ya40ai6jl2h5qu6m4duc1zd9iged-91nqungv5xgu3u5lfo4y3sdq7 172.18.0.2:2377
docker swarm join-token manager
To add a manager to this swarm, run the following command:
    docker swarm join --token SWMTKN-1-2rv9be2a6dfyodnbp4p954ya40ai6jl2h5qu6m4duc1zd9iged-2371e8napgmtn05v8bqkrannm 172.18.0.2:2377

reachable和leader都是管理节点, reachable算是leader的备份管理节点,一旦leader崩溃,reachable节点会升为leader,而leader重新上线后会变为reachable

Raft协议 集群可用,至少要3个主节点,集群在Raft协议下运行的前提是 至少要>1台的管理节点存活.

swarm leave 如果要把工作节点改成管理节点,可以先用leave命令,然后生成加入管理节点的令牌

对任何一个节点使用了 leave就意味着离开集群,过一会集群中 docker node ls命令会看到显示down

swarm 的网络模式 PublishMode,ingress,Overlay

Overlay: 4台服务器的集群,会有4个ip,内部的容器也无法ping通,通过Overlay模式会把4台主机加入到一个大的虚拟网络中,这样他们彼此之间可以相互访问
ingress: Overlay的加强版,具有负载均衡的功能
看下面的docker service 起来的服务,一台机子上运行了5个tomcat服务

5个服务并到了一个A类的内网网段中去了.

docker service

swarm形成的集群提供了服务的概念,但是他的优点还在于扩容便捷.比如平时三主三从,突然访问量变大需要扩容到五主五从,那么可以通过创建服务副本的概念瞬间扩容,这里就需要用到docker service
service的大致命令如下

Commands:
  create      Create a new service                                  增  --mode string replicated, global, replicated-job, or global-job) (default "replicated")
  创建的任务以何时模式启动,默认是副本模式,只在服务的副本里运行启动,global是不分副本还是原生,随机都可以启动
  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 ----replicas功能一样,用来扩容和缩容服务副本
  update      Update a service                                     改  --replicas uint   用来创建副本个数

启动一个docker service 语法:docker service create -p 8080:8081 --name sql mysql:5.7
语法其实和docker run 一模一样 镜像不存在也会自动去拉镜像
而docekr run启动的容器无法扩缩容器的功能,所以如果想要扩缩容器,启动的时候要用docker service, 因为他启动的是一种服务的概念而不是容器

docker service update --replicas 10 mysql:5.7 这条命令会让主从机器上运行10个mysql的容器服务,默认分配是几台服务器机子随机分配,

要缩容也方便, docker service update --replicas 1 mysql:5.7 就把10个缩成了1个
还可以用docker service scale mysql=5 语法也可以实现服务副本的扩容缩容

原文地址:https://www.cnblogs.com/Young-shi/p/15027905.html