亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Web服務器 > 正文

構建一個簡單的CaaS系統

2024-09-01 13:48:13
字體:
來源:轉載
供稿:網友

在CaaS系統出現前企業應用架構基本被IaaS/SaaS/PaaS等模式壟斷,直到Docker的出現為我們打開了另一個扇大門,廢話不說了,我們直奔主題。

我們先了解下一個簡單的CaaS系統是如何為用戶提供服務的:

  1. 企業用戶上傳它的應用代碼或其他代碼托管方式,我們生成用戶應用的鏡像,或者用戶直接上傳鏡像,或者用戶直接使用我們提供的基礎服務鏡像
  2. 用戶部署他的鏡像應用,啟動它的鏡像容器
  3. 用戶訪問他的應用服務

OK,需求確定了,該搬磚了。

用戶鏡像制作

既然是一個簡單的CaaS系統,我們就不讓用戶上傳代碼或者使用第三方代碼托管了,直接讓他們制作鏡像后提交給我們,為此我們需要搭建一個Docker私服來讓用戶上傳鏡像,假設用戶上傳的鏡像遵循這種格式 :docker 私服地址 /{appId}:{version} ,這對用戶有一定要求,畢竟一些用戶可能連Docker是啥都不知道就更別奢望讓他們編寫Dockerfile制作鏡像交付給我們了。當然如果我們提供一些基礎服務鏡像(比如MySQL服務,Redis服務等)給用戶那最好了。

啟動用戶鏡像

有了用戶制作的鏡像,該是啟動它的時候了。

docker pull docker私服地址/{appId}:{version}docker run -d docker私服地址/{appId}:{version} 

啟動方式很簡單,但這并不是我們想要的,畢竟我們是要讓用戶能夠訪問到他部署的服務的,假如用戶的服務是一個Web服務,那你得暴露出用戶的Web服務端口,這需要我們確定容器的通信方案:

  1. 跟宿主機共用一個網絡空間
  2. 發布一個容器端口,讓Docker隨機選擇一個未使用的高位端口
  3. 發布一個容器端口,并映射到宿主機上指定端口為外部路由服務
  4. 采用Docker的'links'來允許容器間通信。 如果一個新容器鏈接到一個已有容器,新容器將會通過環境變量獲得已有容器的鏈接信息,一個關聯的容器將會獲得它的對應連接信息,在它處理了那些變量后允許它自動連接。這樣就使得同一個宿主機上的容器不需要知道對應服務的端口和地址,就可以直接進行通信

我們簡單的CaaS系統暫時還用不到容器間通信,如果跟宿主機共用一個網絡空間即 --net="host" 模式啟動的話,那么如果有多個用戶上傳了鏡像,他們的WEB服務端口都是8080,顯然宿主機上只能啟動一個8080端口,只能有一個用戶的容器啟動成功,其他的因為端口已經被占用導致啟動失敗,在這里我們選擇第三種模式,選擇指定的端口映射來發布容器,這也方便我們后面管理宿主機上的端口資源。OK,啟動方式改成下面:

docker run -d -p 25701:8080 docker私服地址/{appId}:{version} 

為了不讓某個用戶的應用占用過多資源導致影響到整個宿主機上其他的應用,我們稍微對用戶的資源進行下限制,比如限制用戶應用容器的使用內存和CPU權重:

docker run -d -p 25701:8080 -m 512M -c 1024 docker私服地址/{appId}:{version} 

為了能做到水平擴展,容器服務最好是無狀態的的,這樣能更好的實現負載均衡和水平擴容。

應用啟動成功,我們可以通過在宿主機上訪問25701即可訪問容器的8080端口服務。

在寫代碼的時候我們通過 Docker Remote API client libraries 來啟動卸載容器,具體代碼實現就不多說了。

服務發現

容器啟動成功后,用戶該如何訪問到他的容器服務呢,總不能提供宿主機IP給用戶直接訪問吧,這就需要我們構建一個服務發現組件了。

服務發現的工作方式

當每一個服務啟動上線之后,他們通過發現工具來注冊自身信息
服務的消費者能夠在預設的終端查詢該服務的相關信息,然后它就可以基于查到的信息與其需要的組件進行交互
為了簡便,我們使用ZooKeeper來作為我們的服務發現工具。

