前言
如標題中的問題所提到的虛擬化,容器,Docker和K8s那樣,我們不妨這樣問:這些技術到底適用於哪些場景,有沒有別的技術可以替代?這些技術的優劣在哪裡?
下面我將針對性地從以上幾個問題的出發點,去和大家分享自己的答案。
一、虛擬化—歷史的選擇
我們現在提到虛擬化技術,一般會知道有5種:軟體虛擬化,硬體虛擬化,完全虛擬化,半虛擬化和容器虛擬化。
在這裡,主要探討的是硬體虛擬化和容器虛擬化的出現,對雲端計算的發展帶來了哪些影響甚至是推動。
對於雲原生來說,尤其是應用上雲,我們會直接想到使用物理機節點去部署我們的應用。這樣做首先是沒有問題的,物理機在早期確實也承擔了這樣的任務,如圖1所示。
但這樣也會有直接的問題:對於物理機資源的利用暫且不說,眾多的應用環境隔離怎麼解決?前端是node.js+Vue,後端是Golang,對於版本的維護成本是比較大的,買三臺伺服器來實現硬體級別隔離顯然並不合理。
此外,還有物理機內應用的資源分配問題、動態負載等等問題。
那麼,得想個辦法(或者工具)來解決環境隔離的問題。舉個簡單的例子,平時在PC上使用比較多的虛擬化是Vmwear(一個桌面軟體),這類軟體可以在windows上安裝下linux虛擬機器(可以學習linux系統),且安裝完成的虛擬機器就是一個資料夾,可以複製到任意其他PC電腦上使用,只要那臺電腦上也裝了Vmwear,等同於一個移動作業系統,如圖2所示:
但是這僅僅是我們個人在PC端使用的虛擬化軟體,在企業級別伺服器上相應的工具最具代表性的是KVM。
我們可以把原始裝的那個linux系統稱為Host OS(主機),在這之上我們安裝各種應用,JVM,Docker,Python等。其執行原理如圖3所示:
到這裡,我們已經大致知曉了虛擬化技術存在的原因和所適用的場景。接下來就是對於容器這一部分進行解答,同時將Docker和容器一起進行比較。
二、容器化—演進的結果
為何要容器化?
結論先行:虛擬機器≠容器,容器≠Docker。
虛擬化技術解決的核心問題是資源調配,而容器解決的核心問題是應用開發、測試和部署。
基於上面的介紹,容器的特點可以更好地理解:
- 容器可以將程式碼與配置檔案和相關依賴庫進行打包,從而確保在任何環境下的執行都是一致的。
- 高資源利用率:容器提供程式級的隔離,因此可以更加精細地設定 CPU 和記憶體的使用率,進而更好地利用伺服器的計算資源。
- 快速擴充套件:每個容器都可作為單獨的程式予以執行,並且可以共享底層作業系統的系統資源,這樣一來可以加快容器的啟動和停止效率。
區別與聯絡:
- 虛擬機器雖然可以隔離出很多「子電腦」,但佔用空間更大,啟動更慢。虛擬機器軟體可能還要花錢,例如 VMWare。
- 容器技術不需要虛擬出整個作業系統,只需要虛擬一個小規模的環境,類似「沙箱」。
- 執行空間,虛擬機器一般要幾 GB 到 幾十 GB 的空間,而容器只需要 MB 級甚至 KB 級。
將容器這一理念發揮到淋漓盡致的,就是著名的Docker容器技術。即是建立容器的工具,也是應用容器引擎。Docker的中文意思,就是碼頭工人。而它的LOGO,就是一隻鯨魚揹著很多貨櫃箱,如圖4所示:
為什麼一提到容器就會聯想到Docker?
Docker是業內容器概念的最好踐行者之一。
Docker容器使應用程式不僅彼此隔離,而且與底層系統隔離。這不僅可以實現更清晰的軟體堆疊,還可以更輕鬆地指定給定的容器化應用程式如何使用系統資源- CPU,GPU,記憶體,I / O,網路等,它還可以更輕鬆地確保資料和程式碼保持獨立。
映象是一種輕量級、可執行的獨立軟體包,用來打包軟體執行環境和基於執行環境開發的軟體,它包含執行某個軟體所需的所有內容,包括程式碼、執行時、庫、環境變數和配置檔案。
我想,上述對於容器和Docker區別大家或多或少有所瞭解。下面,對於為什麼要K8s的問題,分享我的看法。
K8s—業界的標準
眾所周知,Docker是應用最為廣泛的容器技術,透過打包映象、啟動容器來建立一個服務。但是隨著應用越來越複雜,容器的數量也越來越多,由此衍生了管理運維容器的重大問題。
而K8s是一個編排容器的工具,其實也是管理應用的全生命週期的一個工具,從建立應用、應用的部署、應用提供服務、擴容縮容應用、應用更新等,都非常的方便,而且可以做到故障自愈。例如一個伺服器掛了,可以自動將這個伺服器上的服務排程到另外一個主機上進行執行,無需進行人工干涉。
K8s叢集由Master節點和Node(Worker)節點組成,具體如表1所示:
Master節點 | Node節點 |
---|---|
etcd | Control plane |
kube-apiserver | kube-proxy |
kube-controller-manager | kubelet |
kebu-scheduler | docker |
kube-dns | other apps |
kube-proxy | |
Control plane |
各關鍵元件的簡單介紹如下:
- etcd:一個高可用的Key/Value鍵值對儲存和服務發現系統
- flannel:實現跨主機的容器網路的通訊
- kube-apiserver:提供kubernetes叢集的API呼叫
- kube-controller-manager:確保叢集服務
- kube-scheduler:排程容器,分配到Node
- kubelet:在Node節點上按照配置檔案中定義的容器規格啟動容器
- kube-proxy:提供網路代理服務
多節點之間關係和所需的元件如圖5所示:
最後,可以來總結一下虛擬化,容器,Docker和K8s之間的關係了:虛擬化技術將應用從物理機搬進了虛擬機器,虛擬機器裡的容器隔離了應用之間的環境,而Docker是容器技術的知名踐行者,K8s則是目前業內公認的容器編排工具(標準)。
我的分享到此結束了,期待大家的交流與指