failover swarm 故障轉移
#故障轉移 Failover
#當其中一個節點關閉宕機時,其節點中的service會轉移到另一個節點上。
Swarm會檢測到node1發生故障並把此故障節點的狀態標記為Down; docker node ls 可查看 node1的STATUS 為Down
同時 Swarm會把node1上的service調度到其它有資源的節點上來運行;docker service ps web_server 可查看其過程和狀態
#訪問server
#便於分析,重新部署一個
docker service create --name=htdocs_nginx --replicas=3 nginx
docker service ps htdocs_nginx 可查看副本數
--replicas可直接指定副本數 ,不需要再用docker scale命令
#現在我們要訪問server
在以上操作中,我們每個節點都有運行service, node1、node2、node3 容器裏是監聽80端口的,但我們並沒有映射端口到Host,所以要進行以下操作
#進入容器查看:
docker exec 容器ID /bin/sh 也可使用 /bin/bash
容器IP 為172.12.0.5, 實際上連接的是Docker的bridge網絡
crul 172.12.0.5 可以訪問
但是這是在容器內部,需要實現在外部也可訪問,也就時暴露80端口
#外部訪問
docker service update --publish-add 80:80 htdocs_nginx
這樣就映射端口了,外部也可訪問。
當然新建service時也可直接指定
docker service create --name htdocs_nginx --replicas=3 --publish-add 80:80 nginx
#routing mesh
我們訪問每個節點的80端口都可以返回結果; swarm 內部的 load balancer 會將請求轉發給 web_server 其中的一個副本。這就是 routing mesh 的作用。
註:當我們使用 --publish-add 80:80 時 swarm會重新配置副本,容器內的網絡就會發生改變
器的網絡與 --publish-add 之前已經大不一樣了,現在有兩塊網卡,每塊網卡連接不同的 Docker 網絡。
實際上:
eth0 連接的是一個 overlay 類型的網絡,名字為 ingress,其作用是讓運行在不同主機上的容器可以相互通信。
eth1 連接的是一個 bridge 類型的網絡,名字為 docker_gwbridge,其作用是讓容器能夠訪問到外網。
ingress 網絡是 swarm 創建時 Docker 為自動我們創建的,swarm 中的每個 node 都能使用 ingress。
通過 overlay 網絡,主機與容器、容器與容器之間可以相互訪問;同時,routing mesh 將外部請求路由到不同主機的容器,
從而實現了外部網絡對 service 的訪問。
#service與service通信 內部的
為了不暴露端口 增加安全性 ,我們可以用一下方法:
服務發現:
如果不 publish,那麽 swarm 就要提供一種機制,能夠:
讓 service 通過簡單的方法訪問到其他 service。
當 service 副本的 IP 發生變化時,不會影響訪問該 service 的其他 service。
當 service 的副本數發生變化時,不會影響訪問該 service 的其他 service。
這其實就是服務發現(service discovery)。Docker Swarm 原生就提供了這項功能,通過服務發現,
service 的使用者不需要知道 service 運行在哪裏,IP 是多少,有多少個副本,就能與 service 通信。
#創建overlay網絡
docker network create --driver overlay app_net
docker network ls
#部署
docker service create --name my_web --replicas=5 --network app_net nginx
docker service create --name database --network app_net mysql
docker service ps database 查看容器 然後進入容器
docke exec 容器ID /bin/sh ping my_web 發現可通
同時ping所得到的my_webIP是VIP 虛擬IP ,swarm 會將對 VIP 的訪問負載均衡到每一個副本。
failover swarm 故障轉移