容器編排工具與 Kuberneters
1. 什么是容器編排
試想這樣的場(chǎng)景:
我們使用 Docker 運(yùn)行一個(gè)服務(wù)應(yīng)用,當(dāng)負(fù)載增加,單一實(shí)例無法滿足需要時(shí),我們就得增加這個(gè)實(shí)例部署的數(shù)量,并配置容器間負(fù)載均衡,而所有這些操作都需要我們手動(dòng)處理,并且這些操作也僅僅被限制在這一臺(tái) Docker 宿主機(jī)中,如果宿主機(jī)故障,那么整套應(yīng)用就會(huì)崩潰。
為了避免這種情況發(fā)生,我們需要耗費(fèi)大量的精力去依次配置這些容器和主機(jī)的監(jiān)控系統(tǒng),以便實(shí)時(shí)掌握宿主機(jī)的運(yùn)行狀況,及時(shí)處理出現(xiàn)故障的容器。當(dāng)運(yùn)行的容器隨著業(yè)務(wù)量逐步增加,生產(chǎn)環(huán)境中可能會(huì)有成千上萬個(gè)容器需要被監(jiān)控和管理,這時(shí)就需要容器編排工具出馬了。
使用容器編排工具可以自動(dòng)化和管理任務(wù),例如:
- 置備和部署容器;
- 配置和調(diào)度容器;
- 資源分配;
- 容器可用性;
- 根據(jù)平衡基礎(chǔ)架構(gòu)中的工作負(fù)載而擴(kuò)展或刪除容器;
- 負(fù)載平衡和流量路由;
- 監(jiān)控容器的健康狀況;
- 根據(jù)運(yùn)行應(yīng)用的容器來配置應(yīng)用;
- 保持容器間交互的安全。
Tips:
編排這一術(shù)語來源于音樂領(lǐng)域,根據(jù)作曲家的作品,編曲決定音樂作品的某一部分由某種樂器以某種方式在某個(gè)時(shí)機(jī)來演奏,這一過程稱為編排。編排這一術(shù)語被借用到了IT領(lǐng)域。容器編排負(fù)責(zé)容器的啟停調(diào)度,同時(shí)通過管理容器集群來提升容器使用率。
2. 容器編排工具概覽
目前,主流的容器編排工具有:
- Docker Compose:?jiǎn)我恢鳈C(jī)上部署多個(gè)容器;
- Docker Swarm:多臺(tái)機(jī)器上部署容器。開箱即用,快速部署容器;
- Mesos:大數(shù)據(jù)組件部署。雙層調(diào)度,任務(wù)調(diào)度需自己實(shí)現(xiàn);
- Kubernetes(k8s):社區(qū)活躍度高,微服務(wù)化,組件豐富。
Docker Compose 已經(jīng)是老朋友了,它不太適用與多宿主機(jī)場(chǎng)景, 下面我們介紹后三個(gè)用于集群部署的容器編排工具。
2.1 Docker Swarm
Docker Swarm 是一個(gè)由 Docker 開發(fā)的調(diào)度框架。它的使用方式接近 Docker 本身,加之 Docker Machine 可以快速創(chuàng)建部署 Docker 宿主機(jī),使得 Swarm 整體部署和使用非常簡(jiǎn)單,易于上手。
2.1.1 功能特性
-
集群管理集成進(jìn) Docker Engine;
-
去中心化設(shè)計(jì);
-
聲明式服務(wù)模型;
-
服務(wù)擴(kuò)容縮容;
-
協(xié)調(diào)預(yù)期狀態(tài)與實(shí)際狀態(tài)的一致性;
-
多主機(jī)網(wǎng)絡(luò);
-
服務(wù)發(fā)現(xiàn);
-
負(fù)載均衡;
-
安全策略;
-
滾動(dòng)更新。
2.2 Mesos
Mesos 是一個(gè)開源的集群管理框架,它可以將數(shù)據(jù)中心放在一臺(tái)電腦里運(yùn)行,從數(shù)據(jù)中心、操作系統(tǒng)的角度提供資源視圖。對(duì)外提供簡(jiǎn)單的 API,同時(shí)隱藏內(nèi)部的很多復(fù)雜架構(gòu)。它由 UC Berkeley 的Benjemin Hinderman,Andy Konwinski 和 Matei Zaharia 開發(fā),早于 Docker 產(chǎn)生,Mesos 作為資源管理器,后來在 Twitter 里發(fā)展成熟,并很快成為 Apache 基金會(huì)的頂級(jí)項(xiàng)目。
2.2.1 功能特性
- 可擴(kuò)展到 10000 個(gè)節(jié)點(diǎn);
- 使用 ZooKeeper 實(shí)現(xiàn) Master 和 Slave 的容錯(cuò);
- 使用 Linux 容器實(shí)現(xiàn)本地任務(wù)隔離;
- 基于多資源(內(nèi)存,CPU、磁盤、端口)調(diào)度;
- 提供 Java,Python,C++ 等多種語言 API。
2.3 Kubernetes
Kubernetes 是一個(gè)最初由 Google 工程師開發(fā)和設(shè)計(jì)的開源容器編排工具。2015 年,Google 將 Kubernetes 項(xiàng)目捐贈(zèng)給新成立的云原生計(jì)算基金會(huì)。Kubernetes是目前最流行的開源容器編排解決方案框架,基于 Google 龐大的生態(tài)圈及 RedHat(OpenShift)的企業(yè)支持。 如果加上 OpenShift(可以看作基于Kubernetes構(gòu)建的發(fā)行版產(chǎn)品),Kubernetes 占有容器調(diào)度編排市場(chǎng)的份額高達(dá) 9 成,因而Kubernetes 社區(qū)也成為了容器編排工具中最大的社區(qū)。
2.3.1 功能特性
- 跨多臺(tái)主機(jī)進(jìn)行容器編排;
- 更加充分地利用硬件,最大程度獲取運(yùn)行企業(yè)應(yīng)用所需的資源;
- 有效管控應(yīng)用部署和更新,并實(shí)現(xiàn)自動(dòng)化操作;
- 掛載和增加存儲(chǔ),用于運(yùn)行有狀態(tài)的應(yīng)用;
- 快速、按需擴(kuò)展容器化應(yīng)用及其資源;
- 對(duì)服務(wù)進(jìn)行聲明式管理,保證所部署的應(yīng)用始終按照部署的方式運(yùn)行;
- 利用自動(dòng)布局、自動(dòng)重啟、自動(dòng)復(fù)制以及自動(dòng)擴(kuò)展功能,對(duì)應(yīng)用實(shí)施狀況檢查和自我修復(fù);
- 支持集群聯(lián)邦功能,用于控制大量節(jié)點(diǎn)。
2.3.2 Kubernetes 組件
Kubernetes官網(wǎng)展示了它的基本結(jié)構(gòu)示意圖,如下所示:
其中:
- Master 負(fù)責(zé)管理整個(gè)集群。 Master 協(xié)調(diào)集群中的所有活動(dòng),例如調(diào)度應(yīng)用、維護(hù)應(yīng)用的所需狀態(tài)、應(yīng)用擴(kuò)容以及推出新的更新;
- Node 是一個(gè)虛擬機(jī)或者物理機(jī),上面具有用于處理容器操作的容器引擎。它在 Kubernetes 集群中充當(dāng)工作機(jī)器的角色 每個(gè)Node都有 Kubelet , 它管理 Node 同時(shí)也充當(dāng) Node 與 Master 通信的代理;
在 Kubernetes 上部署應(yīng)用時(shí),Master 啟動(dòng)應(yīng)用容器。 Master 就編排容器在群集的 Node 上運(yùn)行。 Node 使用 Master 暴露的 Kubernetes API 與 Master 通信。終端用戶也可以使用 Kubernetes API 與集群交互。
Tips:
Kubernetes 最初只支持 docker 作為運(yùn)行時(shí),為了能夠讓 Kubernetes 變得更具有可擴(kuò)展性,在 1.5 版本增加了 容器運(yùn)行時(shí)接口 CRI(the Container Runtime Interface),在隨后的演進(jìn)中,CRI 被抽出來做成了獨(dú)立的項(xiàng)目。Kubelet 作為 CRI 的客戶端,而容器運(yùn)行時(shí)則需要實(shí)現(xiàn) CRI 的服務(wù)端。只要某個(gè)容器引擎實(shí)現(xiàn)了 CRI 約定的接口,就能接入 k8s 作為 Container Runtime。
3. 小結(jié)
本節(jié)中我們了解了容器編排的概念和工具。
Docker Swarm 的用戶大體局限在個(gè)人或小型開發(fā)團(tuán)隊(duì),看重的是部署和使用方便,使用的都是比較基礎(chǔ)的功能;Mesos 得益于它的出身,大數(shù)據(jù)領(lǐng)域的生態(tài)相對(duì)健全。
對(duì)于通用領(lǐng)域的容器編排項(xiàng)目,Kubernetes 是一個(gè)可靠的選擇。得益于龐大的社區(qū)支持,插件和文檔 也非常豐富。但對(duì)于初學(xué)者來說,復(fù)雜的配置和部署仍舊是一道難關(guān),后面的章節(jié)中,我們來講解如何從 0 搭建一套多節(jié)點(diǎn)的 Kubernetes 集群。