首先在容器啟動成功后我們將服務注冊到zookeeper中,存儲的path路徑如下:/caas/service/address/{appId}/{version},存儲的服務子節點為{containerId}->{宿主機IP}:{服務端口}。

例如用戶appId01和appId02分別部署了各自的應用版本容器containerId01和containerId02,對應的服務端口分別為25701和25702,那么zk里存儲的注冊表信息為下:

/caas/service/address/appId01/app01Version/containerId01 -> {宿主機IP}:25701/caas/service/address/appId02/app02Version/containerId02 -> {宿主機IP}:25702 

如果一個用戶部署了多個容器實例,對應的zk注冊表信息類似下面:

/caas/service/address/{appId}/{version}/containerId01 -> {宿主機IP}:25701/caas/service/address/{appId}/{version}/containerId02 -> {宿主機IP}:25702/caas/service/address/{appId}/{version}/containerId03 -> {宿主機IP}:25703/caas/service/address/{appId}/{version}/containerId04 -> {宿主機IP}:25704 

故障檢測

以上我們完成了服務的注冊,注冊完服務后為了實現應用的高可用,我們應該還需要對容器進行故障檢測,故障檢測的方案通常有下面2種:

  • 組件主動請求服務發現心跳方式:組件可以設置一個超時時間,并能定期去請求服務發現來重置超時時間,超時時間達到閥值更新注冊表
  • 服務發現主動請求組件心跳方式:服務發現定期的健康檢查組件以及當組件出現故障時更新注冊表

通常內部自己的服務可以使用第一種方式讓組件主動請求服務發現,用戶自己寫的服務一般不可能費勁的去實現心跳來訪問服務發現組件,所以通常會要求用戶實現一個服務發現組件能訪問的心跳接口,讓服務發現組件去主動請求用戶的應用,一旦訪問失敗在重試一定次數后會認為該應用已經出現故障無法繼續提供服務,這時可以根據策略來選擇直接停止刪除該用戶容器或者重新啟動。

比如服務發現的健康檢查組件可以每隔一定時間來訪問用戶的心跳接口,類似{宿主機IP}:25701/_ping。

注冊表安全訪問

基于安全方面考慮,通常情況下我們需要對服務發現做相應的訪問控制,以便對注冊表中的存儲信息實現安全訪問,可能有以下幾種方案可供參考:

  1. 服務發現工具可以采用SSL/TLS加密鏈接
  2. 對寫入數據進行加密,使用者使用的信息必須用相應的密鑰解碼從服務發現中獲取
  3. 服務發現實現訪問控制,將不同的鍵值切分到不同的分組中,根據訪問的需要來制定不同的秘鑰從而訪問相應的分組

這里我們就不說具體的安全方面的實現了,誰讓我們是簡易版CaaS系統呢。

分布式配置存儲和負載均衡

其實服務發現的注冊表存儲訪問地址只是其中的一個方面,你可以用它來存其他的信息,比如存應用的配置,你可以通過配置動態的調整應用,也可以存容器的相關指標,負載均衡就是一個很好的例子,它可以通過查詢服務發現得到各個后端節點承受的流量數,然后根據這個信息來調整配置。具體的負載均衡算法可以根據需求來選擇,我們就使用最簡單的round bobin算法,即輪詢方式訪問。這方面的實現涉及到CaaS系統的另一個組件:路由網關,具體后面介紹。

上面我們一直都是使用了ZooKeeper來作為服務發現工具的,除了ZooKeeper,我們還可以使用其他的服務發現工具:etcd、Consul、crypt、Confd,大家有興趣可以了解下,最重要的是能保證注冊表信息的數據一致性。

調度編排

通過上面幾步你的CaaS系統基本小有所成了,但這還不夠。我們在生產環境里隨著用戶應用容器的數量增加需要增加宿主機來支撐避免資源不足,或者將某些用戶的實例單獨部署在指定的宿主機上,這就需要我們實現一個調度器組件。

宿主選擇

CaaS系統是一個分布式系統,在多個宿主機的環境里,我們需要知道用戶的應用該部署在哪臺宿主機上,如果單機的話那就不需要選擇了,直接指定就好了。具體該如何調度需要考慮以下幾點:

  1. 需要一個默認的調度策略,比如選擇可用內存最多的宿主機部署服務或選擇CPU最空閑的宿主機部署服務
  2. 調度器需要提供覆蓋機制,比如2個容器必須部署在同一個宿主機上作為一個單元來運行,比如同一個服務的2個實例容器必須部署在不同機器上來達到高可用
  3. 調度器需要滿足限制條件,比如給特定的宿主機打標簽,比如一些服務需要部署在集群中的每一臺宿主機上
  4. 多容器部署調度

