天天看點

docker swarm練手

swarm就不多說了,官網有介紹

https://docs.docker.com/engine/swarm/

下面是我根據官網的做的一些筆記,供自己以後翻看,大神勿噴

1、建立swarm [r[email protected] ~]# docker swarm init --listen-addr 192.168.1.7:2377

2、在node上添加worker和manager [[email protected] ~]# docker swarm join \     --token SWMTKN-1-0pzork4xouglxzu1yismyz6uckgb3dlcttec1xbchhu787cj5u-8r1zi8eboxgq7xxlovw20hbsx \     192.168.1.7:2377 在高可用環境下,我們得為叢集添加至少三個(奇數個manager),MANAGER同樣也能執行任務

上面的token隻能添加worker節點,現在生成MANAGER的token [[email protected] ~] docker swarm join-token manager To add a manager to this swarm, run the following command:

    docker swarm join \     --token SWMTKN-1-0pzork4xouglxzu1yismyz6uckgb3dlcttec1xbchhu787cj5u-4y1r9wn6c50n4i0915ylbrufz \     192.168.1.7:2377

在其他節點上執行上面輸出的指令就可以将節點添加為MANAGER角色,當主不可用時,參與投票,保證叢集的高可用 原來是:

docker swarm練手

将另外兩個節點以manager角色添加後:

docker swarm練手

關于 MANAGER STATUS的解釋: 1、空:表示不參與群組管理的工作節點。---工作節點 2、leader:意味着節點是對叢集進行所有群體管理和編排決策的主要管理器節點。---上司節點 3、reachable:意味着節點是參與投票的管理節點。 如果上司節點不可用,則該節點有資格被選為新的上司者。---備用上司節點 4、unavailable:意味着節點是無法與其他管理者通信的管理者。 如果管理者節點變得不可用,您應該将一個新的管理者節點加入群集,或者将一個工作節點提升為管理者。

3、建立服務 [[email protected] ~]# docker service create --replicas 2 --name helloworld alpine ping docker.com

4、檢視你建立的服務 [[email protected] ~]# docker service ls ID            NAME        MODE        REPLICAS  IMAGE tfsglpoo1gdq  helloworld  replicated  2/2       alpine:latest

5、審查服務 [[email protected] ~]# docker service inspect --pretty helloworld ID:        tfsglpoo1gdqihk1bzetnvzj1 Name:        helloworld Service Mode:    Replicated  Replicas:    2 Placement: UpdateConfig:  Parallelism:    1  On failure:    pause  Max failure ratio: 0 ContainerSpec:  Image:        alpine:[email protected]:58e1a1bb75db1b5a24a462dd5e2915277ea06438c3f105138f97eb53149673c4  Args:        ping docker.com Resources: Endpoint Mode:    vip [[email protected] ~]#

6、使用docker service ps <SERVICE-ID>檢視服務運作在哪個節點上 [[email protected] ~]# docker service ps helloworld ID            NAME              IMAGE          NODE            DESIRED STATE  CURRENT STATE          ERROR                      PORTS ay4192cdqxvh  helloworld.1      alpine:latest  server          Running        Running 8 minutes ago                              vku5p66pdlbv   \_ helloworld.1  alpine:latest  viroyal-ubuntu  Shutdown       Failed 8 minutes ago   "task: non-zero exit (1)"  i5qz8vppvn6r   \_ helloworld.1  alpine:latest  viroyal-ubuntu  Shutdown       Failed 8 minutes ago   "task: non-zero exit (1)"  fcp189dtgl19   \_ helloworld.1  alpine:latest  viroyal-ubuntu  Shutdown       Failed 9 minutes ago   "task: non-zero exit (1)"  gipphcz9jqld   \_ helloworld.1  alpine:latest  viroyal-ubuntu  Shutdown       Failed 9 minutes ago   "task: non-zero exit (1)"  sxsa8x3pe6x0  helloworld.2      alpine:latest  server          Running        Running 9 minutes ago                              [[email protected] ~]#

