Swarm資源管理
Swarm是Docker官方提供的一款集羣管理工具,其主要作用是把若干臺Docker主機抽象爲一個整體,並且通過一個入口統一管理這些Docker主機上的各種Docker資源。Swarm和Kubernetes比較類似,但是更加輕,具有的功能也較kubernetes更少一些。
Swarm的基本架構如下圖所示
這個圖作爲一個整體實際上都處於一個所謂的集羣中,它可能對應了一到多臺的實際服務器。每臺服務器上都裝有Docker並且開啓了基於HTTP的DockerAPI。這個集羣中有一個SwarmManager的管理者,用來管理集羣中的容器資源。管理者的管理對象不是服務器層面而是集羣層面的,也就是說通過Manager,我們只能籠統地向集羣發出指令而不能具體到某臺具體的服務器上要幹什麼(這也是Swarm的根本所在)。至於具體的管理實現方式,Manager向外暴露了一個HTTP接口,外部用戶通過這個HTTP接口來實現對集羣的管理。對於稍微大一點的集羣,最好是拿出一臺實際的服務器作爲專門的管理者,作爲學習而言,也可以把管理者和被管理者放在一臺服務器上。
構建swarm集羣和節點
啓動一個swarm集羣
docker swarm init --listen-addr 172.16.218.146:8888 --advertise-addr 172.16.218.146
- –listen-addr指出的是這個集羣暴露給外界調用的HTTPAPI的socket地址。
- –advertise-addr如果你的Docker主機有多個網上,擁有多個IP,必須使用—advertise-addr指定IP。
命令執行成功會提示一串類似於這樣的信息
docker swarm join --token SWMTKN-1-4exqiy0mat3d1sy7yff3cdqr1h8huz88tng253bj7id3tttlfk-e5dns1ykhe74pllubpvy4vrv6 172.16.218.146:8888
爲方便下面稱管理者角色的機器爲Master,另兩臺爲Node1、Node2。
在Node1,Node2執行了上面這個命令後,在Master上執行命令docker node ls
列出Docker節點信息
[root@k8s-master ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
qs3re8fwfadofgamifcm1w1dt * k8s-master Ready Active Leader 18.06.3-ce
tsrjx3bxnykmi41vddwkcl4vf k8s-node1 Ready Active 18.06.3-ce
gzfsco0lufbf7bvpiikfu8wvd k8s-node2 Ready Active 18.06.3-ce
構建服務
docker service create --replicas 1 --name swarmTomcat consol/tomcat-7.0:latest
- docker service create創建服務
- –replicas參數指出希望保持這個服務始終有多少容器在運行
- –name參數指定的是服務的名字而非容器的名字
查看swarmTomcat這個service的各個容器到底在哪個節點運行且運行狀態如何。
[root@k8s-master ~]# docker service ps swarmTomcat
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
vlwlvfp35lny swarmTomcat.1 consol/tomcat-7.0:latest k8s-master Running Running 25 seconds ago
容器擴展
[root@k8s-master ~]# docker service scale swarmTomcat=3
swarmTomcat scaled to 3
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3: running [==================================================>]
verify: Service converged
docker service scale swarmTomcat=3,可以將服務現有的replica爲1的狀態擴展到3,期間已經啓動的容器不受影響。
此時再查看swarmTomcat這個服務的節點信息及狀態
[root@k8s-master ~]# docker service ps swarmTomcat
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
vlwlvfp35lny swarmTomcat.1 consol/tomcat-7.0:latest k8s-master Running Running 38 minutes ago
kpf4vo0h7ff0 swarmTomcat.2 consol/tomcat-7.0:latest k8s-node2 Running Running 2 minutes ago
i4nwm9bvpnjt swarmTomcat.3 consol/tomcat-7.0:latest k8s-node1 Running Running 25 minutes ago
節點管理
之前的演示中,三個節點始終都保持着Active的可用性。Swarm管理器會自動根據算法將任務(啓停容器等)分配給Active的節點。
除了Active,其它常見的可用性狀態還有Drain,處於Drain的節點不會被分配新任務,而且當前運行的容器也會被停止,swarm管理器則會在其它節點上創建這些任務。
運行命令
docker node update --availability drain k8s-node2
演示
[root@k8s-master ~]# docker node update --availability drain k8s-node2
k8s-node2
[root@k8s-master ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
qs3re8fwfadofgamifcm1w1dt * k8s-master Ready Active Leader 18.06.3-ce
tsrjx3bxnykmi41vddwkcl4vf k8s-node1 Ready Active 18.06.3-ce
gzfsco0lufbf7bvpiikfu8wvd k8s-node2 Ready Drain 18.06.3-ce
[root@k8s-master ~]# docker service ps swarmTomcat
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
vlwlvfp35lny swarmTomcat.1 consol/tomcat-7.0:latest k8s-master Running Running about an hour ago
rv2y10e9x8xy swarmTomcat.2 consol/tomcat-7.0:latest k8s-master Running Running 3 seconds ago
kpf4vo0h7ff0 \_ swarmTomcat.2 consol/tomcat-7.0:latest k8s-node2 Shutdown Shutdown 19 seconds ago
i4nwm9bvpnjt swarmTomcat.3 consol/tomcat-7.0:latest k8s-node1 Running Running 39 minutes ago
由於k8s-node2不再接受 任務並關停了現有任務,所以swarmTomcat.2這個容器被轉移到k8s-master節點上。
如果再次將k8s-node2的可用性更改爲active,那麼k8s-node2節點就可以再次獲取任務了,PS:剛纔被轉移到k8s-master上的任務是不傳再轉回來的,所以k8s-node2的任務只有在接下來的分配中獲得。
最後,一個處於Active狀態的節點可能收到新的任務,當服務規模擴大時,滾動更新時,其它節點被設置爲Darin而本節點需要擔當時,其它節點上的任務啓動失敗時。
docker node update --availability active k8s-node2