摘要:注冊器監視每個守護進程的事件,并在生命周期事件期間自動更新。條件可以包括親和規則否定至軟強制意味著盡可能地避免。當使用通用標記如或部署服務時,可能會出現意外的后果。月日,北京海航萬豪酒店,容器技術大會即將舉行。
在這篇文章中,我們將討論如何用Rancher實現consul的服務發現。
如果你還沒有準備好,推薦你閱讀本系列中先前的文章:
第一篇:CI /CD和Docker入門
第二篇:使部署邏輯向使用Docker Compose更進一步
第三篇:借力Rancher完成容器編排
在這構建部署流水線系列的最后一篇文章中,我們將探討在轉換到Rancher進行集群調度時面臨的一些挑戰。在之前的文章中,我們通過使用Rancher執行調度,讓運維人員無須再負責選擇每一次容器運行的位置。要使用這個新方案,我們必須讓環境的其他部分知道調度程序放置這些服務的位置,以及如何訪問它們。我們還將討論如何使用標簽來操作調度程序,以調整容器放置位置,并避免端口綁定沖突。最后,我們將通過利用Rancher的回滾功能優化我們的升級過程。
在引入Rancher之前,我們的環境是一個相當靜態的環境。我們總是將容器部署到相同的主機上,而部署到不同的主機則意味著我們需要更新一些配置文件以反映新位置。例如,如果我們要添加"java-service-1"應用程序的一個附加實例,我們還需要更新load balancer以指向附加實例的IP。使用調度器讓我們無法預測容器部署的位置,并且我們需要動態配置環境,使其能自動適應變化。為此,我們需要使用服務注冊和服務發現。
服務注冊表為我們提供了應用程序在環境中的位置的單一來源。和硬編碼服務位置不同,我們的應用程序可以通過API查詢服務注冊表,并在我們的環境發生變化時自動重新配置。Rancher使用Rancher的DNS和元數據服務提供了開箱即用的服務發現。然而,混合使用Docker和非Docker應用程序時,我們不能完全依賴Rancher來處理服務發現。我們需要一個獨立的工具來跟蹤我們所有服務的位置,consul就符合這個要求。
我們不會詳細說明如何在您的環境中設置Consul,但是,我們將簡要描述我們在ABC公司使用Consul的方式。在每個環境中,我們都有一個部署為容器的Consul集群。我們在環境中的每個主機上都部署一個Consul代理,如果主機正在運行Docker,我們還會部署一個注冊器容器。注冊器監視每個守護進程的Docker事件API,并在生命周期事件期間自動更新Consul。例如,在新容器被部署后,注冊器會自動在Consul中注冊該服務。當容器被刪除時,注冊器撤銷它的注冊。
Consul服務列表在Consul中注冊所有服務后,我們可以在負載均衡器中運行consul-template,根據Consul中存儲的服務數據動態填充上游列表。對于我們的NGINX負載均衡器,我們可以創建一個模板來填充’java-service-1’應用程序的后端:
# upstreams.conf upstream java-service-1 { {{range _, $element := service "java-service-1"}} server {{.Address}}:{{.Port}}; {{else}} server 127.0.0.1:65535; # force a 502{{end}} }
此模板在Consul中查找注冊為“java-service-1”的服務的列表。然后它將循環該列表,添加具有該特定應用程序實例的IP地址和端口的服務線。如果在Consul中沒有注冊任何“java-service-1”應用程序,我們默認拋出502以避免NGINX中的錯誤。
我們可以在守護進程模式下運行consul-template,使其監控Consul的更改,在發生更改時重新渲染模板,然后重新加載NGINX以應用新配置。
TEMPLATE_FILE=/etc/nginx/upstreams.conf.tmpl RELOAD_CMD=/usr/sbin/nginx -s reload consul-template -consul consul.stage.abc.net:8500 -template "${TEMPLATE_FILE}:${TEMPLATE_FILE//.tmpl/}:${RELOAD_CMD}"
通過使用我們的負載均衡器設置來動態地改變其余的環境變化,我們可以完全依賴Rancher調度器來做出我們的服務應該在哪里運行的復雜的決定。但是,我們的“java-service-1”應用程序在Docker主機上綁定TCP端口8080,如果在同一主機上調度了多個應用程序容器,則會導致端口綁定沖突并最終失敗。為了避免這種情況,我們可以通過調度規則來操作調度器。
通過在docker-compose.yml文件中使用容器標簽來提出條件,是Rancher給我們的一種操作調度器的方法。條件可以包括親和規則、否定、至“軟”強制(意味著盡可能地避免)。在我們使用"java-service-1"應用程序的情況下,我們知道在給定時間只有一個容器可以在主機上運行,因此我們可以基于容器名稱設置反關聯性規則。這將使調度程序查找一個未運行名稱為“java-service-1”的容器的Docker主機。我們的docker-compose.yml文件看起來像下面這樣:
java-service-1: image: registry.abc.net/java-service-1:${VERSION} container_name: java-service-1 ports: - 8080:8080 labels: io.rancher.scheduler.affinity:container_label_ne: io.rancher.stack_service.name=java-service-1
注意“標簽”鍵的引入。所有調度規則都作為標簽被添加。標簽可以被添加到Docker主機和容器。當我們在Rancher注冊我們的主機時,我們可以將它們與標簽關聯,以后就可以切斷調度部署。例如,如果我們有一組使用SSD驅動器進行存儲優化的Docker主機,我們可以添加主機標簽storage=ssd。
Rancher主機標簽需要利用優化存儲主機的容器可以添加標簽來強制調度程序僅在匹配的主機上部署它們。我們將更新我們的“java-service-1”應用程序,以便只部署在存儲優化的主機上:
java-service-1:
image: registry.abc.net/java-service-1:${VERSION} container_name: java-service-1 ports: - 8080:8080 labels: io.rancher.scheduler.affinity:container_label_ne: io.rancher.stack_service.name=java-service-1 io.rancher.scheduler.affinity:host_label: storage=ssd
通過使用標簽,我們可以根據所需的容量,而不是個別主機運行特定的容器集,來精細地調整我們的應用程序部署。切換到Rancher進行集群調度,即使您仍然有必須在特定主機上運行的應用程序。
最后,我們可以利用Rancher的回滾功能優化我們的服務升級。在我們的部署工作流中,通過調用rancher-compose來指示Rancher在該服務堆棧上執行升級以部署服務。升級過程大致如下:
通過拉取一個新的鏡像來啟動升級
逐一地,現有容器被停止并且新容器被啟動
部署程序登錄到UI并選擇“完成升級”時,升級完成,
已停止的舊服務容器被刪除
Rancher升級當給定服務的部署非常少時,此工作流就好了。但是,當某個服務處于“升級”狀態(在部署者選擇“完成升級”之前)時,在執行“完成升級”或是“回滾”操作之前,你都不能對它進行任何新的升級”。rancher-compose實用程序讓我們可以選擇以編程方式選擇要執行的操作,以部署程序者的身份執行操作。例如,如果您對服務進行自動測試,則可以在rancher-compose升級返回后調用此類測試。根據這些測試的狀態,rancher-compose可以被再次調用,這次我們告訴堆棧“完成升級”或“回滾”。我們部署Jenkins作業的一個原始示例可能如下:
# for the full job, see part 3 of this series /usr/local/bin/rancher-compose --verbose -f ${docker_dir}/docker-compose.yml -r ${docker_dir}/rancher-compose.yml up -d --upgrade JAVA_SERVICE_1_URL=http://java-service-1.stage.abc.net:8080/api/v1/status if curl -s ${JAVA_SERVICE_1_URL} | grep -q "OK"; then # looks good, confirm or "finish" the upgrade /usr/local/bin/rancher-compose --verbose -f ${docker_dir}/docker-compose.yml -r ${docker_dir}/rancher-compose.yml up --confirm-upgrade else # looks like there"s an error, rollback the containers # to the previously deployed version /usr/local/bin/rancher-compose --verbose -f ${docker_dir}/docker-compose.yml -r ${docker_dir}/rancher-compose.yml up --rollback fi
這個邏輯將調用我們的應用程序端點來執行簡單的狀態檢查。如果輸出顯示的是‘OK’,那么我們完成升級,否則我們需要回滾到以前部署的版本。如果您沒有自動測試,另一個選擇是簡單地總是完成或“確認”升級。
# for the full job, see part 3 of this series /usr/local/bin/rancher-compose --verbose -f ${docker_dir}/docker-compose.yml -r ${docker_dir}/rancher-compose.yml up -d --upgrade --confirm-upgrade
如果不久以后,您確定需要回滾,就使用相同的部署作業簡單地重新部署以前的版本。這確實不像Rancher的升級和回滾功能那么友好,但它通過使堆棧不處于“升級”的狀態來解鎖將來的升級。
當服務在Rancher中回滾時,容器將被重新部署到以前的版本。當使用通用標記如“latest”或“master”部署服務時,可能會出現意外的后果。例如,讓我們假設"java-service-1"應用程序以前被部署了標簽"latest"。對圖像進行更改,推送到注冊表,Docker標簽“latest”被更新為指向此新映像我們使用標簽“latest”繼續升級,在測試后決定應用程序需要回滾。使用Rancher滾動堆棧仍然會重新部署最新的映像,因為標簽“latest”尚未被更新為指向上一個映像。回滾可以在純技術術語中實現,但是部署最近的工作副本的預期效果完全無法實現。在ABC公司,我們通過始終使用與應用程序版本相關的特定標記來避免這種情況。因此,不要使用標記latest”部署我們的“java-service-1”應用程序,我們可以使用版本標簽“1.0.1-22-7e56158”。這保證回滾將始終指向我們的應用程序在環境中的最新工作部署。
我們希望我們分享的經驗對你們有所幫助。這有助于我們有條不紊地采用Docker,穩步改進我們的流程,并讓我們的團隊能熟悉這些概念。對更自動化的部署工作流進行增量更改,使組織能夠更快地實現自動化的優勢,部署團隊可以更加務實地決定他們在流水線中需要什么。我們的經歷證明Rancher在可行性、自動化、甚至團隊協作方面都是成功的。我們希望分享這些我們在Docker應用過程中獲得的經驗教訓將有助于您自己的應用過程。
歡迎關注Rancher官方微信公眾號(RancherLabs),獲取第一手技術干貨推送;歡迎添加客服微信(RancherLabsChina)為好友,加入Rancher官方技術交流群,獲取免費技術支持,與數千Docker/Rancher使用者互動。
9月27日,北京海航萬豪酒店,容器技術大會Container Day 2017即將舉行。
CloudStack之父、海航科技技術總監、華為PaaS部門部長、恒豐銀行科技部總經理、阿里云PaaS工程總監、民生保險CIO······均已加入豪華講師套餐!
11家已容器落地企業,15位真·云計算大咖,13場純·技術演講,結合實戰場景,聚焦落地經驗。免費參會+超高規格,詳細議程及注冊鏈接請戳
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/27008.html
摘要:當面臨這些挑戰在短短半天的時間里,使用和現有的主機,我們已經將部署好并成功運行。使用來創建應用并定義服務。 在這一部分,我們將一步步的走進Rancher,細致的探討Rancher將如何解決在部署與容器管理時出現的種種的問題。回顧教程的第二部分,你會發現我們已經將應用的部署遷移至Docker Compose,并且已經建立了一系列工作步驟來部署我們的應用。這將使得開發人員能夠輕松的對他們的...
摘要:目前我們正采取措施,通過逐步改善現有過程來實現持續部署。在這篇文章中,我們將看看如何使用和來改善此設計。通過使用,在未來我們可以輕松地將構建和部署任務集成起來,從而得到額外的好處。月日,北京海航萬豪酒店,容器技術大會即將舉行。 在這一系列文章的第一篇中,我們分享了只用Docker時我們開發的初步的工作流,如何創建一個基礎的構建和部署流水線。容器的部署方式不再是在登陸server的時候從...
摘要:工程師選擇了環境中的一臺當前沒有在負載均衡器中被激活的主機。工程師登陸到這臺主機并從注冊表中獲取新的版本。在生產維護窗口中,更新負載均衡器使其指向更新過的主機。然而將部署代碼化的問題仍然存在。 這篇文章是一系列文章的第一篇,在這一系列文章中,我們想要分享我們如何使用Docker、Docker-Compose和Rancher完成容器部署工作流的故事。我們想帶你從頭開始走過pipeline...
摘要:在貓屎氤氳的霧氣里角仰望天花板,手機微信提醒這次構建成功或失敗,并附帶污言穢語。這時他可以開始往工位走,坐下時,微信又會提醒本次部署到成功或失敗。與企業微信的集成在決定使用之前,需要知道的是,是一個高度依賴社區的項目。 前言 相信我,一切事情的發生都是趕鴨子上架,沒有例外。人類所有偉大的變革都是迫不得已,可又是那么順其自然。比如容器(docker)技術的誕生,比如箭在弦上的創業,比如野...
摘要:本文作者為的架構師,他分享了使用和建立超高速流水線的經驗。月日,北京海航萬豪酒店,容器技術大會即將舉行。 Higher Education(highereducation.com)是一個連接學生與高校的入學申請平臺,通過引入高意圖和高質量的潛在學生,以及明確、有效的操作,為網站合作的大學吸引學生入學。每年Higher Education為其大學合作伙伴招收超過15000名在線學生入學申...
閱讀 3338·2022-01-04 14:20
閱讀 3106·2021-09-22 15:08
閱讀 2188·2021-09-03 10:44
閱讀 2314·2019-08-30 15:44
閱讀 1490·2019-08-29 18:40
閱讀 2654·2019-08-29 17:09
閱讀 2988·2019-08-26 13:53
閱讀 3220·2019-08-26 13:37