摘要:譯者按實(shí)踐中會發(fā)現(xiàn),生產(chǎn)環(huán)境中使用單個(gè)節(jié)點(diǎn)是遠(yuǎn)遠(yuǎn)不夠的,搭建集群勢在必行。集群的網(wǎng)絡(luò)通信服務(wù)發(fā)現(xiàn),負(fù)載均衡以及容器間通信非??煽?。負(fù)載均衡也是由提供的。
譯者按: 實(shí)踐中會發(fā)現(xiàn),生產(chǎn)環(huán)境中使用單個(gè)Docker節(jié)點(diǎn)是遠(yuǎn)遠(yuǎn)不夠的,搭建Docker集群勢在必行。然而,面對Kubernetes, Mesos以及Swarm等眾多容器集群系統(tǒng),我們該如何選擇呢?它們之中,Swarm是Docker原生的,同時(shí)也是最簡單,最易學(xué),最節(jié)省資源的,至少值得我們多了解一下。本文將介紹一些非常實(shí)用的建議。
原文: Tips for using Docker Swarm mode in production
譯者: Fundebug
為了保證可讀性,本文采用意譯而非直譯。另外,本文版權(quán)歸原作者所有,翻譯僅用于學(xué)習(xí)。
如果你在單個(gè)生產(chǎn)節(jié)點(diǎn)上用過Docker,然后發(fā)現(xiàn)單個(gè)節(jié)點(diǎn)的資源不夠用,那么你會怎么做呢?我也遇到過這種情況! 關(guān)于在生產(chǎn)環(huán)境中使用Docker Swarm,我會為你提供一些建議,也許能夠幫到你。這些都是我一年來積累的一些經(jīng)驗(yàn)。
另外,如果你對Docker Swam不熟悉的話,可以參考我之前的博客My experience with Docker Swarm - when you may need it?
1. 閱讀官方文檔我并不打算重復(fù)官方文檔。盡管文檔非常短,但是通過它可以了解Swarm的基本知識。另外,我也不會寫如何搭建Swarm集群,這方面的資料太多了,你可以查看 Digital Ocean或者自己谷歌。PS: 我是使用Ansible搭建Swarm集群的。
2. Docker Swarm要點(diǎn)Swarm的負(fù)載非常低。據(jù)我觀察,Swarm進(jìn)行調(diào)度和通信的CPU負(fù)載非常低。因此,Swarm的管理節(jié)點(diǎn)(Manager)可以同時(shí)作為工作節(jié)點(diǎn)(Worker)。如果你需要搭建一個(gè)非常大的集群(1000+ 節(jié)點(diǎn)),管理節(jié)點(diǎn)需要更多資源,但是對于中小型集群來說,管理節(jié)點(diǎn)需要的資源可以忽略不計(jì)。另外,這篇博客介紹了Swarm3k(一個(gè)4700節(jié)點(diǎn)的Swarm集群的實(shí)驗(yàn)),不妨了解一下。
Swarm集群的網(wǎng)絡(luò)通信(服務(wù)發(fā)現(xiàn),負(fù)載均衡以及容器間通信)非常可靠。當(dāng)你開啟一個(gè)服務(wù)的端口之后,在Swarm集群中的任何一個(gè)節(jié)點(diǎn)都可以訪問它。負(fù)載均衡也是由Swarm提供的。后文會提到一些之前遇到的問題,但是Docker 1.13之后,這些問題都解決了。
使用Swarm只需要掌握少量命令。下面是我每天需要用到的所有命令:
# 創(chuàng)建服務(wù) docker service create --image nginx --replicas 2 nginx # 更新服務(wù) docker service update --image nginx:alpine nginx # 刪除服務(wù) docker service rm nginx # 減少服務(wù)實(shí)例(這比直接刪除服務(wù)要好) docker service scale nginx=0 # 增加服務(wù)實(shí)例 docker service scale nginx=5 # 查看所有服務(wù) docker service ls # 查看服務(wù)的容器狀態(tài) docker service ps nginx # 查看服務(wù)的詳細(xì)信息。 docker service inspect nginx
實(shí)現(xiàn)零宕機(jī)部署也非常簡單。這樣也可以方便地實(shí)現(xiàn)持續(xù)部署:
# 構(gòu)建新鏡像 docker build -t hub.docker.com/image . # 將新鏡像上傳到Docker倉庫 docker push hub.docker.com/image # 更新服務(wù)的鏡像 docker service update --image hub.docker.com/image service
Swarm非常容易入門。分布式系統(tǒng)通常是非常復(fù)雜的。與其他容器集群系統(tǒng)(Mesos, Kubernetes)相比,Swarm的學(xué)習(xí)曲線最低。在沒有任何Swarm知識的情況下,我只花了一周時(shí)間,就把服務(wù)從單個(gè)Docker主機(jī)遷移到20個(gè)節(jié)點(diǎn)的Docker集群上。
更新服務(wù)要慎重。 你的容器同時(shí)運(yùn)行在多個(gè)主機(jī)上。更新服務(wù)時(shí),只需要更新Docker鏡像。合理的測試和部署流程是保證成功的關(guān)鍵。
3. 決定哪些容器部署在Swarm集群并非所有服務(wù)都應(yīng)該部署在Swarm集群內(nèi)。數(shù)據(jù)庫以及其他有狀態(tài)服務(wù)就不適合部署在Swarm集群內(nèi)。理論上,你可以通過使用labels將容器部署到特定節(jié)點(diǎn)上,但是這樣的話,Swarm集群外的節(jié)點(diǎn)就很難訪問它們了(Docker 1.12沒有很好的方法,但是1.13之后可以使用attachable network)。如果你允許集群外的節(jié)點(diǎn)訪問數(shù)據(jù)庫,則所有節(jié)點(diǎn)都可以訪問它,這顯然不符合你的需求。另外,Docker Swarm的跨節(jié)點(diǎn)數(shù)據(jù)卷(cross-host mounted volumes)并不可靠,一個(gè)簡單的文件上傳都可能引起問題。
無狀態(tài)的容器就非常適合部署在Swarm集群中,它們可以由環(huán)境變量進(jìn)行配置(使用ENV指令)。建議為開源工具構(gòu)建鏡像,例如,可以將Nginx的配置文件放到Docker鏡像中。
下面是我部署在Swarm集群中的服務(wù):
Django channels (網(wǎng)頁應(yīng)用)
Nginx(代理)
Celery(周期性任務(wù))
Sensu(監(jiān)控)
下面是我部署在Swarm集群之外的容器:
Postgres(數(shù)據(jù)庫)
Redis(緩存)
由于一個(gè)獲取真正IP的問題,我很可能會將Nginx運(yùn)行在Swarm集群之外,或者采用host模式。
4. 配置Docker倉庫Docker倉庫,你值得擁有!你可以自己搭建一個(gè),或者使用Docker倉庫服務(wù),比如DockerHub或者GitLab Container Registry。不要在服務(wù)器上直接構(gòu)建Docker鏡像,因?yàn)槟阌卸鄠€(gè)節(jié)點(diǎn)(在每個(gè)節(jié)點(diǎn)上構(gòu)建鏡像非常麻煩),而且在創(chuàng)建服務(wù)的時(shí)候你需要指定鏡像(這個(gè)鏡像所有節(jié)點(diǎn)都應(yīng)該可以下載)。如果你配置了私有Docker倉庫,則需要指定--with-registry-auth,否則這些節(jié)點(diǎn)將無法下載鏡像。
另外,你應(yīng)該為Docker鏡像設(shè)置版本,這樣更加易于回滾。
5. 將半無狀態(tài)的服務(wù)變得完全無狀態(tài)所謂半無狀態(tài)服務(wù),就是容器需要依賴一些不太重要的外部文件。你可以使用數(shù)據(jù)卷(volume),但是更好的選擇是使用S3或者其他云存儲服務(wù)。記住,想要獲得擴(kuò)展性,云是最好的選擇。
例如,我不得不構(gòu)建Nginx鏡像,將配置文件放到鏡像中。使用數(shù)據(jù)卷掛載Nginx配置文件不是很方便。
6. 配置日志收集服務(wù)使用分布式系統(tǒng)時(shí),集中管理日志是非常必要的。我們有很多方案,包括開源工具或者SaaS服務(wù),比如ELK,Grafana, Graylog...自己搭建完整的系統(tǒng)是非常復(fù)雜的,所以我建議搭建先使用SaaS服務(wù)(比如Loggly, Logentries ),當(dāng)費(fèi)用太高時(shí),則自己搭建一個(gè)系統(tǒng)。ELK可以這樣配置:
docker service update --log-driver gelf --log-opt gelf-address=udp://monitoring.example.com:12201 --log-opt tag=example-tag example-service7. 創(chuàng)建attachable network
attachable network是一個(gè)非常重要的特性。你最好使用它,否則docker run創(chuàng)建的容器將無法接入Swarm集群的網(wǎng)絡(luò)。這是Docker 1.13之后的版本才有的功能,也許你需要升級。
創(chuàng)建attachable network的命令如下:
docker network create --driver=overlay --attachable core8. 先使用環(huán)境變量,再考慮Secrets API
如果你按照How to write excellent Dockerfiles構(gòu)建Docker鏡像,你很可能會使用環(huán)境變量去配置很多東西。如果你這樣做的話,則遷移到Swarm集群時(shí)問題會少很多。示例命令如下:
# 創(chuàng)建服務(wù)時(shí)指定環(huán)境變量 docker service create --env VAR=VALUE --env-file FILENAME ... # 增加、刪除環(huán)境變量 docker service update --env-add VAR=NEW_VALUE --env-rm VAR ..
下一步是使用Secrets API 。簡單地說,你可以將私密數(shù)據(jù)(比如密碼,SSL證書等)以文件的形式掛載到容器中。雖然我還沒有用過Secrets API,但是我覺得值得嘗試一下。
9. 設(shè)置合理的服務(wù)容器個(gè)數(shù)以及并行更新的容器個(gè)數(shù)一方面,你需要保證足夠多的容器數(shù)來處理負(fù)載以及作為災(zāi)備,另一方面,太多的容器會導(dǎo)致CPU和內(nèi)存資源不足。因此,你需要配置合理的服務(wù)容器個(gè)數(shù),也就是說,某個(gè)服務(wù),需要運(yùn)行合理個(gè)數(shù)的容器。
另外,默認(rèn)的update-parallelism 值是1,這就意味著更新服務(wù)時(shí),每次只更新1個(gè)容器。通常,這個(gè)值太小了。我的建議是將它設(shè)為 服務(wù)容器數(shù) / 2.。
相關(guān)命令
# 將同時(shí)更新的容器數(shù)設(shè)為10 docker service update --update-parallelism 10 webapp # 同時(shí)增加多個(gè)服務(wù)的容器數(shù) docker service scale redis=1 nginx=4 webapp=20 # 查看服務(wù)狀態(tài) docker service ls # 查看服務(wù)的詳情(排除關(guān)閉的容器) docker service ps webapp | grep -v "Shutdown"10. 將Swarm配置代碼化
最佳方式是使用Docker Compose v3 語法,這樣可以將服務(wù)的所有配置選項(xiàng)代碼化。我將 docker-compose.yml用于開發(fā)環(huán)境, docker-compose.prod.yml用于生產(chǎn)環(huán)境。使用docker-compose文件部署服務(wù)的話,需要使用 docker stack deploy 命令(參考docker stack
docker-compose文件示例
# 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
部署命令:
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-compse文件支持環(huán)境變量(${VARIABLE}),這樣你可以動(dòng)態(tài)地調(diào)整配置。
11. 設(shè)置資源限制根據(jù)我的經(jīng)驗(yàn),你需要限制所有服務(wù)的CPU使用。這樣可以防止單個(gè)容器占用主機(jī)的所有的CPU資源。
reserve-cpu 選項(xiàng)也非常有用。當(dāng)我希望平均地將所有容器部署到各個(gè)主機(jī)時(shí),我會使用reserve-cpu ,它可以保證每個(gè)容器都有足夠地資源。示例:
# 限制服務(wù)占用的CPU資源 docker service update --limit-cpu 0.25 --reserve-cpu 0.1 webapp12. 監(jiān)控網(wǎng)絡(luò)連接
我遇到過Swarm網(wǎng)絡(luò)方面的問題。有時(shí)候所有的請求都被轉(zhuǎn)發(fā)到某一個(gè)容器,然而還有9個(gè)其他容器正在運(yùn)行。這時(shí),可以嘗試減少/增加實(shí)例個(gè)數(shù),或者改變路由類型(使用--endpoint-mode選項(xiàng))
如果沒有監(jiān)控日志的話,這樣的問題很難被發(fā)現(xiàn)。因此,搭建監(jiān)控系統(tǒng)是非常必要的。
歡迎加入我們Fundebug的Docker技術(shù)交流群: 305097057。
版權(quán)聲明:
轉(zhuǎn)載時(shí)請注明作者Fundebug以及本文地址:
https://blog.fundebug.com/201...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/26915.html
摘要:不要用百度搜索中文資料,一定要看最新的英文資料。感謝感謝能容忍我無數(shù)次搞掛生產(chǎn)環(huán)境的老板。群蝸牛大神所建中文交流群,基本配置過程中遇到的問題都能得到解決。 前言 最近花了將近一個(gè)月的時(shí)間研究了 Docker 在生產(chǎn)環(huán)境中的使用,作為新手,期間走了無數(shù)的彎路,這里紀(jì)錄一下,希望給別人帶來微小的幫助。 前面幾部分,介紹了在搭建集群之前需要做的一些工作,后面 一塊結(jié)合實(shí)際應(yīng)用,介紹如何架構(gòu)...
摘要:應(yīng)該如何解決本文將給出若干提示,如何在生產(chǎn)環(huán)境中使用。路由匹配服務(wù)發(fā)現(xiàn)負(fù)載均衡跨容器通訊非??煽?。在單個(gè)端口上運(yùn)行一個(gè)服務(wù),節(jié)點(diǎn)的任意主機(jī)都可以訪問,負(fù)載均衡完全在后臺實(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,或者...
摘要:雖然可以使用相同的方式部署應(yīng)用到云端,使用外部負(fù)載均衡器,但動(dòng)態(tài)添加或者減少負(fù)載均衡節(jié)點(diǎn)依舊是痛點(diǎn)。這對使用外部負(fù)載均衡器幫助巨大。 數(shù)人云今天帶來的本篇文章將分享Docker在應(yīng)用程序生命周期每個(gè)階段中所扮演的角色,以及遷移到Swarm集群時(shí)需要考慮的問題。 利用Docker來開發(fā) Docker讓工作更輕松。如需要一個(gè)部署安裝MySQL數(shù)據(jù)庫,或者安裝Ghost,又或者Redis數(shù)據(jù)...
摘要:容器包的大小和完整性使得團(tuán)隊(duì)成員能夠在幾秒鐘內(nèi)部署完整的環(huán)境。由的前安全主管美國總統(tǒng)執(zhí)行辦公室網(wǎng)絡(luò)安全高級總監(jiān)聯(lián)合創(chuàng)立的,目前正在準(zhǔn)備類似的容器安全產(chǎn)品。在年,在美國召開了兩個(gè)大型會議和個(gè)小型會議。 軟件容器技術(shù)影響著從開發(fā)人員、測試人員、運(yùn)維人員到分析人員的IT團(tuán)隊(duì)中的每一個(gè)人,它不像虛擬化一樣只是系統(tǒng)管理員的工具。容器包的大小和完整性使得團(tuán)隊(duì)成員能夠在幾秒鐘內(nèi)部署完整的環(huán)境。 容器...
摘要:系列文章完全使用開發(fā)項(xiàng)目一安裝篇完全使用開發(fā)項(xiàng)目二配置篇問題反饋如果你在使用中遇到任何問題,請通過以下途徑聯(lián)系我提出在文章下方留言新建集群部署化項(xiàng)目每個(gè)項(xiàng)目中必須包含以下文件示例請查看化示例請查看配置文件配置文件啟動(dòng)在中定義,請自行調(diào)整 系列文章 完全使用 Docker 開發(fā) PHP 項(xiàng)目 (一): 安裝篇 完全使用 Docker 開發(fā) PHP 項(xiàng)目 (二): 配置篇 問題反饋 如...
閱讀 1080·2021-11-25 09:43
閱讀 702·2021-11-22 14:45
閱讀 3830·2021-09-30 09:48
閱讀 1068·2021-08-31 09:41
閱讀 1977·2019-08-30 13:52
閱讀 1982·2019-08-30 11:24
閱讀 1350·2019-08-30 11:07
閱讀 957·2019-08-29 12:15