摘要:當企業的運維團隊去維護一個彈性的容器集群時,傳統的軟件部署方式需要向容器遷移,這個過程中需要有風險預判和規避之道。但是這樣會有些問題,就是大部分鏡像都是基于構建的,這會和樹莓派的很不兼容。多次嘗試后狀態被破壞刪庫重試,重啟大法好。
當前技術世界的發展形勢就是讓開發人員從繁瑣的應用配置和管理中解放出來,使用容器鏡像來處理復雜的程序運行依賴庫的需求,保證代碼運行環境的一致性。既然這樣的好處是如此清晰,但為什么企業中的基礎設施環境沒有往容器集群切換呢?關鍵問題還是風險,新技術意味著未經檢驗的技術和實踐經驗的缺乏,這就會帶來很多不可預知的風險。
當企業的運維團隊去維護一個彈性的容器集群時,傳統的軟件部署方式需要向容器遷移,這個過程中需要有風險預判和規避之道。而Docker和Rancher正是提供了解決這些風險問題的解決方案,比如基于Rancher的Catalog功能就能快速的完成一些基礎軟件的部署(比如ElasticSearch)。在風險管理方面,我們可以看看基于Docker和Rancher來運行彈性集群的五個關鍵點:
運行Rancher高可用模式 (本文將介紹)
Rancher中使用負載均衡服務
Rancher中的服務監控和監控檢查
開發者自定義針對Rancher的安裝部署
討論利用Convoy對數據的管理
我原本希望展現一下用一臺老式筆記本部署Rancher Server,然后用docker-machine加入幾個樹莓派節點部署Rancher Agent,這樣來構建一個Rancher集群。但是這樣會有些問題,就是大部分Docker鏡像都是基于Intel CPU構建的,這會和樹莓派的ARM CPU很不兼容。所以我還是老老實實的用AWS的虛機來構建Rancher集群吧。
初始安裝,我們暫時先部署一臺Rancher Server和一臺Rancher Agent,然后再部署一個簡單的多實例應用。
上面這張圖展現了我的整個集群的設置,我選擇AWS是因為我個人比較熟悉,當然你完全可以選擇你擅長的云提供商。
我們可以嘗試創建一個Wordpress,順帶來檢測一下Rancher是否正確部署了。
這樣我們的應用就運行起來了,試想,如果Rancher Server所在服務器出現故障,或者有網絡中斷問題發生,會對應用產生什么影響,Wordpress還能繼續接受請求么?
為了確認我們的疑問,我將會按照下面的步驟執行,然后記錄一下其中的運行結果:
阻斷Rancher Server和Rancher Agent間的網絡
停止Rancher Server的容器
瞧一瞧Rancher Server的容器里面到底有什么
最終我們要解決這些問題,那就要看看Rancher HA來怎樣解決這些風險。
阻斷Rancher Server和Rancher Agent間的網絡進入AWS,然后看我各種犀利的操作:
阻斷Rancher Server和Rancher Agent間的訪問
記錄一下發生了什么
干掉幾個WordPress的實例
恢復原先的網絡
觀察結果首先,網絡阻斷后沒過多久Rancher Host就出現了reconnecting狀態
此時我依然可以正常訪問Wordpress的地址,服務沒有中斷,IPSec隧道網絡還存儲,Wordpress實例還是可以正常訪問數據庫。
現在我們要停掉一個Wordpress實例,看看會發生什么?因為我們已經無法從Rancher UI上管理這些容器了,所以還是到對應的主機上執行docker命令吧。
很遺憾Wordpress容器沒有重新啟動,這有點麻煩了。我們還是把Rancher Server弄回來吧,看看它能不能感知到其中一個Wordpress容器已經被停掉了。
在各種犀利的操作和等待之后,Rancher Server與Agent重新連接了,Wordpress容器就被重新啟動了。完美~
所以我們可以看,Rancher Server還是能夠處理間歇性的網絡問題,可以實現Rancher Server和Agent的故障重連。但是如果要讓網絡中斷對Rancher的影響進一步減小,那么部署多個Rancher Server就比較重要了。
我們還是回過來,按照先前計劃看看Rancher Server 容器停掉后會發生什么?我們會因此失去對這些Rancher Host的管理能力么?看看如何!
停掉Rancher Server這次我需要登入到Rancher Server的host上手動停止Rancher Server,其實Rancher Server一般是設置 –restart=always,所以自己有一定的恢復能力。但我們可以假設比如磁盤寫滿了后,Rancher Server真的起不來了。
觀察結果執行docker stop rancher-server之后,Wordpress還是能夠正常工作,但是Rancher UI是不能訪問了,這可不行,得趕緊把Rancher Server弄回來。
再執行docker start rancher-server,Rancher Server啟動后又一切恢復正常,這很酷啊,這是什么魔法?趕緊著,麻溜地分析起來!
揭開Rancher Server的神秘面紗我們來一次對Rancher Server的簡要探究之旅,看一看Rancher Server的Dockerfile。
# Dockerfile contents FROM ... ... ... CMD ["/usr/bin/s6-svscan", "/service"]
我們可以看到使用了s6-svscan,它可以運行指定的目錄結構內的程序,目錄內的主要文件就是Run、Down、Finish。下面這張圖能看到會運行兩個服務cattle(Rancher的核心調度器)和mysql。
其實在容器內部我們也可以看到起了哪些服務。
PID TTY STAT TIME COMMAND 1 ? Ss 0:00 /usr/bin/s6-svscan /service 7 ? S 0:00 s6-supervise cattle 8 ? S 0:00 s6-supervise mysql 9 ? Ssl 0:57 java -Xms128m -Xmx1g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/lib/cattle/logs -Dlogback.bootstrap.level=WARN -cp /usr/share/cattle/1792f92ccdd6495127a28e16a685da7 135 ? Sl 0:01 websocket-proxy 141 ? Sl 0:00 rancher-catalog-service -catalogUrl library=https://github.com/rancher/rancher-catalog.git,community=https://github.com/rancher/community-catalog.git -refreshInterval 300 142 ? Sl 0:00 rancher-compose-executor 143 ? Sl 0:00 go-machine-service 1517 ? Ss 0:00 bash 1537 ? R+ 0:00 ps x
我們可以看到Rancher的大腦,一個名叫Cattle的Java應用,它需要一個MySQL來存儲對應的數據。這確實很方便,但是我們發現這樣會有單點故障,所有的數據存儲在一個單點的mysql中。如果對mysql中的數據來一些不禮貌的操作,會發生什么呢?
破壞MySQL存儲數據
進入容器中執行一些MySQL命令,我們一起來干點壞事:
docker exec -it rancher-server bash $ > mysql mysql> use cattle; mysql> SET FOREIGN_KEY_CHECKS = 0; mysql> truncate service; mysql> truncate network;
結果是可想而知的,Rancher不記得任何事了,你刪掉一個Wordpress容器,它也不會恢復。
而且我也刪除了network表的數據,Wordpress也不知道如何找到它的MySQL服務了。
顯然,若要在生產環境運行Rancher,我們需要一個方式來保護Rancher Server的數據,既然如此那我們就講一下Rancher HA吧。
Rancher HA安裝過程首先我們要確保數據的安全,我選擇了AWS的RDS服務,RDS可以提供一個信賴的MySQL服務,數據安全是可以保證的。當然你也可以使用其他的,我只是對RDS更熟悉一些。
下面我們繼續Rancher HA的安裝過程:
按照我們之前的約定,我是創建了RDS的MySQL實例,然后把它當做外部數據庫和Rancher Server連接。
一旦我們使用了外部數據庫模式,UI上將會打開兩個選項來設置HA。
怎么辦!選擇困難癥啊!沒關系,我來解釋一下每個選項的含義。
Cluster size,注意這里怎么都是奇數?因為在后端,Rancher會設置一個ZooKeeper Quorum保證鎖同步,ZooKeeper推薦奇數集群,因為偶數節點數量不能提供額外的容錯性。我們這里就選擇3個Host吧,這是一個可用和易用的平衡。
Host registration URL,這里是填寫一個Rancher Cluster入口的FQDN,推薦使用外部負載均衡服務或者DNS服務(round robin策略)。比如圖中我使用的是支持SRV記錄的DNS服務,通過DNS來做三個Rancher Server的負載均衡:
SSL Certificates是列表中的最后一個選項,如果你有域名的SSL證書可以配置在這里,否則Rancher會自動生成一個自簽名證書。
所有都填完后,就會給你提供一個rancher-ha.sh的腳本來下載。
有了腳本就可以到每個Rancher Server節點上執行了,執行前還需要注意目前只能支持docker v1.10.3。安裝指定版本的Docker Engine,可以參考下面的方式:
#!/bin/bash apt-get install -y -q apt-transport-https ca-certificates apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" > /etc/apt/sources.list.d/docker.list apt-get update apt-get install -y -q docker-engine=1.10.3-0~trusty # run the command below to show all available versions # apt-cache showpkg docker-engine
Docker安裝之后,就要確認一下端口開放了,需要開放哪些端口可以看這里,不過如果是第一次安裝,我建議你把端口全部開放吧,免得坑太深被活埋。
一切準備妥當之后,可以執行腳本,執行后能看到這樣的輸出:
... ed5d8e75b7be: Pull complete ed5d8e75b7be: Pull complete 7ebc9fcbf163: Pull complete 7ebc9fcbf163: Pull complete ffe47ea37862: Pull complete ffe47ea37862: Pull complete b320962f9dbe: Pull complete b320962f9dbe: Pull complete Digest: sha256:aff7c52e52a80188729c860736332ef8c00d028a88ee0eac24c85015cb0e26a7 Status: Downloaded newer image for rancher/server:latest Started container rancher-ha c41f0fb7c356a242c7fbdd61d196095c358e7ca84b19a66ea33416ef77d98511 Run the below to see the logs docker logs -f rancher-ha
執行過程中會下載一些額外的鏡像,畢竟要支持HA特性么。另外Host的內存建議至少4G,執行完畢后通過docker ps可以看看都啟動了什么:
常見的問題和解決方案正常來說,一般我們會在日志中能看到各個成員加入到Rancher HA Cluster中:
time="2016-07-22T04:13:22Z" level=info msg="Cluster changed, index=0, members=[172.30.0.209, 172.30.0.111, ]" component=service ... time="2016-07-22T04:13:34Z" level=info msg="Cluster changed, index=3, members=[172.30.0.209, 172.30.0.111, 172.30.0.69]" component=service
但有時候會有意外,比如會看到一些error信息:
time="2016-07-23T14:37:02Z" level=info msg="Waiting for server to be available" component=cert time="2016-07-23T14:37:02Z" level=info msg="Can not launch agent right now: Server not available at http://172.17.0.1:18080/ping:" component=service
這個問題產生的背后原因有很多,我閱讀了一些Github上的issue和各種論壇的帖子,幫大家整理了一些產生此問題的根本原因。
網絡設置問題有時候容器自動獲取了節點的錯誤的IP,這時候你需要強制指定正確的IP。
ZooKeeper沒有正常啟動Zookeeper的容器是分布在每個節點上的,如果節點之間的問題導致Zookeeper容器不能通信,就會導致這個問題,如果要確認這個問題,可以參考這樣的日志輸出。
目錄/var/lib/rancher/state下有殘留文件如果多次運行Rancher-ha.sh這個腳本,那么你需要運行前清理一下這個目錄下殘留文件。
多次嘗試后HA狀態被破壞刪庫重試,重啟大法好。
機器資源不足內存至少需要4GB,此外mysql的連接數也要足夠,可以按照每個HA節點需要50個連接數來計算。如果你看到下面的錯誤,那么此問題確信無疑。
time="2016-07-25T11:01:02Z" level=fatal msg="Failed to create manager" err="Error 1040: Too many connections"rancher/server版本不匹配
rancher-ha.sh執行的時候默認是下載rancher/server:latest鏡像,如果你沒有host上的鏡像不一致會導致難以想象的問題,最好執行的時候指定版本號。比如:
./rancher-ha.sh rancher/server:docker0返回了錯誤的IP
這個錯誤具體就是在HA的安裝過程中會去檢查agent健康狀態,此時它獲取了一個錯誤的docker0 IP地址,因為我先前已經將其設置成了172.17.42.1。
curl localhost:18080/ping > pong curl http://172.17.0.1:18080/ping > curl: (7) Failed to connect to 172.17.0.1 port 18080: Connection refused
我的解決辦法就是重裝了我的AWS虛機,導致獲取docker0 IP錯誤的原因,我感覺可能是我在虛機里多次安裝了Docker。重裝之后,一切就正常了,我也看到了期待的日志信息。
HA部署完畢后我們終于看到了夢寐以求的正確日志輸出,和美好的UI展現:
time="2016-07-24T20:00:11Z" level=info msg="[0/10] [zookeeper]: Starting " time="2016-07-24T20:00:12Z" level=info msg="[1/10] [zookeeper]: Started " time="2016-07-24T20:00:12Z" level=info msg="[1/10] [tunnel]: Starting " time="2016-07-24T20:00:13Z" level=info msg="[2/10] [tunnel]: Started " time="2016-07-24T20:00:13Z" level=info msg="[2/10] [redis]: Starting " time="2016-07-24T20:00:14Z" level=info msg="[3/10] [redis]: Started " time="2016-07-24T20:00:14Z" level=info msg="[3/10] [cattle]: Starting " time="2016-07-24T20:00:15Z" level=info msg="[4/10] [cattle]: Started " time="2016-07-24T20:00:15Z" level=info msg="[4/10] [go-machine-service]: Starting " time="2016-07-24T20:00:15Z" level=info msg="[4/10] [websocket-proxy]: Starting " time="2016-07-24T20:00:15Z" level=info msg="[4/10] [rancher-compose-executor]: Starting " time="2016-07-24T20:00:15Z" level=info msg="[4/10] [websocket-proxy-ssl]: Starting " time="2016-07-24T20:00:16Z" level=info msg="[5/10] [websocket-proxy]: Started " time="2016-07-24T20:00:16Z" level=info msg="[5/10] [load-balancer]: Starting " time="2016-07-24T20:00:16Z" level=info msg="[6/10] [rancher-compose-executor]: Started " time="2016-07-24T20:00:16Z" level=info msg="[7/10] [go-machine-service]: Started " time="2016-07-24T20:00:16Z" level=info msg="[8/10] [websocket-proxy-ssl]: Started " time="2016-07-24T20:00:16Z" level=info msg="[8/10] [load-balancer-swarm]: Starting " time="2016-07-24T20:00:17Z" level=info msg="[9/10] [load-balancer-swarm]: Started " time="2016-07-24T20:00:18Z" level=info msg="[10/10] [load-balancer]: Started " time="2016-07-24T20:00:18Z" level=info msg="Done launching management stack" component=service time="2016-07-24T20:00:18Z" level=info msg="You can access the site at https://" component=service
如果使用了自簽名證書且前端希望通過HTTPS來訪問,那么你需要把你的證書添加到你的受信任證書中。然后再等待數據庫資源約束調整完畢后,三個節點的服務就完全運行起來了。
結論這比原來想象的要多了很多。這就是為什么分布式系統一直是PHD的研究領域。解決所有的故障點后,我認為Rancher HA已經開始向頂尖分布式系統出發啦。
我最終會將Rancher HA的腳本配置成Ansible的一個簡單任務,敬請關注!
附錄對于任何分布式系統來說,基本的套路就是統一管理其中產生的狀態和變化,這意味著多個服務需要一個進程來協調更新。
Rancher的處理方式就是把狀態都放倒數據庫中,需要同步狀態時把狀態信息放入到event中,發送event就可以向其他組件同步狀態。所以當正在處理一個事件時,它有一個鎖,事件未處理完前數據庫中的狀態是不能被修改的。
在單臺服務器設置中,所有的協調都發生在主機上的內存中。一旦你涉及多服務器HA配置,像zookeeper和redis是必要的。
報名11.6成都Docker技術沙龍
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26758.html
摘要:摘要本篇文章介紹了如何通過數人云部署一套標準的日志收集系統。主機添加完成后,檢查主機運行是否正常,如圖第二步,發布實例我們將通過數人云將的鏡像以模式部署到我們規劃的主機和上。 摘要:本篇文章介紹了如何通過數人云部署一套標準的 ELK 日志收集系統。第一步,將主機組織成集群;第二步,發布 ElasticSearch 實例;第三步,發布 Kibana 實例;第四步,發布 Logstash ...
摘要:阿里云容器服務已經發布了基于容器集群的開源區塊鏈解決方案,利用容器技術可以在分鐘之內部署完成一個生產級別安全高可用的區塊鏈應用運行環境,幫助企業可以加速業務創新。對節點,阿里云服務會自動開啟相應調度能力。 摘要: 阿里云ECS彈性裸金屬服務器(神龍)已經與其容器服務全面兼容,用戶可以選擇在彈性裸金屬服務器上直接運行容器、管控Kubernetes/Docker容器集群,如此將會獲得非常出...
摘要:有了分布式數據庫可以使數據庫的性能可以隨著節點增加線性地增加。分布式數據庫最最下面是,是主備的,通過的內核開發能力,我們能夠實現主備切換數據零丟失,所以數據落在這個里面,是非常放心的,哪怕是掛了一個節點,切換完了以后,你的數據也是不會丟的。 此文已由作者劉超授權網易云社區發布。 歡迎訪問網易云社區,了解更多網易技術產品運營經驗 三、微服務化的十個設計要點 微服務有哪些要點呢?第一張圖是...
閱讀 2473·2021-11-24 09:39
閱讀 3405·2021-11-15 11:37
閱讀 2250·2021-10-08 10:04
閱讀 3965·2021-09-09 11:54
閱讀 1882·2021-08-18 10:24
閱讀 1032·2019-08-30 11:02
閱讀 1792·2019-08-29 18:45
閱讀 1651·2019-08-29 16:33