隨著業務的擴展,我們可能需要提供分組容器管理,將一個集合的容器(通常是有相互依賴關系緊密關聯的組件)作為一個單獨應用來處理,比如一個Web服務容器再加上后端的數據庫服務容器組合成一個project來發布。這里就不多做討論了,我們的簡易版系統還沒考慮到這步。

供應

供應是指將一個新主機上線并完成基本配置使得它們能夠工作的一個過程,通常在集群管理里用來自動擴展宿主機,管理工具來定義需求額外主機的過程以及自動觸發的條件,例如,如果你的應用的負載很高,你可能希望讓你的系統增加額外的機器并水平擴展容器以緩解負載,這里我們同樣不做實現,簡易版就直接手動增加宿主機就好了嘛。

我們在這里舉個實現調度器的相對簡陋的方案:

主要使用關系型數據庫如MySQL來存儲宿主機信息,調度器查詢宿主機的相關指標信息根據調度算法選擇相應的宿主機來部署,利用樂觀鎖來保證并發操作時的數據一致性,利用事務來保證部署和卸載等操作的原子性。這里面可能坑比較多,大家也可以使用現在比較流行的調度器,常用的調度器有:Fleet、Marathon、Swarm、Mesos、Kubernetes、Compose,大家有興趣可以了解下。

網關

上面我們在服務發現的負載均衡方面介紹到了網關,我們把它作為CaaS系統中重要的一個組件,他主要是負責用戶請求的轉發,舉個例子用戶部署了容器想要訪問它的容器服務,這個請求到達網關后網關根據策略選擇相應的后端容器服務然后轉發請求。根據用戶的設定,動態路由請求到對應容器實例,這相當于一個代理服務器。具體如何選擇容器實例服務轉發就需要實現負載均衡器,我們可以通過查詢服務發現組件來獲取相應容器信息來完成。既然是代理服務,我們在中間可以對用戶的請求做其他處理,比如做黑名單過濾,做流量統計,做CNames路由等等

假設我們的CaaS網關訪問域名是 mycaas.gateway.cn ,用戶在我們后臺部署了一個WEB應用容器實例,調度器將他部署在了10.10.10.101宿主機上,容器服務端口映射為25701,用戶請求mycaas.gateway.cn到達網關后,網關根據請求信息識別用戶查詢該用戶所有的應用容器信息,得到所有的容器服務地址,根據負載均衡規則代理轉發到目標容器服務上。這個查詢服務發現的過程中最好實現本地緩存,比如使用zookeeper的緩存減少和避免每次請求都訪問服務發現組件,同時代理轉發中盡量使用連接池減少開銷。

總結

