摘要:應(yīng)該如何解決本文將給出若干提示,如何在生產(chǎn)環(huán)境中使用。路由匹配服務(wù)發(fā)現(xiàn)負(fù)載均衡跨容器通訊非??煽?。在單個(gè)端口上運(yùn)行一個(gè)服務(wù),節(jié)點(diǎn)的任意主機(jī)都可以訪問,負(fù)載均衡完全在后臺(tái)實(shí)現(xiàn)。
上周數(shù)人云給大家分享了——《你可能需要的關(guān)于Docker Swarm的經(jīng)驗(yàn)分享》今天給大家?guī)磉@位作者大大的后續(xù)文章——《Docker Swarm在生產(chǎn)環(huán)境中的進(jìn)階指南》
當(dāng)在本地開發(fā)環(huán)境中使用Docker,或者已經(jīng)在單臺(tái)生產(chǎn)服務(wù)器上部署Docker,卻發(fā)現(xiàn)它不足以支撐更多的流量。應(yīng)該如何解決?本文將給出若干提示,如何在生產(chǎn)環(huán)境中使用Docker Swarm。
附:如果對(duì)Swarm不熟悉,請(qǐng)查看之前的文章《你可能需要知道的關(guān)于Docker Swarm的經(jīng)驗(yàn)分享》
閱讀官方文檔這里不重復(fù)官方Swarm的入門教程和文檔。入門教程很簡(jiǎn)短,它會(huì)讓你明白Swarm是如何工作的。這里也不講解設(shè)置和部署Swarm環(huán)境,網(wǎng)上有很多初級(jí)的教程,可供參考如——
Digitalocean上的教程 :(https://www.digitalocean.com/...)
或者google搜索相關(guān)教程。
附:一個(gè)牛X的: Ansible role (
https://galaxy.ansible.com/at...
就觀察而言,用于Swarm內(nèi)部信息共享和調(diào)度的Cpu開銷確實(shí)很低。得益于此,管理節(jié)點(diǎn)同時(shí)也可以是工作節(jié)點(diǎn)。如果要跑一個(gè)1000+個(gè)節(jié)點(diǎn)的大集群,管理節(jié)點(diǎn)開銷需要非常多的資源,但當(dāng)集群是小規(guī)模到中等規(guī)模時(shí),這種資源消耗和開銷是可以忽略不計(jì)的。參考這里——
(https://sematext.com/blog/201...)Swarm3k, 一個(gè)運(yùn)行4700個(gè)節(jié)點(diǎn)的集群實(shí)驗(yàn)。
路由匹配(服務(wù)發(fā)現(xiàn)、負(fù)載均衡、跨容器通訊)非常可靠。在單個(gè)端口上運(yùn)行一個(gè)服務(wù),Swarm節(jié)點(diǎn)的任意主機(jī)都可以訪問,負(fù)載均衡完全在后臺(tái)實(shí)現(xiàn)。之前遇到過一些難題,但使用Docker1.13版本后,問題得到解決。
在配置初始化完成后,只需要幾行命令作為日常運(yùn)維。下面是日常使用的命令:
# let"s create new service 創(chuàng)建一個(gè)新的服務(wù) docker service create --image nginx --replicas 2 nginx # ... update service ... 更新服務(wù) docker service update --image nginx:alpine nginx # ... and remove 刪除服務(wù) docker service rm nginx # but usually it"s better to scale down 但是更好的辦法是縮容,而不是直接刪除服務(wù) docker service scale nginx=0 # you can also scale up 擴(kuò)容 docker service scale nginx=5 # show all services 列出所有的服務(wù) docker service ls # show containers of service with status 列出一個(gè)服務(wù)的所有實(shí)例(包括服務(wù)的健康狀況) docker service ps nginx # detailed info 服務(wù)的詳細(xì)信息 docker service inspect nginx
服務(wù)零宕機(jī),是完美的持續(xù)部署方案。
# lets build new version and push to the registry 創(chuàng)建新版本的鏡像,并且推送到registry docker build -t hub.docker.com/image . docker push hub.docker.com/image # and now just update (on a master node) 現(xiàn)在更新服務(wù)(在master節(jié)點(diǎn)上) docker service update --image hub.docker.com/image service
易于啟動(dòng):分布式系統(tǒng)本身就很復(fù)雜。相比于其他解決方案(Mesos, Kubernetes), Swarm簡(jiǎn)單易學(xué),即便無任何Swarm的知識(shí),從單臺(tái)服務(wù)器Docker-compose方式的部署,擴(kuò)展到20臺(tái)服務(wù)器,分布式可伸縮的解決方案,也只需要大約一周。
無需修改。容器實(shí)例同時(shí)跑在多臺(tái)服務(wù)器上。修改任何東西,需要打包一個(gè)新的鏡像,適當(dāng)?shù)臏y(cè)試和部署是成功的關(guān)鍵。
Docker Swarm上的容器選擇從理論上而言,可以使用標(biāo)簽的方式固定某個(gè)容器跑在某個(gè)特定的資源上,但是,更難的是從Swarm集群外部來訪問這個(gè)容器提供的服務(wù)。(在Docker1.12版本里面沒有簡(jiǎn)單的方式來實(shí)現(xiàn),在Docker1.13+版本可以使用附加的Overlay 網(wǎng)絡(luò)模式)。
比如,想開放一個(gè)數(shù)據(jù)庫(kù)服務(wù)給外部訪問,讓外部所有節(jié)點(diǎn)都可以訪問數(shù)據(jù)庫(kù),但是這不是真正想要實(shí)現(xiàn)的結(jié)果(只想讓特定節(jié)點(diǎn)訪問數(shù)據(jù)庫(kù))
。
又如,Swarm里面的跨主機(jī)存儲(chǔ)卷掛載幾個(gè)月之前還不可靠,用戶上傳文件這樣簡(jiǎn)單的操作也會(huì)引發(fā)問題。
適用于容器化的是那些由環(huán)境變量驅(qū)動(dòng)無狀態(tài)的應(yīng)用容器。是時(shí)候準(zhǔn)備自己使用過的開源軟件Docker鏡像了,例如配置完善的Nginx鏡像。
跑在swarm上的服務(wù)
web服務(wù)器(Django channels - Daphne and workers)
反向代理(Nginx)
Periodic workers (Celery)
指標(biāo)收集器 (Sensu)
不跑在swarm上的容器
數(shù)據(jù)庫(kù)(Postgres)
Redis
由于獲取真實(shí)IP的問題(https://github.com/moby/moby/...),也會(huì)把Sginx多帶帶移出來不跑在Swarm模式下,至少應(yīng)該使用Nost網(wǎng)絡(luò)模式,但在Docker 1.12版本下,這是唯一的選擇。
設(shè)置好Docker倉(cāng)庫(kù)Docker倉(cāng)庫(kù)或是自己的服務(wù)器,也許是Dockerhub、 Gitlab.com(作者選擇這個(gè))此類。在服務(wù)器上創(chuàng)建鏡像已經(jīng)不適用了,因?yàn)橛刑喾?wù)器且在創(chuàng)建服務(wù)時(shí)( Docker service create)要指明鏡像。如果倉(cāng)庫(kù)是私有倉(cāng)庫(kù),記得增加--with-registry-auth 這個(gè)參數(shù),否則其他節(jié)點(diǎn)無法拉取鏡像。同時(shí)應(yīng)該使用Tag來標(biāo)明發(fā)布的版本號(hào),這樣發(fā)現(xiàn)問題時(shí)可以快速回滾。
改造無狀態(tài)化應(yīng)用容器“部分有狀態(tài)”是指有一些共享而不重要的文件??梢試L試使用共享存儲(chǔ)卷掛載,更好的方法是遷移到亞馬遜S3或者其他云存儲(chǔ)。記住,擴(kuò)張的時(shí)候,云是最佳選擇。
如例子中,不得不創(chuàng)建自己有合適參數(shù)的Nginx鏡像。通過共享存儲(chǔ)卷掛載在以前非常不可靠、不方便。
準(zhǔn)備日志收集服務(wù)集中式的日志和指標(biāo)是使用分布式文件系統(tǒng)的必須項(xiàng),如ELK,Graphana,Graylog 等等。
這里有許多可選項(xiàng),有開源項(xiàng)目,也有SaaS類服務(wù)。這些打造和整合成可靠的服務(wù)是復(fù)雜且艱難的。建議先使用云端服務(wù)(如Loggly, Logentries), 當(dāng)成本上漲的時(shí)候,再開始架設(shè)自己的日志收集服務(wù)。
例:ELK 棧日志處理配置:
docker service update --log-driver gelf --log-opt gelf-address=udp://monitoring.example.com:12201 --log-opt tag=example-tag example-service創(chuàng)建可附加的網(wǎng)絡(luò)
記得使用它,否則無法在Docker Swarm下一條命令跑起一個(gè)容器。這是Docker1.13+新功能。如果使用舊版本的Docker, 最好升級(jí)下。
代碼:
docker network create --driver=overlay --attachable core增加環(huán)境變量
如果創(chuàng)建Docker鏡像的時(shí)候,遵循了最佳實(shí)踐原則(https://rock-it.pl/how-to-wri...),允許在運(yùn)行的時(shí)候通過環(huán)境變量設(shè)置一切配置項(xiàng),那么把應(yīng)用遷到Swarm的過程完全沒有問題。
例,有用的命令:
docker service create --env VAR=VALUE --env-file FILENAME ... docker service update --env-add VAR=NEW_VALUE --env-rm VAR ..
下一個(gè)級(jí)別就是使用非公開的API掛載文件像掛載秘鑰那樣(Authorized keys, SSL certs 等)。作者暫時(shí)還未使用此功能,不能詳述,但這個(gè)功能特性絕對(duì)值得思考和使用。
設(shè)置適當(dāng)實(shí)例和批量更新保持適當(dāng)數(shù)量的實(shí)例,以應(yīng)對(duì)高流量和實(shí)例或者節(jié)點(diǎn)不可用的情況。同時(shí)太多的實(shí)例數(shù)也會(huì)占用CPU和內(nèi)存,并且導(dǎo)致爭(zhēng)搶CUP資源。
update-parallelism的默認(rèn)值是1,默認(rèn)只有一個(gè)實(shí)例在運(yùn)行。但這個(gè)更新速度太慢了,建議是 replicas / 2。
相關(guān)命令:
docker service update --update-parallelism 10 webapp # You can scale multiple services at once docker service scale redis=1 nginx=4 webapp=20 # Check scaling status docker service ls # Check details of a service (without stopped containers) docker service ps webapp | grep -v "Shutdown"把Swarm配置保存為代碼
最好使用Docker Compose v3版本的語(yǔ)法(https://docs.docker.com/compo...)。
他允許使用代碼指定幾乎所有的服務(wù)選項(xiàng)。作者在開發(fā)的時(shí)候使用 Docker-compose.yml,在生產(chǎn)環(huán)境(swarm)配置使用 Docker-compose.prod.yml . 部署Docker-compose文件中所描述的服務(wù),需要Docker stack deploy 命令(屬于新版本 Stack命令集合中的一部分[https://docs.docker.com/engin...)
Docker compose v3例子:
# docker-compose.prod.yml version: "3" services: webapp: image: registry.example.com/webapp networks: - ingress deploy: replicas: ${WEBAPP_REPLICAS} mode: replicated restart_policy: condition: on-failure proxy: image: registry.example.com/webapp-nginx-proxy networks: - ingress ports: - 80:80 - 443:443 deploy: replicas: ${NGINX_REPLICAS} mode: replicated restart_policy: condition: on-failure networks: ingress: external: true
部署的例子(創(chuàng)建或者更新服務(wù)):
export NGINX_REPLICAS=2 WEBAPP_REPLICAS=5 docker login registry.example.com docker stack deploy -c docker-compose.prod.yml --with-registry-auth frontend
提示:Docker-compose文件支持環(huán)境變量 (${VARIABLE}), 所以,可以動(dòng)態(tài)調(diào)整配置作為測(cè)試等。
設(shè)置限制就經(jīng)驗(yàn)而言,可以為所有服務(wù)設(shè)置CPU使用限制。當(dāng)某一個(gè)容器應(yīng)用占用掉所有主機(jī)資源時(shí),此限制可以避免這種情況發(fā)生。
當(dāng)想把所有容器均勻地發(fā)布在所有主機(jī)上或是想確保有足夠的資源來響應(yīng)操作時(shí),需使用Reserve-cpu這個(gè)參數(shù)。
例如:
docker service update --limit-cpu 0.25 --reserve-cpu 0.1 webapp監(jiān)控連接
曾經(jīng)在Swarm網(wǎng)絡(luò)上遇到過一些問題。很多次所有的流量都被路由到同一個(gè)容器實(shí)例上,而同時(shí)有9個(gè)容器實(shí)例正常且健康的。這種情況下——即流量持續(xù)導(dǎo)到一個(gè)實(shí)例上,做擴(kuò)容或者縮容操作的時(shí)候,加上這個(gè)參數(shù)--endpoint-mode 。
在沒有適當(dāng)?shù)募惺饺罩緯r(shí),要發(fā)現(xiàn)這個(gè)問題還真不容易。
原文作者:Jakub Ska?ecki
原文鏈接: https://rock-it.pl/my-experie...
歡迎關(guān)注數(shù)人云微信公眾號(hào),如有后續(xù)文章,我們會(huì)在第一時(shí)間進(jìn)行跟進(jìn)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/26895.html
摘要:利用分布式應(yīng)用捆綁包簡(jiǎn)稱部署服務(wù)相較于利用大量參數(shù)創(chuàng)建網(wǎng)絡(luò)及服務(wù),這里我們選擇使用一個(gè)文件。 在Docker 1.12版本中,全新的Swarm捆綁包相較于原有編排及調(diào)度機(jī)制做出了巨大改進(jìn)。它不再需要運(yùn)行一組獨(dú)立的Swarm容器,這部分容器已經(jīng)被直接捆綁在Docker Engine當(dāng)中,故障轉(zhuǎn)移策略更為可靠,服務(wù)發(fā)現(xiàn)機(jī)制實(shí)現(xiàn)內(nèi)置,新的網(wǎng)絡(luò)功能極為順暢……看起來很棒是不是? 數(shù)人云這...
摘要:譯者按實(shí)踐中會(huì)發(fā)現(xiàn),生產(chǎn)環(huán)境中使用單個(gè)節(jié)點(diǎn)是遠(yuǎn)遠(yuǎn)不夠的,搭建集群勢(shì)在必行。集群的網(wǎng)絡(luò)通信服務(wù)發(fā)現(xiàn),負(fù)載均衡以及容器間通信非常可靠。負(fù)載均衡也是由提供的。 譯者按: 實(shí)踐中會(huì)發(fā)現(xiàn),生產(chǎn)環(huán)境中使用單個(gè)Docker節(jié)點(diǎn)是遠(yuǎn)遠(yuǎn)不夠的,搭建Docker集群勢(shì)在必行。然而,面對(duì)Kubernetes, Mesos以及Swarm等眾多容器集群系統(tǒng),我們?cè)撊绾芜x擇呢?它們之中,Swarm是Docker原...
摘要:不要用百度搜索中文資料,一定要看最新的英文資料。感謝感謝能容忍我無數(shù)次搞掛生產(chǎn)環(huán)境的老板。群蝸牛大神所建中文交流群,基本配置過程中遇到的問題都能得到解決。 前言 最近花了將近一個(gè)月的時(shí)間研究了 Docker 在生產(chǎn)環(huán)境中的使用,作為新手,期間走了無數(shù)的彎路,這里紀(jì)錄一下,希望給別人帶來微小的幫助。 前面幾部分,介紹了在搭建集群之前需要做的一些工作,后面 一塊結(jié)合實(shí)際應(yīng)用,介紹如何架構(gòu)...
摘要:節(jié)點(diǎn)管理器將利用該聲明該集群服務(wù)。在本示例當(dāng)中,我們將部署一項(xiàng)服務(wù)。此標(biāo)記用于告知公布端口作為該服務(wù)的可用端口。將此稱為入口負(fù)載均衡。當(dāng)外部系統(tǒng)調(diào)用某項(xiàng)服務(wù)時(shí),接收節(jié)點(diǎn)會(huì)接受流量并利用提供的內(nèi)部服務(wù)對(duì)其進(jìn)行負(fù)載均衡。 最新版本Docker Engine v1.12中,包含了多項(xiàng)與Docker Swarm緊密相關(guān)的功能變更。在今天的文章中,數(shù)人云將和大家探討如何利用Docker的Swar...
閱讀 901·2021-11-22 12:04
閱讀 2106·2021-11-02 14:46
閱讀 625·2021-08-30 09:44
閱讀 2110·2019-08-30 15:54
閱讀 731·2019-08-29 13:48
閱讀 1598·2019-08-29 12:56
閱讀 3454·2019-08-28 17:51
閱讀 3289·2019-08-26 13:44