HOME 首頁
SERVICE 服務(wù)產(chǎn)品
XINMEITI 新媒體代運營
CASE 服務(wù)案例
NEWS 熱點資訊
ABOUT 關(guān)于我們
CONTACT 聯(lián)系我們
創(chuàng)意嶺
讓品牌有溫度、有情感
專注品牌策劃15年

    dockerswarm負載均衡(docker swarm負載均衡)

    發(fā)布時間:2023-04-08 12:11:31     稿源: 創(chuàng)意嶺    閱讀: 84        

    大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于dockerswarm負載均衡的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。

    開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等

    只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準,寫出的就越詳細,有微信小程序端、在線網(wǎng)頁版、PC客戶端

    官網(wǎng):https://ai.de1919.com。

    創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,如需了解SEO相關(guān)業(yè)務(wù)請撥打電話175-8598-2043,或添加微信:1454722008

    本文目錄:

    dockerswarm負載均衡(docker swarm負載均衡)

    一、使用 Docker Stack 部署多服務(wù)集群

    單機模式下,我們可以使用 Docker Compose 來編排多個服務(wù),而在 上一篇文章 中介紹的 Docker Swarm 只能實現(xiàn)對單個服務(wù)的簡單部署。于是就引出了本文的主角 Docker Stack ,通過 Docker Stack 我們只需對已有的 docker-compose.yml 配置文件稍加改造就可以完成 Docker 集群環(huán)境下的多服務(wù)編排。

    注意:如果有多個 manager 節(jié)點,portainer 和 visualizer 可能分別部署在兩臺機器上,所以ip可能會不一樣。

    評論區(qū)有小伙伴提到,容器間通過服務(wù)名 ( 比如文中的 nginx ) 通訊時,對應(yīng)的 IP 卻和容器的實際 IP 對不上。出現(xiàn)這個情況是因為負載均衡( 對外表現(xiàn)為一個服務(wù),內(nèi)部為多個服務(wù) )。下面是我做的試驗,希望能幫助大家理解。

    總結(jié)下:

    整個請求的調(diào)用流程應(yīng)該就是: 通過服務(wù)名 nginx 訪問 -- 指向 --> stack 集群網(wǎng)關(guān) ( 10.0.6.5 ) -- 轉(zhuǎn)發(fā) --> stack 集群中,位于當前服務(wù)器的負載均衡實例 ( 10.0.6.4 ) -- 分發(fā) --> 最終的應(yīng)用 。

    二、微服務(wù)架構(gòu):基于微服務(wù)和Docker容器技術(shù)的PaaS云平臺架構(gòu)設(shè)計

    基于微服務(wù)架構(gòu)和Docker容器技術(shù)的PaaS云平臺建設(shè)目標是給我們的開發(fā)人員提供一套服務(wù)快速開發(fā)、部署、運維管理、持續(xù)開發(fā)持續(xù)集成的流程。平臺提供基礎(chǔ)設(shè)施、中間件、數(shù)據(jù)服務(wù)、云服務(wù)器等資源,開發(fā)人員只需要開發(fā)業(yè)務(wù)代碼并提交到平臺代碼庫,做一些必要的配置,系統(tǒng)會自動構(gòu)建、部署,實現(xiàn)應(yīng)用的敏捷開發(fā)、快速迭代。在系統(tǒng)架構(gòu)上,PaaS云平臺主要分為微服務(wù)架構(gòu)、Docker容器技術(shù)、DveOps三部分,這篇文章重點介紹微服務(wù)架構(gòu)的實施。

    如果想學(xué)習(xí)Java工程化、高性能及分布式、深入淺出。微服務(wù)、Spring,MyBatis,Netty源碼分析的朋友可以加我的Java高級交流:854630135,群里有阿里大牛直播講解技術(shù),以及Java大型互聯(lián)網(wǎng)技術(shù)的視頻免費分享給大家。

    實施微服務(wù)需要投入大量的技術(shù)力量來開發(fā)基礎(chǔ)設(shè)施,這對很多公司來說顯然是不現(xiàn)實的,別擔(dān)心,業(yè)界已經(jīng)有非常優(yōu)秀的開源框架供我們參考使用。目前業(yè)界比較成熟的微服務(wù)框架有Netflix、Spring Cloud和阿里的Dubbo等。Spring Cloud是基于Spring Boot的一整套實現(xiàn)微服務(wù)的框架,它提供了開發(fā)微服務(wù)所需的組件,跟Spring Boot一起使用的話開發(fā)微服務(wù)架構(gòu)的云服務(wù)會變的很方便。Spring Cloud包含很多子框架,其中Spring Cloud Netflix是其中的一套框架,在我們的微服務(wù)架構(gòu)設(shè)計中,就使用了很多Spring Cloud Netflix框架的組件。Spring Cloud Netflix項目的時間還不長,相關(guān)的文檔資料很少,博主當時研究這套框架啃了很多英文文檔,簡直痛苦不堪。對于剛開始接觸這套框架的同學(xué),要搭建一套微服務(wù)應(yīng)用架構(gòu),可能會不知道如何下手,接下來介紹我們的微服務(wù)架構(gòu)搭建過程以及 需要那些 框架或組件來支持微服務(wù)架構(gòu)。

    為了直接明了的展示微服務(wù)架構(gòu)的組成及原理,畫了一張系統(tǒng)架構(gòu)圖,如下:

    從上圖可以看出,微服務(wù)訪問大致路徑為:外部請求 → 負載均衡 → 服務(wù)網(wǎng)關(guān)(GateWay)→ 微服務(wù) → 數(shù)據(jù)服務(wù)/消息服務(wù)。服務(wù)網(wǎng)關(guān)和微服務(wù)都會用到服務(wù)注冊和發(fā)現(xiàn)來調(diào)用依賴的其他服務(wù),各服務(wù)集群都能通過配置中心服務(wù)來獲得配置信息。

    服務(wù)網(wǎng)關(guān)(GateWay)

    網(wǎng)關(guān)是外界系統(tǒng)(如:客戶端瀏覽器、移動設(shè)備等)和企業(yè)內(nèi)部系統(tǒng)之間的一道門,所有的客戶端請求通過網(wǎng)關(guān)訪問后臺服務(wù)。為了應(yīng)對高并發(fā)訪問,服務(wù)網(wǎng)關(guān)以集群形式部署,這就意味著需要做負載均衡,我們采用了亞馬遜EC2作為虛擬云服務(wù)器,采用ELB(Elastic Load Balancing)做負載均衡。EC2具有自動配置容量功能,當用戶流量達到尖峰,EC2可以自動增加更多的容量以維持虛擬主機的性能。ELB彈性負載均衡,在多個實例間自動分配應(yīng)用的傳入流量。為了保證安全性,客戶端請求需要使用https加密保護,這就需要我們進行SSL卸載,使用Nginx對加密請求進行卸載處理。外部請求經(jīng)過ELB負載均衡后路由到GateWay集群中的某個GateWay服務(wù),由GateWay服務(wù)轉(zhuǎn)發(fā)到微服務(wù)。服務(wù)網(wǎng)關(guān)作為內(nèi)部系統(tǒng)的邊界,它有以下基本能力:

    1、動態(tài)路由:動態(tài)的將請求路由到所需要的后端服務(wù)集群。雖然內(nèi)部是復(fù)雜的分布式微服務(wù)網(wǎng)狀結(jié)構(gòu),但是外部系統(tǒng)從網(wǎng)關(guān)看就像是一個整體服務(wù),網(wǎng)關(guān)屏蔽了后端服務(wù)的復(fù)雜性。

    2、限流和容錯:為每種類型的請求分配容量,當請求數(shù)量超過閥值時拋掉外部請求,限制流量,保護后臺服務(wù)不被大流量沖垮;黨內(nèi)部服務(wù)出現(xiàn)故障時直接在邊界創(chuàng)建一些響應(yīng),集中做容錯處理,而不是將請求轉(zhuǎn)發(fā)到內(nèi)部集群,保證用戶良好的體驗。

    3、身份認證和安全性控制:對每個外部請求進行用戶認證,拒絕沒有通過認證的請求,還能通過訪問模式分析,實現(xiàn)反爬蟲功能。

    4、監(jiān)控:網(wǎng)關(guān)可以收集有意義的數(shù)據(jù)和統(tǒng)計,為后臺服務(wù)優(yōu)化提供數(shù)據(jù)支持。

    5、訪問日志:網(wǎng)關(guān)可以收集訪問日志信息,比如訪問的是哪個服務(wù)?處理過程(出現(xiàn)什么異常)和結(jié)果?花費多少時間?通過分析日志內(nèi)容,對后臺系統(tǒng)做進一步優(yōu)化。

    我們采用Spring Cloud Netflix框架的開源組件Zuul來實現(xiàn)網(wǎng)關(guān)服務(wù)。Zuul使用一系列不同類型的過濾器(Filter),通過重寫過濾器,使我們能夠靈活的實現(xiàn)網(wǎng)關(guān)(GateWay)的各種功能。

    如果想學(xué)習(xí)Java工程化、高性能及分布式、深入淺出。微服務(wù)、Spring,MyBatis,Netty源碼分析的朋友可以加我的Java高級交流:854630135,群里有阿里大牛直播講解技術(shù),以及Java大型互聯(lián)網(wǎng)技術(shù)的視頻免費分享給大家。

    服務(wù)注冊與發(fā)現(xiàn)

    由于微服務(wù)架構(gòu)是由一系列職責(zé)單一的細粒度服務(wù)構(gòu)成的網(wǎng)狀結(jié)構(gòu),服務(wù)之間通過輕量機制進行通信,這就引入了服務(wù)注冊與發(fā)現(xiàn)的問題,服務(wù)的提供方要注冊報告服務(wù)地址,服務(wù)調(diào)用放要能發(fā)現(xiàn)目標服務(wù)。我們的微服務(wù)架構(gòu)中使用了Eureka組件來實現(xiàn)服務(wù)的注冊與發(fā)現(xiàn)。所有的微服務(wù)(通過配置Eureka服務(wù)信息)到Eureka服務(wù)器中進行注冊,并定時發(fā)送心跳進行 健康 檢查,Eureka默認配置是30秒發(fā)送一次心跳,表明服務(wù)仍然處于存活狀態(tài),發(fā)送心跳的時間間隔可以通過Eureka的配置參數(shù)自行配置,Eureka服務(wù)器在接收到服務(wù)實例的最后一次心跳后,需要等待90秒(默認配置90秒,可以通過配置參數(shù)進行修改)后,才認定服務(wù)已經(jīng)死亡(即連續(xù)3次沒有接收到心跳),在Eureka自我保護模式關(guān)閉的情況下會清除該服務(wù)的注冊信息。所謂的自我保護模式是指,出現(xiàn)網(wǎng)絡(luò)分區(qū)、Eureka在短時間內(nèi)丟失過多的服務(wù)時,會進入自我保護模式,即一個服務(wù)長時間沒有發(fā)送心跳,Eureka也不會將其刪除。自我保護模式默認為開啟,可以通過配置參數(shù)將其設(shè)置為關(guān)閉狀態(tài)。

    Eureka服務(wù)以集群的方式部署(在博主的另一篇文章中詳細介紹了Eureka集群的部署方式),集群內(nèi)的所有Eureka節(jié)點會定時自動同步微服務(wù)的注冊信息,這樣就能保證所有的Eureka服務(wù)注冊信息保持一致。那么在Eureka集群里,Eureka節(jié)點是如何發(fā)現(xiàn)其他節(jié)點的呢?我們通過DNS服務(wù)器來建立所有Eureka節(jié)點的關(guān)聯(lián),在部署Eureka集群之外還需要搭建DNS服務(wù)器。

    當網(wǎng)關(guān)服務(wù)轉(zhuǎn)發(fā)外部請求或者是后臺微服務(wù)之間相互調(diào)用時,會去Eureka服務(wù)器上查找目標服務(wù)的注冊信息,發(fā)現(xiàn)目標服務(wù)并進行調(diào)用,這樣就形成了服務(wù)注冊與發(fā)現(xiàn)的整個流程。Eureka的配置參數(shù)數(shù)量很多,多達上百個,博主會在另外的文章里詳細說明。

    微服務(wù)部署

    微服務(wù)是一系列職責(zé)單一、細粒度的服務(wù),是將我們的業(yè)務(wù)進行拆分為獨立的服務(wù)單元,伸縮性好,耦合度低,不同的微服務(wù)可以用不同的語言開發(fā),每一個服務(wù)處理的單一的業(yè)務(wù)。微服務(wù)可以劃分為前端服務(wù)(也叫邊緣服務(wù))和后端服務(wù)(也叫中間服務(wù)),前端服務(wù)是對后端服務(wù)做必要的聚合和剪裁后暴露給外部不同的設(shè)備(PC、Phone等),所有的服務(wù)啟動時都會到Eureka服務(wù)器進行注冊,服務(wù)之間會有錯綜復(fù)雜的依賴關(guān)系。當網(wǎng)關(guān)服務(wù)轉(zhuǎn)發(fā)外部請求調(diào)用前端服務(wù)時,通過查詢服務(wù)注冊表就可以發(fā)現(xiàn)目標服務(wù)進行調(diào)用,前端服務(wù)調(diào)用后端服務(wù)時也是同樣的道理,一次請求可能涉及到多個服務(wù)之間的相互調(diào)用。由于每個微服務(wù)都是以集群的形式部署,服務(wù)之間相互調(diào)用的時候需要做負載均衡,因此每個服務(wù)中都有一個LB組件用來實現(xiàn)負載均衡。

    微服務(wù)以鏡像的形式,運行在Docker容器中。Docker容器技術(shù)讓我們的服務(wù)部署變得簡單、高效。傳統(tǒng)的部署方式,需要在每臺服務(wù)器上安裝運行環(huán)境,如果我們的服務(wù)器數(shù)量龐大,在每臺服務(wù)器上安裝運行環(huán)境將是一項無比繁重的工作,一旦運行環(huán)境發(fā)生改變,就不得不重新安裝,這簡直是災(zāi)難性的。而使用Docker容器技術(shù),我們只需要將所需的基礎(chǔ)鏡像(jdk等)和微服務(wù)生成一個新的鏡像,將這個最終的鏡像部署在Docker容器中運行,這種方式簡單、高效,能夠快速部署服務(wù)。每個Docker容器中可以運行多個微服務(wù),Docker容器以集群的方式部署,使用Docker Swarm對這些容器進行管理。我們創(chuàng)建一個鏡像倉庫用來存放所有的基礎(chǔ)鏡像以及生成的最終交付鏡像,在鏡像倉庫中對所有鏡像進行管理。

    服務(wù)容錯

    微服務(wù)之間存在錯綜復(fù)雜的依賴關(guān)系,一次請求可能會依賴多個后端服務(wù),在實際生產(chǎn)中這些服務(wù)可能會產(chǎn)生故障或者延遲,在一個高流量的系統(tǒng)中,一旦某個服務(wù)產(chǎn)生延遲,可能會在短時間內(nèi)耗盡系統(tǒng)資源,將整個系統(tǒng)拖垮,因此一個服務(wù)如果不能對其故障進行隔離和容錯,這本身就是災(zāi)難性的。我們的微服務(wù)架構(gòu)中使用了Hystrix組件來進行容錯處理。Hystrix是Netflix的一款開源組件,它通過熔斷模式、隔離模式、回退(fallback)和限流等機制對服務(wù)進行彈性容錯保護,保證系統(tǒng)的穩(wěn)定性。

    1、熔斷模式:熔斷模式原理類似于電路熔斷器,當電路發(fā)生短路時,熔斷器熔斷,保護電路避免遭受災(zāi)難性損失。當服務(wù)異常或者大量延時,滿足熔斷條件時服務(wù)調(diào)用方會主動啟動熔斷,執(zhí)行fallback邏輯直接返回,不會繼續(xù)調(diào)用服務(wù)進一步拖垮系統(tǒng)。熔斷器默認配置服務(wù)調(diào)用錯誤率閥值為50%,超過閥值將自動啟動熔斷模式。服務(wù)隔離一段時間以后,熔斷器會進入半熔斷狀態(tài),即允許少量請求進行嘗試,如果仍然調(diào)用失敗,則回到熔斷狀態(tài),如果調(diào)用成功,則關(guān)閉熔斷模式。

    2、隔離模式:Hystrix默認采用線程隔離,不同的服務(wù)使用不同的線程池,彼此之間不受影響,當一個服務(wù)出現(xiàn)故障耗盡它的線程池資源,其他的服務(wù)正常運行不受影響,達到隔離的效果。例如我們通過andThreadPoolKey配置某個服務(wù)使用命名為TestThreadPool的線程池,實現(xiàn)與其他命名的線程池隔離。

    3、回退(fallback):fallback機制其實是一種服務(wù)故障時的容錯方式,原理類似Java中的異常處理。只需要繼承HystixCommand并重寫getFallBack()方法,在此方法中編寫處理邏輯,比如可以直接拋異常(快速失?。?,可以返回空值或缺省值,也可以返回備份數(shù)據(jù)等。當服務(wù)調(diào)用出現(xiàn)異常時,會轉(zhuǎn)向執(zhí)行g(shù)etFallBack()。有以下幾種情況會觸發(fā)fallback:

    1)程序拋出非HystrixBadRequestExcepption異常,當拋出HystrixBadRequestExcepption異常時,調(diào)用程序可以捕獲異常,沒有觸發(fā)fallback,當拋出其他異常時,會觸發(fā)fallback;

    2)程序運行超時;

    3)熔斷啟動;

    4)線程池已滿。

    4、限流: 限流是指對服務(wù)的并發(fā)訪問量進行限制,設(shè)置單位時間內(nèi)的并發(fā)數(shù),超出限制的請求拒絕并fallback,防止后臺服務(wù)被沖垮。

    Hystix使用命令模式HystrixCommand包裝依賴調(diào)用邏輯,這樣相關(guān)的調(diào)用就自動處于Hystrix的彈性容錯保護之下。調(diào)用程序需要繼承HystrixCommand并將調(diào)用邏輯寫在run()中,使用execute()(同步阻塞)或queue()(異步非阻塞)來觸發(fā)執(zhí)行run()。

    動態(tài)配置中心

    微服務(wù)有很多依賴配置,某些配置參數(shù)在服務(wù)運行期間可能還要動態(tài)修改,比如:根據(jù)訪問流量動態(tài)調(diào)整熔斷閥值。傳統(tǒng)的實現(xiàn)信息配置的方法,比如放在xml、yml等配置文件中,和應(yīng)用一起打包,每次修改都要重新提交代碼、打包構(gòu)建、生成新的鏡像、重新啟動服務(wù),效率太低,這樣顯然是不合理的,因此我們需要搭建一個動態(tài)配置中心服務(wù)支持微服務(wù)動態(tài)配置。我們使用Spring Cloud的configserver服務(wù)幫我們實現(xiàn)動態(tài)配置中心的搭建。我們開發(fā)的微服務(wù)代碼都存放在git服務(wù)器私有倉庫里面,所有需要動態(tài)配置的配置文件存放在git服務(wù)器下的configserver(配置中心,也是一個微服務(wù))服務(wù)中,部署到Docker容器中的微服務(wù)從git服務(wù)器動態(tài)讀取配置文件的信息。當本地git倉庫修改代碼后push到git服務(wù)器倉庫,git服務(wù)端hooks(post-receive,在服務(wù)端完成代碼更新后會自動調(diào)用)自動檢測是否有配置文件更新,如果有,git服務(wù)端通過消息隊列給配置中心(configserver,一個部署在容器中的微服務(wù))發(fā)消息,通知配置中心刷新對應(yīng)的配置文件。這樣微服務(wù)就能獲取到最新的配置文件信息,實現(xiàn)動態(tài)配置。

    以上這些框架或組件是支撐實施微服務(wù)架構(gòu)的核心,在實際生產(chǎn)中,我們還會用到很多其他的組件,比如日志服務(wù)組件、消息服務(wù)組件等等,根據(jù)業(yè)務(wù)需要自行選擇使用。在我們的微服務(wù)架構(gòu)實施案例中,參考使用了很多Spring Cloud Netflix框架的開源組件,主要包括Zuul(服務(wù)網(wǎng)關(guān))、Eureka(服務(wù)注冊與發(fā)現(xiàn))、Hystrix(服務(wù)容錯)、Ribbon(客戶端負載均衡)等。這些優(yōu)秀的開源組件,為我們實施微服務(wù)架構(gòu)提供了捷徑。

    如果想學(xué)習(xí)Java工程化、高性能及分布式、深入淺出。微服務(wù)、Spring,MyBatis,Netty源碼分析的朋友可以加我的Java高級交流:854630135,群里有阿里大牛直播講解技術(shù),以及Java大型互聯(lián)網(wǎng)技術(shù)的視頻免費分享給大家。

    三、生產(chǎn)環(huán)境,測試環(huán)境中,Docker 可以做什么

    生產(chǎn)環(huán)境,測試環(huán)境中,Docker 可以做什么

    Docker 是容器管理工具

    Docker

    是一個輕量級、便攜式、與外界隔離的容器,也是一個可以在容器中很方便地構(gòu)建、傳輸、運行應(yīng)用的引擎。和傳統(tǒng)的虛擬化技術(shù)不同的是,Docker

    引擎并不虛擬出一臺虛擬機,而是直接使用宿主機的內(nèi)核和硬件,直接在宿主機上運行容器內(nèi)應(yīng)用。也正是得益于此,Docker

    容器內(nèi)運行的應(yīng)用和宿主機上運行的應(yīng)用性能差距幾乎可以忽略不計。

    但是 Docker 本身并不是一個容器系統(tǒng),而是一個基于原有的容器化工具 LXC 用來創(chuàng)建虛擬環(huán)境的工具。類似 LXC 的工具已經(jīng)在生產(chǎn)環(huán)境中使用多年,Docker 則基于此提供了更加友好的鏡像管理工具和部署工具。

    Docker 不是虛擬化引擎

    Docker 第一次發(fā)布的時候,很多人都拿 Docker 和虛擬機 VMware、KVM 和 VirtualBox

    比較。盡管從功能上看,Docker 和虛擬化技術(shù)致力于解決的問題都差不多,但是 Docker

    卻是采取了另一種非常不同的方式。虛擬機是虛擬出一套硬件,虛擬機的系統(tǒng)進行的磁盤操作,其實都是在對虛擬出來的磁盤進行操作。當運行 CPU

    密集型的任務(wù)時,是虛擬機把虛擬系統(tǒng)里的 CPU

    指令“翻譯”成宿主機的CPU指令并進行執(zhí)行。兩個磁盤層,兩個處理器調(diào)度器,兩個操作系統(tǒng)消耗的內(nèi)存,所有虛擬出的這些都會帶來相當多的性能損失,一臺虛擬機所消耗的硬件資源和對應(yīng)的硬件相當,一臺主機上跑太多的虛擬機之后就會過載。而

    Docker 就沒有這種顧慮。Docker 運行應(yīng)用采取的是“容器”的解決方案:使用 namespace 和 CGroup

    進行資源限制,和宿主機共享內(nèi)核,不虛擬磁盤,所有的容器磁盤操作其實都是對 /var/lib/docker/

    的操作。簡言之,Docker 其實只是在宿主機中運行了一個受到限制的應(yīng)用程序。

    從上面不難看出,容器和虛擬機的概念并不相同,容器也并不能取代虛擬機。在容器力所不能及的地方,虛擬機可以大顯身手。例如:宿主機是

    Linux,只能通過虛擬機運行 Windows,Docker 便無法做到。再例如,宿主機是 Windows,Windows 并不能直接運行

    Docker,Windows上的 Docker 其實是運行在 VirtualBox 虛擬機里的。

    Docker 使用層級的文件系統(tǒng)

    前面提到過,Docker 和現(xiàn)有容器技術(shù) LXC 等相比,優(yōu)勢之一就是 Docker 提供了鏡像管理。對于 Docker

    而言,鏡像是一個靜態(tài)的、只讀的容器文件系統(tǒng)的快照。然而不僅如此,Docker

    中所有的磁盤操作都是對特定的Copy-On-Write文件系統(tǒng)進行的。下面通過一個例子解釋一下這個問題。

    例如我們要建立一個容器運行 JAVA Web 應(yīng)用,那么我們應(yīng)該使用一個已經(jīng)安裝了 JAVA 的鏡像。在

    Dockerfile(一個用于生成鏡像的指令文件)中,應(yīng)該指明“基于 JAVA 鏡像”,這樣 Docker 就會去 Docker Hub

    Registry 上下載提前構(gòu)建好的 JAVA 鏡像。然后再 Dockerfile 中指明下載并解壓 Apache Tomcat 軟件到 /opt/tomcat

    文件夾中。這條命令并不會對原有的 JAVA 鏡像產(chǎn)生任何影響,而僅僅是在原有鏡像上面添加了一個改動層。當一個容器啟動時,容器內(nèi)的所有改動層都會啟動,容器會從第一層中運行 /usr/bin/java

    命令,并且調(diào)用另外一層中的 /opt/tomcat/bin

    命令。實際上,Dockerfile 中每一條指令都會產(chǎn)生一個新的改動層,即便只有一個文件被改動。如果用過 Git

    就能更清楚地認識這一點,每條指令就像是每次 mit,都會留下記錄。但是對于 Docker

    來說,這種文件系統(tǒng)提供了更大的靈活性,也可以更方便地管理應(yīng)用程序。

    我們Spantree的團隊有一個自己維護的含有 Tomcat 的鏡像。發(fā)布新版本也非常簡單:使用 Dockerfile

    將新版本拷貝進鏡像從而創(chuàng)建一個新鏡像,然后給新鏡像貼上版本的標簽。不同版本的鏡像的不同之處僅僅是一個 90 MB 大小的 WAR

    文件,他們所基于的主鏡像都是相同的。如果使用虛擬機去維護這些不同的版本的話,還要消耗掉很多不同的磁盤去存儲相同的系統(tǒng),而使用 Docker

    就只需要很小的磁盤空間。即便我們同時運行這個鏡像的很多實例,我們也只需要一個基礎(chǔ)的 JAVA / TOMCAT 鏡像。

    Docker 可以節(jié)約時間

    很多年前我在為一個連鎖餐廳開發(fā)軟件時,僅僅是為了描述如何搭建環(huán)境都需要寫一個 12 頁的 Word 文檔。例如本地 Oracle

    數(shù)據(jù)庫,特定版本的

    JAVA,以及其他七七八八的系統(tǒng)工具和共享庫、軟件包。整個搭建過程浪費掉了我們團隊每個人幾乎一天的時間,如果用金錢衡量的話,花掉了我們上萬美金的時間成本。雖然客戶已經(jīng)對這種事情習(xí)以為常,甚至認為這是引入新成員、讓成員適應(yīng)環(huán)境、讓自己的員工適應(yīng)我們的軟件所必須的成本,但是相比較起來,我們寧愿把更多的時間花在為客戶構(gòu)建可以增進業(yè)務(wù)的功能上面。

    如果當時有 Docker,那么構(gòu)建環(huán)境就會像使用自動化搭建工具 Puppet / Chef / Salt / Ansible

    一樣簡單,我們也可以把整個搭建時間周期從一天縮短為幾分鐘。但是和這些工具不同的地方在于,Docker

    可以不僅僅可以搭建整個環(huán)境,還可以將整個環(huán)境保存成磁盤文件,然后復(fù)制到別的地方。需要從源碼編譯 Node.js 嗎?Docker

    做得到。Docker 不僅僅可以構(gòu)建一個 Node.js 環(huán)境,還可以將整個環(huán)境做成鏡像,然后保存到任何地方。當然,由于 Docker

    是一個容器,所以不用擔(dān)心容器內(nèi)執(zhí)行的東西會對宿主機產(chǎn)生任何的影響。

    現(xiàn)在新加入我們團隊的人只需要運行 docker-pose up

    命令,便可以喝杯咖啡,然后開始工作了。

    Docker 可以節(jié)省開銷

    當然,時間就是金錢。除了時間外,Docker 還可以節(jié)省在基礎(chǔ)設(shè)施硬件上的開銷。高德納和麥肯錫的研究表明,數(shù)據(jù)中心的利用率在 6% -

    12% 左右。不僅如此,如果采用虛擬機的話,你還需要被動地監(jiān)控和設(shè)置每臺虛擬機的 CPU 硬盤和內(nèi)存的使用率,因為采用了靜態(tài)分區(qū)(static

    partitioning)所以資源并不能完全被利用。。而容器可以解決這個問題:容器可以在實例之間進行內(nèi)存和磁盤共享。你可以在同一臺主機上運行多個服務(wù)、可以不用去限制容器所消耗的資源、可以去限制資源、可以在不需要的時候停止容器,也不用擔(dān)心啟動已經(jīng)停止的程序時會帶來過多的資源消耗。凌晨三點的時候只有很少的人會去訪問你的網(wǎng)站,同時你需要比較多的資源執(zhí)行夜間的批處理任務(wù),那么可以很簡單的便實現(xiàn)資源的交換。

    虛擬機所消耗的內(nèi)存、硬盤、CPU 都是固定的,一般動態(tài)調(diào)整都需要重啟虛擬機。而用 Docker 的話,你可以進行資源限制,得益于

    CGroup,可以很方便動態(tài)調(diào)整資源限制,讓然也可以不進行資源限制。Docker

    容器內(nèi)的應(yīng)用對宿主機而言只是兩個隔離的應(yīng)用程序,并不是兩個虛擬機,所以宿主機也可以自行去分配資源。

    Docker 有一個健壯的鏡像托管系統(tǒng)

    前面提到過,這個托管系統(tǒng)就叫做 Docker Hub Registry。截止到 2015年4月29日,互聯(lián)網(wǎng)上大約有 14000

    個公共的 Docker,而大部分都被托管在 Docker Hub 上面。和 Github 已經(jīng)很大程度上成為開源項目的代表一樣,Docker

    官方的 Docker Hub 則已經(jīng)是公共 Docker 鏡像的代表。這些鏡像可以作為你應(yīng)用和數(shù)據(jù)服務(wù)的基礎(chǔ)。

    也正是得益于此,你可以隨意嘗試最新的技術(shù):說不定有些人就把圖形化數(shù)據(jù)庫的實例打包成了 Docker 鏡像托管在上面。再例如

    Gitlab,手工搭建 Gitlab 非常困難,譯者不建議普通用戶去手工搭建,而如果使用 Docker

    Gitlab,這個鏡像則會五秒內(nèi)便搭建完成。再例如特定 Ruby 版本的 Rails 應(yīng)用,再例如 Linux 上的 .NET

    應(yīng)用,這些都可以使用簡單的一條 Docker 命令搭建完成。

    Docker 官方鏡像都有 official 標簽,安全性可以保證。但是第三方鏡像的安全性無法保證,所以請謹慎下載第三方鏡像。生產(chǎn)環(huán)境下可以只使用第三方提供的 Dockerfile 構(gòu)建鏡像。

    Docker Github 介紹:5 秒內(nèi)搞定一個 Gitlab

    關(guān)于 Linux 上的 .NET 應(yīng)用和 Rails 應(yīng)用,將會在以后的文章中做詳細介紹。

    Docker 可以避免產(chǎn)生 Bug

    Spantree 一直是“固定基礎(chǔ)設(shè)置”(immutable

    infrastructure)的狂熱愛好者。換句話說,除非有心臟出血這種漏洞,我們盡量不對系統(tǒng)做升級,也盡量不去改變系統(tǒng)的設(shè)置。當添加新服務(wù)器的時候,我們也會從頭構(gòu)建服務(wù)器的系統(tǒng),然后直接將鏡像導(dǎo)入,將服務(wù)器放入負載均衡的集群里,然后對要退休的服務(wù)器進行健康檢查,檢查完畢后移除集群。得益于

    Docker 鏡像可以很輕松的導(dǎo)入導(dǎo)出,我們可以最大程度地減少因為環(huán)境和版本問題導(dǎo)致的不兼容,即便有不兼容了也可以很輕松地回滾。當然,有了

    Docker,我們在生產(chǎn)、測試和開發(fā)中的運行環(huán)境得到統(tǒng)一。以前在協(xié)同開發(fā)時,會因為每個人開發(fā)的電腦配置不同而導(dǎo)致“在我的電腦上是能運行的,你的怎么不行”的情況,而如今

    Docker 已經(jīng)幫我們解決了這個問題。

    Docker 目前只能運行在 Linux 上

    前面也提到過,Docker 使用的是經(jīng)過長時間生產(chǎn)環(huán)境檢驗的技術(shù),雖然這些技術(shù)已經(jīng)都出現(xiàn)很長時間了,但是大部分技術(shù)都還是 Linux

    獨有的,例如 LXC 和 Cgroup。也就是說,截止到現(xiàn)在,Docker 容器內(nèi)只能在 Linux 上運行 Linux

    上的服務(wù)和應(yīng)用。Microsoft 正在和 Docker 緊密合作,并且已經(jīng)宣布了下一個版本的 Windows Server 將會支持

    Docker 容器,并且命名為 Windows Docker,估計采用的技術(shù)應(yīng)該是Hyper-V

    Container,我們有望在未來的幾年內(nèi)看到這個版本。

    Docker是一個為開發(fā)人員和系統(tǒng)管理員開發(fā)、遷移和運行應(yīng)用程序的平臺。應(yīng)用程序通過Docker打包成DockerImage后,可以實現(xiàn)統(tǒng)一的方式來下載、啟動、擴展、刪除和遷移,這樣方便了應(yīng)用程序的部署和運維。本文將介紹如何在不同操作系統(tǒng)平臺上部署Docker環(huán)境的方法。信息Ubuntu:Docker剛推出的時候只支持Ubuntu,后來才一點點開始對其他平臺的支持。所以在Ubuntu平臺上部署Docker平臺還是挺簡單的。官方目前支持的版本有UbuntuTrusty14.04(LTS)、UbuntuPrecise12.04(LTS)、UbuntuSaucy13.10。Docker要求64位的系統(tǒng)且內(nèi)核版本至少為3.10(如果是Ubuntu12.04LTS,則要求內(nèi)核版本至少是3.13)??梢允褂胾name–r命令來確認當前系統(tǒng)的內(nèi)核版本:$uname-r3.11.0-15-generic可以使用以下命令來升級內(nèi)核:$sudoapt-getupdate$sudoapt-getinstalllinux-image-generic-lts-trusty$sudoreboot之后就可以安裝Docker了:$wget-qO-/boot2docker/osx-installer/releases/latest獲得。安裝完成后,Boot2Docker位于Applications文件夾。注:Boot2Docker目前只是作為開發(fā)工具發(fā)布,請不要將其應(yīng)用在生產(chǎn)環(huán)境中。創(chuàng)建Boot2Docker虛擬機:$boot2dockerinit$boot2dockerstart$boot2dockershellinit顯示或設(shè)置Docker客戶端環(huán)境變量$boot2dockershellinit$eval"$(boot2dockershellinit)"最后驗證安裝是否成功:$dockerrunhello-worldWindows:Windows與MACOS相同,也需要安裝Boot2Docker工具。安裝文件可以在/boot2docker/windows-installer/releases/latest獲得。Windows版的Boot2Docker在啟動時會自動確認環(huán)境變量,因此可以直接驗證安裝是否成功:$dockerrunhello-world。

    測試環(huán)境和生產(chǎn)環(huán)境能互相轉(zhuǎn)換么

    大家做etl任務(wù)分測試環(huán)境和生產(chǎn)環(huán)境嗎,各個環(huán)境之間怎么切換呢?

    一般分 開發(fā),測試,uat,生產(chǎn)環(huán)境。切換的話先導(dǎo)出資源庫,在導(dǎo)入即可。

    怎樣利用鏡像將生產(chǎn)環(huán)境復(fù)制到測試環(huán)境

    通常企業(yè)不會直接導(dǎo)數(shù)據(jù),而是復(fù)制整個生產(chǎn)環(huán)境作為測試環(huán)境,這樣可以保證測試環(huán)境的配置和正式系統(tǒng)的一樣。

    目前測試環(huán)境規(guī)劃時,通常有三套:聯(lián)調(diào)測試環(huán)境、功能測試環(huán)境、準發(fā)布環(huán)境。

    為了更接近用戶的真實環(huán)境,比如可能會用一些真實的數(shù)據(jù)來測試軟件,這時重點覆蓋的用例應(yīng)當是重要的業(yè)務(wù)流程,用戶最常用的功能,本次新加的功能,對公司利益影響最大的功能等等

    運行環(huán)境和測試環(huán)境

    運行環(huán)境就是 機子支持軟件的條件 比如說有些老游戲不能在windows環(huán)境下運行,只能在DOS下運行,就是說該游戲運行環(huán)境是DOS

    同樣測試環(huán)境就是能夠支持軟件進行測試的條件

    開發(fā)環(huán)境跟測試環(huán)境于個人來說,通常是一樣的。應(yīng)為通常你就用同一部電腦。

    具體說 我開發(fā)一個網(wǎng)站

    開發(fā)環(huán)境:windows

    tomcat

    jdk

    ·

    ·

    ·

    docker swarm 有在生產(chǎn)環(huán)境中用的企業(yè)嗎

    Docker Swarm 是官方發(fā)布的集群容器管理工具。它的特點是:比較輕量級,無縫支持標準的docker API。 深入淺出Swarm 一文很清晰地講解了它的架構(gòu)和命令。本文從零開始搭建并管理一個swarm集群。

    準備工作

    我們需要先安裝 virtualBox 和 vagrant 。通過vagrant來驅(qū)動virtualBox搭建一個虛擬測試環(huán)境。首先在本地任意路徑新建一個空文件夾比如 test ,運行以下命令:

    virtual box host

    mkdir test

    cd test

    vagrant init minimum/ubuntu-trusty64-docker

    vi Vagrantfile

    里面應(yīng)該有一句 config.vm.box = "minimum/ubuntu-trusty64-docker" ,在它的下面添加如下幾行代碼,相當于給它分配三臺虛擬機,一臺叫做 manager ,它的IP是 192.168.33.17 ;另兩臺叫做 node1 和 node2 ,它們的IP是 192.168.33.18 和192.168.33.19 。

    Vagrantfile

    config.vm.define "manager" do | host |

    host.vm.hostname = "manager"

    host.vm.neork "private_neork", ip: "192.168.33.17"

    end

    config.vm.define "node1" do | host |

    host.vm.hostname = "node1"

    host.vm.neork "private_neork", ip: "192.168.33.18"

    end

    config.vm.define "node2" do | host |

    host.vm.hostname = "node2"

    host.vm.neork "private_neork", ip: "192.168.33.19"

    end

    這個vagrant鏡像已經(jīng)在ubuntu的基礎(chǔ)上幫我們安裝了docker,用起來很方便。然后分別在三個終端運行以下命令啟動并連接三臺虛擬機。

    virtual box host terminal 1

    vagrant up

    vagrant ssh manager

    virtual box host terminal 2

    vagrant ssh node1

    virtual box host terminal 3

    vagrant ssh node2

    搭建環(huán)境

    想要讓swarm管理node,首先得讓docker daemon支持TCP。在三臺虛擬機上運行以下命令:

    manager and node1 and node2

    sudo sh -c 'echo DOCKER_OPTS="-H tcp:0.0.0.0:2375 -H unix:/var/run/docker.sock" >> /etc/default/docker'

    sudo rm /etc/docker/key.json # 免得我們用vagrant生成的docker id都一樣,刪掉了重啟docker服務(wù)會自動生成一個新的

    sudo service docker restart

    學(xué)環(huán)境監(jiān)測這專業(yè)可以做什么?

    首先,是可以進 *** 的環(huán)境監(jiān)測站做環(huán)境監(jiān)測工作,其次可以進環(huán)境治理公司當技術(shù)員(可以是環(huán)境監(jiān)測,也可以其他工作),還可以進儀器公司當儀器設(shè)計、儀器檢驗、儀器應(yīng)用、儀器售后、儀器咨詢、儀器銷售,可以進化工廠當化驗員等等。

    搭建windinws測試環(huán)境和linux測試環(huán)境有什么區(qū)別

    沒明白你想做什么,如果是應(yīng)用程序測試環(huán)境,那安裝linux系統(tǒng),部署應(yīng)用就行了,如果是測試數(shù)據(jù)庫,就安裝數(shù)據(jù)庫軟件

    四、docker 和 k8s 面試總結(jié)

    花了大半個月對k8s&docker進行了梳理,包括之前讀過的書,官方文檔以及k&d在公司項目的實踐等。

    以下是個人對docker & k8s 面試知識點的總結(jié):

    1 docker

    常見面試題如下 每一點可根據(jù)回答進行適當深入

    1.1 什么是docker

    docker和傳統(tǒng)linux的差異?

    容器和鏡像的區(qū)別?

    如何理解docker的緩存機制?

    1.2 docker 網(wǎng)絡(luò)模型是什么?有何局限

    docker的網(wǎng)絡(luò)基礎(chǔ)是什么?

    docker的網(wǎng)絡(luò)模型是?有什么局限?

    docker如何實現(xiàn)容器間通信的?

    1.3 docker 基礎(chǔ)命令

    cmd和entryPoint差異?

    copy和add的差異?

    簡單講下swam/compose?

    2 kubernetes

    常見面試題如下 每一點可根據(jù)回答進行適當深入

    2.1 什么是k8s?

    1 為什么用k8s 解決了什么問題?

    2 k8s有哪些組件,有什么作用?【同:Master節(jié)點和Node節(jié)點都用哪些組件】

    3 可以簡單說下Node Pod container 之間的關(guān)系嗎? 【可引入2.2/2.3對Pod SVC的考察】

    4 什么是SVC可以簡單描述下嗎?【可引入2.3對SVC的考察】

    5 可以簡單講下k8s的網(wǎng)絡(luò)模型嗎?

    6 Pod SVC Node Container 之間如何相互訪問

    7 swarm和k8s如何選擇?

    2.2 考察Pod

    靜態(tài)Pod和普通Pod的差異?

    簡單講下Pod的生命周期重啟策略呢?

    - 不同組件對Pod的重啟策略要求一樣嗎?

    如何檢查Pod的健康狀態(tài)?哪2種探針?

    - 2種探針的實現(xiàn)方式

    簡單說下Pod的調(diào)度方式?

    2.3 考察SVC

    SVC有哪4種類型

    2.4 k8s網(wǎng)絡(luò)模型

    DNS和Iptables在k8s中的運用?有何差異

    - k8s如何解決多機器部署容器的網(wǎng)絡(luò)問題?

    Pod SVC Node Container 之間如何相互訪問

    3 參考答案

    答案是根據(jù)所在公司項目結(jié)合自己的理解給出的答案 不一定完全準確但在面試中要做到有理有據(jù)突出自己的思路即可。

    4 docker

    問題和答案 如下

    4.1 什么是docker?

    通常問這個問題主要在于考察候選人是否真正了解過docker,很多人項目中都有用到docker,真正去了解過概念,架構(gòu)的不多。從而來辨別簡歷上的熟悉/了解docker的水分。

    如果這個都無法回答,那么接下來的docker考察也就毫無意義了,此問題通常也會結(jié)合以下問題來進行考察。

    docker和傳統(tǒng)linux的差異?

    docker都有哪些核心組件?

    可以簡單說下docker的架構(gòu)嗎?

    容器和鏡像的區(qū)別?

    docker是什么:  Docker是一個可以把開發(fā)的應(yīng)用程序自動部署到容器的開源引擎。

    docker和VM差異:  docker是一個應(yīng)用層的抽象,容器之間通過網(wǎng)絡(luò)命名空間進行隔離,多個容器共享同一個操作系統(tǒng)內(nèi)核。VM是對物理硬件層的抽象,每個VM都包含獨立的操作系統(tǒng),重且啟動緩慢。VM主要為了提供系統(tǒng)環(huán)境,容器主要是為了提供應(yīng)用環(huán)境。

    docker組件:  docker引擎【包含Docker客戶端&服務(wù)端】,docker鏡像,docker容器,Registry【鏡像倉庫】

    docker的架構(gòu):  C/s架構(gòu)

    容器和鏡像的區(qū)別:  鏡像是一個只讀模板,包括運行容器所需的數(shù)據(jù),其內(nèi)容在構(gòu)建之后就不會被改變,可以用來創(chuàng)建新的容器。 鏡像由多個只讀層組成,容器在只讀層的基礎(chǔ)上多了一個讀寫層。

    4.2 docker 網(wǎng)絡(luò)模型是什么?有何局限

    這里也經(jīng)常會結(jié)合K8s網(wǎng)絡(luò)原理進行考察,以及如下幾個考點

    docker的網(wǎng)絡(luò)基礎(chǔ)是什么?

    docker的網(wǎng)絡(luò)模型是?有什么局限?

    docker如何實現(xiàn)容器間通信的?

    Docker網(wǎng)絡(luò)基礎(chǔ):  Docker是在操作系統(tǒng)層上對應(yīng)用的抽象,使用網(wǎng)絡(luò)命名空間來對不同容器之間進行網(wǎng)絡(luò)隔離,用Veth設(shè)備對來進行容器之間的通訊。

    docker的網(wǎng)絡(luò)模型:  有4種網(wǎng)絡(luò)模型 分別是Bridge Container host none 默認使用bridge網(wǎng)絡(luò)模型,容器的初次啟動會虛擬化出來一個新的網(wǎng)卡名為docker0,在多機器部署下docker0地址可能會沖突。所以docker對多機部署支持的不夠友好。

    4.3 docker 基礎(chǔ)命令

    出現(xiàn)頻率較高的為以下幾條命令的考察

    cmd和entry差異?

    copy和add的差異?

    docker-compose & docker swarm?

    CMD & ENTRYPONIT

    都是容器操作指令:

    CMD 用于指定容器啟動時候默認執(zhí)行的命令??梢员籨ocker run指定的啟動命令覆蓋。ENTRYPONIT 指令可讓容器以應(yīng)用程序或者服務(wù)的形式運行。一般不會被docker run指定的啟動命令覆蓋。dockerfile中的多個CMD & ENTRYPONIT只有最后一個會生效。

    注意區(qū)別docker run 和RUN 一個是容器啟動命令,一個是鏡像構(gòu)建時候所用。

    copy & add

    ADD & COPY 選取目標文件復(fù)制到鏡像當中。是針對鏡像的指令,唯一差別在于add源文件可以支持url且可以對壓縮文件進行解壓操作。而copy針對的是當前構(gòu)建環(huán)境。

    docker-compose & docker swarm

    使用Docker compose可以用YAML文件來定義一組需要啟動的容器,以及容器運行時的屬性。docker-compose用來對這一組容器進行操作。

    docker swarm 原生的Docker集群管理工具,依賴docker本身,很多重要功能依賴團隊二次開發(fā)。且社區(qū)不夠活躍,一般公司生產(chǎn)環(huán)境會選擇k8s,個人項目或者容器數(shù)量較少可選swarm,只需要docker即可完成,相對較輕。

    5 kubernetes

    5.1 什么是k8s?

    對k8s的考察一般逃不過這樣入門級的問題,針對入門級的問題,面試官可能也會針對如下幾個點進行考察,在候選人答出來的基礎(chǔ)上,選擇其中一個進行深入。

    為什么用k8s 解決了什么問題?

    k8s有哪些組件,有什么作用?

    可以簡單說下Node Pod container 之間的關(guān)系嗎? 【進一步可對Pod SVC細節(jié)進行考察】

    什么是SVC可以簡單描述下嗎?【可引對SVC的考察】

    可以簡單講下k8s的網(wǎng)絡(luò)模型嗎?【可以和docker網(wǎng)絡(luò)模型結(jié)合考察】

    Pod SVC Node Container 之間如何相互訪問【衍生 外部環(huán)境如何訪問k8s】

    swarm和k8s如何選擇?

    1 什么是k8s 為什么用k8s:

    一個開源的容器集群管理平臺【容器編排工具】,可提供容器集群的自動部署,擴縮容,維護等功能。分為管理節(jié)點Master和工作節(jié)點Node。在我們的項目中主要解決了環(huán)境一致性的問題,通過CI/CD使得運維部署變得簡單起來,以及自動部署,故障監(jiān)控,自動擴縮容。可以提升開發(fā)效率。

    2 k8s有那些組件:

    etcd保存了整個集群的狀態(tài);

    apiserver提供了資源操作的唯一入口,并提供認證、授權(quán)、訪問控制、API注冊和發(fā)現(xiàn)等機制;

    controller manager負責(zé)維護集群的狀態(tài),比如故障檢測、自動擴展、滾動更新等;

    scheduler負責(zé)資源的調(diào)度,按照預(yù)定的調(diào)度策略將Pod調(diào)度到相應(yīng)的機器上;

    kubelet負責(zé)維護容器的生命周期,同時也負責(zé)Volume(CVI)和網(wǎng)絡(luò)(CNI)的管理;

    Container runtime負責(zé)鏡像管理以及Pod和容器的真正運行(CRI);

    kube-proxy負責(zé)為Service提供cluster內(nèi)部的服務(wù)發(fā)現(xiàn)和負載均衡;

    3 Node&Pod&container之間的關(guān)系:Node一般指工作節(jié)點包含多個Pod Pod中包含多個Container,Pod中的container共享同一個網(wǎng)絡(luò)命名空間。

    4 什么是SVC: SVC是對一組功能相似的Pod資源的抽象,相當于一組服務(wù)的負載均衡。

    5 k8s的網(wǎng)絡(luò)模型:IP-Per-Pod 每個Pod有獨立的Ip地址,無論是否處于同一個Node節(jié)點,Pod可以通過IP相互訪問,且Pod和容器的地址和外部看到的地址是同一個地址。

    6 Pod SVC Node Container 之間如何相互訪問:

    同Pod內(nèi)的容器:同一個Pod的容器共享同一個網(wǎng)絡(luò)命名空間可以直接進行通訊

    同Node內(nèi)不同Pod的容器:多個Pod都關(guān)聯(lián)在同一個Docker0網(wǎng)橋上,通過docker0網(wǎng)橋完成相互通訊。

    不同Node內(nèi)Pod的容器:不同Node上的docker0可能會相同,PodIP和docker0是同網(wǎng)段的,所以需要將PodIP和NodeIP進行關(guān)聯(lián)且保障唯一,不同Pod之間的數(shù)據(jù)通過物理機的端口進行轉(zhuǎn)發(fā)即可完成通訊。

    7: k8s 和docker swarm如何選擇:  :

    5.2 對SVC的考察

    SVC是k8s中的核心概念 這里涉及知識點眾多 常見的面試考點如下

    什么是SVC? 如何創(chuàng)建SVC?

    使用SVC創(chuàng)建多個副本和使用RC創(chuàng)建多個副本有什么差異?

    SVC有哪幾種類型?

    SVC 負載分發(fā)策略有那些?

    集群外如何訪問SVC?

    SVC: 是對一組功能相似的Pod資源的抽象,相當于一組服務(wù)的負載均衡??梢允褂门渲梦募姆绞絼?chuàng)建也可以使用命令創(chuàng)建kubectl expose

    SVC和RC提供服務(wù)的差距:  RC創(chuàng)建的服務(wù)PodIP可能會變。SVC提供的clusterIP不會。通過Iptables的NAT轉(zhuǎn)換重定向到本地端口,在均衡到后端Pod。

    svc的幾種類型:  ClusterIp/NodePort/LoadBalancer/ExternalName

    ClusterIp 默認類型 分配的一個虛擬地址,內(nèi)部可以相互訪問,外部不行

    NodePort 將SVC端口號映射到物理機

    LoadBalancer 基于NodePort,云服務(wù)商在外部創(chuàng)建了一個負載均衡到Pod

    ExternalName 將外部地址經(jīng)過集群內(nèi)部的再一次封裝(實際上就是集群DNS服務(wù)器將CNAME解析到了外部地址上),實現(xiàn)了集群內(nèi)部訪問即可。

    svc負載分發(fā)策略:  RoundRobin/SessionAffinity/自定義實現(xiàn)【基于標簽選擇器】

    集群外部訪問:  端口映射到物理機即可

    5.2 Pod考察

    Pod和靜態(tài)Pod的區(qū)別

    生命周期和重啟策略 【這里可擴展 不同控制器對Pod的重啟策略要求】

    Pod如何健康檢查?

    Pod的調(diào)度方式?【擴展調(diào)度算法】

    Pod如何擴縮容?【擴展 RC和RS的差異】

    答案

    待補充 --詳見 《k8s權(quán)威指南》讀書筆記

    5.3 基礎(chǔ)原理類考察

    主要考察對基本組件的理解 和原理分析

    API Server

    Controller Manager【Replication Controller/Node Controller/ResourceQuota Controller/Namespace Controller/SVC Controller& Endpoint Controller】

    Scheduler

    Kubelet 【Pod健康檢查 資源監(jiān)控】

    Kube-Proxy

    k8s-DNS & Iptables差異

    k8s中Ingress是什么

    簡述k8s中的如下屬性及其作用resources tolerations affinity

    k8s中pod、rs、deployment、hpa的基本概念,以及他們之間的關(guān)系

    答案

    待補充 --詳見 《k8s權(quán)威指南》讀書筆記

    5.4 網(wǎng)絡(luò)原理類考察

    主要考察對基本組件的理解 和原理分析

    k8s的網(wǎng)絡(luò)模型是什么?

    Docker的網(wǎng)絡(luò)基礎(chǔ)是什么?

    Docker的網(wǎng)絡(luò)模型和局限?

    k8s的網(wǎng)絡(luò)組件之間是如何通訊的?

    外部如何訪問k8s集群?

    有那些開源組件支持k8s網(wǎng)絡(luò)模型?

    以上就是關(guān)于dockerswarm負載均衡相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進行咨詢,客服也會為您講解更多精彩的知識和內(nèi)容。


    推薦閱讀:

    晚上12點過后投抖加好嗎(晚上12點投dou+可以嗎)

    英文版原版windows10

    windows關(guān)機命令cmd立即關(guān)機(cmd命令關(guān)機win10)

    抖音經(jīng)典廣告語(抖音經(jīng)典廣告語語音)

    小紅書專欄開通條件(小紅書如何開設(shè)專欄)