docker swarm auto scale

1. 主旨介紹

使用mac和fusion vm兩臺主機搭建一個小的docker集羣, 採用docker swarm方式搭建. Swarm基本概念:

  • manager:用來管理swarm服務
  • node: docker enginer節點, 通過manager可以在node上操作, manager本身也是node
  • worker: 非管理的node, 一般是實際部署和運行container的docker節點

目的是是探索使用swarm完成動態伸縮的可行性.

2. 操作步驟

  • swarm init(vm中操作,因爲docker for mac有網絡問題 manager)

    docker swarm init --advertise-addr 192.168.132.148
    Swarm initialized: current node (b1uem2hg4y2ojnauvre3x2rdw) is now a manager.
    
    To add a worker to this swarm, run the following command:
    
        docker swarm join --token SWMTKN-1-1snrbxsenp4v1npcusox9l3n9jzsa4n8jbkvlhjc19e3z89c8a-7vfrbr1o1e1sr2g2r6f97xhne 192.168.132.148:2377
    
    To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
    

    初始化swarm之後可以使用docker node ls查看信息:

    docker node ls
    ID                            HOSTNAME                STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
    b1uem2hg4y2ojnauvre3x2rdw *   linuxkit-025000000001   Ready               Active              Leader              18.06.1-ce            18.06.1-ce
    
  • join node(worker)

    docker swarm join --token SWMTKN-1-3h1rzm2cdu6ms935f6kysy4rhzs54mqofnhr1thlwu0fiewqfq-9q6fwc7eqk70zwb1kwi2vdklj 192.168.132.148:2377
    This node joined a swarm as a worker.
    
  • deploy service 部署一個alpine容器, 運行ping命令視爲內部服務

    docker service create --replicas 1 --name helloword alpine ping docker.com
    vyw5nezmiv37j3fk5kgu4231x
    overall progress: 1 out of 1 tasks 
    1/1: running   [==================================================>]
    

    查看結果如下, 可以發現一個alpine被部署到worker節點(vm是manager機器名是unbuntu所以下面的linuxkit-xxxx是worker, 即mac server)

    docker service ps helloword
    ID                  NAME                IMAGE               NODE                    DESIRED STATE       CURRENT STATE           ERROR               PORTS
    ht9npghzzux9        helloword.1         alpine:latest       linuxkit-025000000001   Running             Running 4 minutes ago 
    
  • scale service 橫向擴展服務爲2個實例

    docker service scale helloword=2
    helloword scaled to 2
    overall progress: 1 out of 2 tasks 
    1/2: running   [==================================================>] 
    overall progress: 2 out of 2 tasks 
    1/2: running   [==================================================>] 
    2/2: running   [==================================================>] 
    verify: Service converged 
    

    查看擴展的結果如下, 可以發現兩個實例被部署到worker和manager, 因爲worker不夠用, 所以使用了manager, 也可以設置manager只是管理, 不運行task

    docker service ps helloword
    ID                  NAME                IMAGE               NODE                    DESIRED STATE       CURRENT STATE            ERROR               PORTS
    ht9npghzzux9        helloword.1         alpine:latest       linuxkit-025000000001   Running             Running 5 minutes ago                        
    v0i6ghtx8eed        helloword.2         alpine:latest       ubuntu                  Running             Running 26 seconds ago
    

3. 總結

使用swarm集羣可以優雅的進行docker部署和擴展, 結合docker-compose操作會更加方便, 如果增加了產線的流量監控+服務發現, 就可以實現產線環境的動態伸縮部署, 很棒!!

4. 問題和解答

  • unavailable desc = all SubConns are in TransitentFailure

    這個問題以爲manager是mac, docker for mac 因爲網絡的問題不能支持work去鏈接到mac docker swarm manager

  • Error response from daemon: manager stopped: failed to listen on remote API address: listen tcp 10.0.1.34:2377: bind: cannot assign requested address

    這是因爲指定了 --listen-addr和--advertise-addr ip一樣但是端口默認也是一直的, 去除listen-addr或者指定不同的端口即可

  • 結束swarm

    在manager服務器運行: docker swarm leave --force, 這樣manager就變成inactive了, 可以重新操作執行init或者其他

5. 參考資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章