7、擴充服務  Scale service [[email protected] ~]# docker service scale helloworld=6 helloworld scaled to 6

[[email protected] ~]# docker service ps helloworld ID            NAME              IMAGE          NODE            DESIRED STATE  CURRENT STATE           ERROR                      PORTS ay4192cdqxvh  helloworld.1      alpine:latest  server          Running        Running 10 minutes ago                              vku5p66pdlbv   \_ helloworld.1  alpine:latest  viroyal-ubuntu  Shutdown       Failed 10 minutes ago   "task: non-zero exit (1)"  i5qz8vppvn6r   \_ helloworld.1  alpine:latest  viroyal-ubuntu  Shutdown       Failed 10 minutes ago   "task: non-zero exit (1)"  fcp189dtgl19   \_ helloworld.1  alpine:latest  viroyal-ubuntu  Shutdown       Failed 10 minutes ago   "task: non-zero exit (1)"  gipphcz9jqld   \_ helloworld.1  alpine:latest  viroyal-ubuntu  Shutdown       Failed 11 minutes ago   "task: non-zero exit (1)"  sxsa8x3pe6x0  helloworld.2      alpine:latest  server          Running        Running 10 minutes ago                              zwzokl53lj3l  helloworld.3      alpine:latest  server          Running        Running 17 seconds ago                              ip0smw10aaqh  helloworld.4      alpine:latest  viroyal-ubuntu  Running        Running 10 seconds ago                              qn8poyny1k4z  helloworld.5      alpine:latest  viroyal-ubuntu  Running        Running 9 seconds ago                              jw51jivjuu31  helloworld.6      alpine:latest  viroyal-ubuntu  Running        Running 9 seconds ago

8、删除service $docker service rm helloworld

9、滾動更新 $docker service create --replicas 3 --name redis --update-delay 10s --update-parallelism 1 redis:3.0.6

$docker service update --image redis:3.0.7 redis

--update-parallelism标簽配置服務中同步更新的任務數量. --update-delay标簽配置一個服務任務或一系列任務更新的時延.

10、node下線

有些時候需要維護一個節點,此時此節點可能會網絡斷開或者需要關機,造成節點上服務可用。使用 docker node update --availability drain <NODE-ID>将節點下線,swarm會将目前節點上的容器關閉并在其他節點上啟動。 當維護完成,需要上線時,将節點狀态修改為active狀态即可,指令如下:docker node update --availability active <NODE-ID>

11、在Swarm叢集中建立overlay網絡 docker network create \    --driver overlay \    --subnet 10.0.9.0/24 \    my-network

   --subnet指令行參數指定overlay網絡使用的子網網段。建立完成後使用docker network ls檢視建立的網絡:

将服務連接配接到overlay網絡 在建立服務時可以通過--network參數将服務連接配接到某個網絡:

docker service create \    --replicas 3 \    --name my-web \    --network my-network \    nginx

docker service inspect \    --format='{{json .Endpoint.VirtualIPs}}' \    my-web

加入my-network網絡的容器彼此之間可以通過IP位址通信,也可以通過名稱通信。

使用swarm模式的服務發現

預設情況下,當建立了一個服務并連接配接到某個網絡後,swarm會為該服務配置設定一個VIP。此VIP根據服務名映射到DNS。在網絡上的容器共享該服務的DNS映射,是以網絡上的任意容器可以通過服務名通路服務。

在同一overlay網絡中,不用通過端口映射來使某個服務可以被其它服務通路。Swarm内部的負載均衡器自動将請求發送到服務的VIP上,然後分發到所有的active的task上。 下面的執行個體展示了在同一個網絡中添加了一個busybox服務,此服務可以通過名稱my-web通路前面建立的nginx服務:

在manager節點上,部署一個busybox服務到與my-web服務相同的網絡中,也就是my-network中:

docker service create \    --name my-busybox \    --network my-network \    busybox \    sleep 3000 3rdnz62u2n8d916d5zxbo9lax

https://andyyoung01.github.io/2016/11/26/%E5%9F%BA%E4%BA%8ESwarm%E7%9A%84%E5%A4%9A%E4%B8%BB%E6%9C%BA%E5%AE%B9%E5%99%A8%E7%BD%91%E7%BB%9C/

12、檢查叢集manager和worker的狀态

MANAGER節點: docker node inspect server  --format "{{ .ManagerStatus.Reachability }}"

docker swarm練手

worker節點: docker node inspect server  --format "{{ .Status.State }}"

docker swarm練手

我們這台伺服器,既是manager,也是worker節點

如果MANAGER節點挂了,我們通過如下操作來恢複: 1、重新開機docker daemon 2、重新開機機器 3、如果以上都不行的話      - 将其他的worker節點提升為manager      - 清除目前失敗的manager節點            docker node demote <NONE>           docker node rm <id-node>

docker swarm練手

一個節點無法使用、無法響應,需要删除的時候,如果docker node rm報錯

docker swarm練手

加上--force即可

docker node rm --force node9

13、備份swarm

資料目錄 /var/lib/docker/swarm/

1、如果swarm開啟了auto-lock,那麼在恢複備份啟動叢集的時候,你需要秘鑰 2、在manager上停止docker,然後備份,雖然可以熱備,但是不建議這麼做,可能會導緻資料的不一緻 3、備份 /var/lib/docker/swarm/ 檔案夾 4、重新開機manager

14、恢複swarm

1、關閉docker 2、删除/var/lib/docker/swarm下所有的檔案 3、将備份的檔案還原到此目錄下 4、啟動docker,并且重新初始化swarm,防止它作為node加入别的叢集 docker swarm init --force- new -cluster 5、确認你的叢集資訊      docker sercvice ls 6、如加鎖,請解鎖 7、加入manager和worker節點 8、恢複以前的備份方案

15、從失去投票中恢複

群組可以忍受多達(N-1)/ 2個永久性故障,超出了無法處理涉及群管理的請求。 例如,在有5名經理的群體中,至少3名必須運作并互相溝通。 這些類型的故障包括資料損壞或硬體故障。 如果你失去了經理的數量,你就不能管理這個群。如果您已經失去了法定人數,并嘗試對群組執行任何管理操作,則會發生錯誤:

Error response from daemon: rpc error: code = 4 desc = context deadline exceeded

從失去法定人數恢複的最佳方法是将失敗的節點重新聯機。 如果不能這樣做,則從此狀态恢複的唯一方法是使用管理器節點的--force-new-cluster操作。 這将除去運作該指令的管理器之外的所有管理器。 實作法定人數是因為現在隻有一名經理。 促進節點成為管理者,直到您擁有所需數量的管理者。

docker swarm init --force- new -cluster --advertise-addr node01: 2377

16、強制swarm重新負載均衡

當您向群集添加新節點時,或者節點在不可用後重新連接配接到叢集,叢集不會自動向空閑節點配置設定任務。這是設計決定的。如果叢集為了平衡而将任務定期地轉移到不同的節點,則使用這些任務的用戶端将被中斷。目的是避免擾亂運作的服務,以便在整個群組中實作平衡。當新任務啟動時,或當具有運作任務的節點變得不可用時,這些任務被賦予較不繁忙的節點。目标是最終平衡,最終對最終使用者的影響最小。

在Docker 1.13及更高版本中,您可以使用-force或-f标志與docker service update指令強制服務在可用的工作節點之間重新配置設定其任務。 這将導緻服務任務重新啟動。用戶端應用程式可能會中斷。如果您已配置,您的服務将使用滾動更新。

喜歡運維技術可以加這個群一起讨論devops技術  293342374