至此我們簡單的CaaS系統就架構設計好了,在整個系統中有服務發現/調度器/網關等多個組件協調配合。

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲女人天堂成人av在线| 日韩视频免费在线| 91中文精品字幕在线视频| 国产女人18毛片水18精品| 欧美日韩在线视频一区| 久久人体大胆视频| 欧美精品18videos性欧美| 国产精品爽爽爽爽爽爽在线观看| 国产精品国模在线| 欧美色欧美亚洲高清在线视频| 久久久免费精品视频| 国产精品一区二区久久久| 亚洲a区在线视频| 国产精品扒开腿做爽爽爽的视频| 啊v视频在线一区二区三区| 亚洲激情在线观看视频免费| 日韩av片免费在线观看| 欧美日韩精品在线视频| 亚洲精品久久7777777| 久久久人成影片一区二区三区观看| 国产精品偷伦免费视频观看的| 黑人狂躁日本妞一区二区三区| 午夜精品久久久久久久99热浪潮| 欧美在线免费看| 国产精品99蜜臀久久不卡二区| 97精品伊人久久久大香线蕉| 欧美成人一区在线| 国产精品极品美女在线观看免费| 少妇高潮 亚洲精品| 亚洲人成电影网站色| 在线日韩av观看| 久久久中文字幕| 78m国产成人精品视频| 久久久黄色av| 亚洲欧洲国产伦综合| 久久久天堂国产精品女人| 国产精品9999| 亚洲激情成人网| 国产精品久久久久av| 国产又爽又黄的激情精品视频| 欧美成人高清视频| 日韩美女激情视频| 欧美日韩在线观看视频| 国产亚洲精品久久久优势| 日韩精品在线第一页| 久久国产加勒比精品无码| 欧美日韩性视频在线| 亚洲第一精品夜夜躁人人爽| 欧美亚洲日本黄色| 久久久久国色av免费观看性色| 亚洲一区二区三区乱码aⅴ| 夜夜狂射影院欧美极品| 亚洲午夜国产成人av电影男同| 日韩国产一区三区| 久久久精品久久久久| 久久久久久久一区二区三区| 久久久女女女女999久久| 欧美成人合集magnet| 欧美极品少妇xxxxⅹ免费视频| 欧美日韩亚洲视频| 亚洲美女在线观看| 色黄久久久久久| 欧美国产日韩二区| 亚洲自拍另类欧美丝袜| 欧美一区二粉嫩精品国产一线天| 日本免费一区二区三区视频观看| 欧美激情乱人伦一区| 一区三区二区视频| 国产综合在线视频| 欧美麻豆久久久久久中文| 亚洲国产小视频| 亚洲国产精品99久久| 精品国产成人av| 91精品国产综合久久男男| 国产成人精品久久亚洲高清不卡| 日韩欧美亚洲范冰冰与中字| 国产亚洲精品激情久久| 日韩av手机在线观看| 亚洲第一精品电影| 国产精品美女视频网站| 国产精品爽爽爽爽爽爽在线观看| 日韩精品视频在线观看网址| 亚洲3p在线观看| 欧美亚洲成人免费| 一本色道久久综合狠狠躁篇怎么玩| 97久久精品人搡人人玩| 国产精品一区二区久久精品| 亚洲人成自拍网站| 久久久久久久久久国产精品| 奇门遁甲1982国语版免费观看高清| 亚洲欧美在线免费| 国产综合在线看| 欧美午夜www高清视频| 欧美日韩一区二区在线播放| 91久久在线播放| 日韩在线观看电影| 久久免费视频在线| 国产色综合天天综合网| 成人黄色免费在线观看| 久久亚洲国产成人| 久久国产精品久久久久久久久久| 国产精品美女999| 久久伊人91精品综合网站| 久久久久久久久久亚洲| 韩国福利视频一区| 丝袜美腿亚洲一区二区| 欧美日韩国产丝袜美女| 国内揄拍国内精品| 久久精品国产亚洲精品| 中文字幕亚洲欧美日韩高清| 亚洲国产91精品在线观看| 亚洲一区二区日本| 日韩精品电影网| 中文字幕在线精品| 成人福利在线观看| 555www成人网| 69**夜色精品国产69乱| 538国产精品一区二区免费视频| 国产一区二区美女视频| 国产精品一区二区三区久久| 日韩免费在线电影| 亚洲性日韩精品一区二区| 久久久人成影片一区二区三区观看| 日本最新高清不卡中文字幕| 久久久久久久久久亚洲| www.欧美精品一二三区| 成人春色激情网| xx视频.9999.com| 亚洲色图av在线| 日韩乱码在线视频| 欧美精品电影在线| 国产精品麻豆va在线播放| 欧美一级淫片播放口| 久久精品一区中文字幕| 欧美人在线观看| 九色精品美女在线| 久久久久久高潮国产精品视| 九九热这里只有精品6| 国自在线精品视频| 午夜精品理论片| 在线成人激情视频| 亚洲japanese制服美女| 亚洲大胆人体视频| 日韩黄色在线免费观看| 日韩有码片在线观看| 国产精品第2页| 亚洲美女喷白浆| 国产精品日日摸夜夜添夜夜av| 久久免费视频在线观看| 中文日韩电影网站| 欧美激情亚洲激情| 国产精品91在线| 亚洲精品欧美一区二区三区| 精品自拍视频在线观看| 成人福利视频在线观看| 国产精品美女www爽爽爽视频| 九九精品在线播放| 久久精品视频在线| 精品久久久一区二区| 国产午夜精品美女视频明星a级| 欧美日本在线视频中文字字幕| 深夜福利国产精品| 国产精品偷伦免费视频观看的| 国产欧美一区二区三区在线|