非常非常抱歉!16:30 ~ 17:00 左右我們用於跑 ASP.NET Core 站點的 docker swarm 集群再次出現宕機,由此給您帶來了很大很大的麻煩,懇請您的諒解!
受此次故障影響的站點有:博問,閃存,班級,園子,短信息,招聘,小組,網摘,新聞,openapi
故障的經過是這樣的。
一開始只是訪問時偶爾出現 503 ,然后 503 逐漸增多。登錄到集群的各個節點,發現有節點 ssh 登錄響應慢,登錄進去后執行 docker 命令也慢,於是將這個節點下線並重啟,但是這樣操作后又有新的節點出現這個問題 。。。然后越來越多的節點出現這個問題,造成全面 503 。
發現重啟節點服務器不湊效,我們立即選擇了重建集群,這本來每次都管用的一招,這次竟然失靈。
swarm1-node1 這個節點通過 docker swarm leave --force 命令強制退出已有集群,重新創建新的集群,並只部署了 docker-proxy-flow 路由容器。
docker swarm init --advertise-addr $(ip address | grep -oP "10\.[^/]+(?=/)") docker network create --driver overlay cnblogs --subnet 10.128.0.0/16 docker network create --driver overlay proxy --subnet 10.129.0.0/16 cd docker-flow-proxy ./deploy-prod.sh watch 'docker stack ps proxy'
這時沒有部署其他應用容器,以免一部署把這個節點壓垮,而是將其他節點一一加入集群,但是加集群時傻眼了,出現下面的錯誤,無法加入。
# docker swarm join --token SWMTKN-1-2tzw5t53lzek5anyv163pc932zfrv1knkbzkxz9vg76uvsx5mz-3rw8fxa7sjbsf9hp55ycvmqxb 10.0.1.7:2377 Error response from daemon: rpc error: code = Unavailable desc = grpc: the connection is unavailable
更恐怖的是所有其他節點都因為同樣的問題無法加入集群,不管是 manager 節點,還是 worker 節點。
在當時情急、愧疚、慌亂、無助。。。各種情緒的混雜之下,想到了最后一招,換另外一台服務器重建集群,結果一切正常,很快完成了整個集群的重建,恢復了正常。
用了 5 個 manager 節點,docker swarm 集群竟然還是如此不穩定,這是我們未曾料到的。目前我們需要先仔細分析,然后再評估接下來的應對措施。
再次請您諒解由此給您帶來的麻煩!
【更新】
1)重建集群后,今天晚上又有1個節點出現問題,問題表現是容器中 dns 解析失敗,造成無法連接阿里雲 RDS 數據庫,引發應用訪問出現 504 錯誤
System.Data.SqlClient.SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 25 - Connection string is not valid) ---> System.Net.Internals.SocketExceptionFactory+ExtendedSocketException (0x00000001): Resource temporarily unavailable at System.Net.Dns.InternalGetHostByName(String hostName, Boolean includeIPv6)
將該節點下線后恢復正常。
2)在 docker 節點上發現大量的 docker 錯誤日志
dockerd[773]: time="2018-03-15T22:38:08.780376214+08:00" level=error msg="Failed to deserialize netlink ndmsg: Link not found"