堅持學習Java100天第015天 K8S入門

認識虛擬化

什麼是虛擬化?

在計算機中,虛擬化(英語:Virtualization)是一種資源管理技術,是將計算機的各種實體資源,如伺服器、網路、記憶體及儲存等,予以抽象、轉換後呈現出來,打破實體結構間的不可切割的障礙,使使用者可以比原本的組態更好的方式來應用這些資源。這些資源的新虛擬部份是不受現有資源的架設方式,地域或物理組態所限制。一般所指的虛擬化資源包括計算能力和資料儲存。

虛擬化技術是一套解決方案。完整的情況需要CPU、主機板晶片組、BIOS和軟體的支援,例如VMM軟體或者某些作業系統本身。即使只是CPU支援虛擬化技術,在配合VMM的軟體情況下,也會比完全不支援虛擬化技術的系統有更好的效能。

在實際的生產環境中,虛擬化技術主要用來解決

高效能的物理硬體產能過剩

老的舊的硬體產能過低的重組重用

,透明化底層物理硬體,從而最大化的利用物理硬體 對資源充分利用

虛擬化技術種類很多,例如:軟體虛擬化、硬體虛擬化、記憶體虛擬化、網路虛擬化(vip)、桌面虛擬化、服務虛擬化、虛擬機器等等。

虛擬化的作用:

l充分利用高效能伺服器。

l對老舊伺服器進行重組後有效利用。

虛擬化分類

(1)全虛擬化架構

堅持學習Java100天第015天 K8S入門

虛擬機器的監視器(hypervisor)是類似於使用者的應用程式執行在主機的OS之上,

如VMware的workstation,這種虛擬化產品提供了虛擬的硬體。

全虛擬化架構,就是在os系統內部,可以安裝多個作業系統,達到物理資源分離操作。

(2)OS層虛擬化架構

堅持學習Java100天第015天 K8S入門

需要先跑一個作業系統,在這個作業系統的內部,可以安裝多個作業系統,以達到物理資源分離操作。

和全虛擬化架構不同的是,OS層虛擬化架構,需要先有一個作業系統。全虛擬化架構是直接基於物理層實現的多作業系統隔離,OS層虛擬架構是在作業系統之上實現多作業系統隔離。OS層虛擬架構的底層是物理層。

(3)硬體層虛擬化

堅持學習Java100天第015天 K8S入門

硬體層的虛擬化具有高效能和隔離性,因為

hypervisor

直接在硬體上執行,有利於控制VM的OS訪問硬體資源,使用這種解決方案的產品有VMware ESXi 和 Xen server。

Hypervisor是一種執行在物理伺服器和作業系統之間的中間軟體層,可允許多個作業系統和應用共享一套基礎物理硬體

,因此也可以看作是虛擬環境中的“元”作業系統,它可以協調訪問伺服器上的所有物理裝置和虛擬機器,也叫虛擬機器監視器(Virtual Machine Monitor,VMM)。

Hypervisor是所有虛擬化技術的核心。

當伺服器啟動並執行Hypervisor時,它會給每一臺虛擬機器分配適量的記憶體、CPU、網路和磁碟,並載入所有虛擬機器的客戶作業系統。宿主機

Hypervisor是所有虛擬化技術的核心,軟硬體架構和管理更高效、更靈活,硬體的效能能夠更好地發揮出來。常見的產品有:VMware、KVM、Xen等等。

OpenStack與KVM、VMWare

OpenStack

OpenStack是管理雲平臺服務的一種技術,而且是視覺化管理。是由美國航天局和Rackspace聯合開發的一種技術。用來管理海量的虛擬化平臺,可能管理目標能夠達到上億個。此專案已經捐贈給Apache,屬於開源專案。

OpenStack:開源管理專案 OpenStack是一個旨在為公共及私有云的建設與管理提供軟體的開源專案。它不是一個軟體,而是由幾個主要的元件組合起來完成一些具體的工作。OpenStack由以下五個相對獨立的元件構成:

lOpenStack Compute(Nova)是一套控制器,用於虛擬機器計算或使用群組啟動虛擬機器例項。

lOpenStack映象服務(Glance)是一套虛擬機器映象查詢及檢索系統,實現虛擬機器映象管理。

lOpenStack物件儲存(Swift)是一套用於在大規模可擴充套件系統中透過內建冗餘及容錯機制,以物件為單位的儲存系統,類似於Amazon S3。

lOpenStack Keystone,用於使用者身份服務與資源管理。

lOpenStack Horizon,基於Django的儀表板介面,是個圖形化管理前端。這個起初由美國國家航空航天局和Rackspace在2010年末合作研發的開源專案,旨在打造易於部署、功能豐富且易於擴充套件的雲計算平臺。OpenStack專案的首要任務是簡化雲的部署過程併為其帶來良好的可擴充套件性,企圖成為資料中心的作業系統,即雲作業系統。

Openstack專案層級關係:

堅持學習Java100天第015天 K8S入門

第一層是

基礎設施層

,這一層主要包含Nova、Glance和Keystone,如果我們要想得到最基本的基礎設施的服務,必須安裝部署這三個專案。

第二層是

擴充套件基礎設施層

,這一層可以讓我們得到更多跟基礎設施相關的高階服務,主要包含Cinder、Swift、Neutron、Designate和Ironic等,其中Cinder提供塊儲存,Swift提供物件儲存,Neutron提供網路服務,Designate提供DNS服務,Ironic提供裸機服務。

第三層是

可選的增強特性

,幫使用者提供一些更加高階的功能,主要包含Ceilometer、Horizon和Barbican,其中Ceilometer提供監控、計量服務,Horizon提供使用者介面,Barbican提供秘鑰管理服務。

第四層主要是

消費型服務

,所謂的消費型服務,主要是指第四層的服務都需要透過使用前三層的服務來工作。第四層主要有Heat、Magnum、Sahara、Solum和Murano等,其中Heat主要提供orchestration服務,Magnum主要提供容器服務,Sahara主要提供大資料服務,我們可以透過Sahara很方便地部署Hadoop、Spark叢集。Solum主要提供應用開發的服務,並且可以提供一些類似於CI/CD的功能。Muarno主要提供應用目錄的服務,類似於App Store,就是使用者可以把一些常用的應用釋出出來供其他使用者去使用。最右邊是Kolla,Kolla的主要功能是容器化所有的OpenStack服務,便於OpenStack安裝部署和升級。

OpenStack底層管理什麼資源?

OpenStack實現雲平臺管理技術,底層使用虛擬化KVM(Hypervisor)技術。優點是隔離非常的徹底,是作業系統級別的隔離。缺點是佔用資源非常多,效能比較低。

KVM

堅持學習Java100天第015天 K8S入門

KVM(Kernel-based Virtual Machine)基於核心的虛擬機器

KVM是整合到Linux核心的Hypervisor,是X86架構且硬體支援虛擬化技術(Intel VT或AMD-V)的

Linux的全虛擬化解決方案

。它是Linux的一個很小的模組,利用Linux做大量的事,如任務排程、記憶體管理與硬體裝置互動等。

KVM最大的好處就在於它是與Linux核心整合的,所以速度很快。

VMWARE

VMWare (Virtual Machine ware)是一個“虛擬PC”虛擬機器管理管理軟體。

它的產品可以使你在一臺機器上同時執行二個或更多Windows、DOS、LINUX系統。

與“多啟動”系統相比,VMWare採用了完全不同的概念。多啟動系統在一個時刻只能執行一個系統,在系統切換時需要重新啟動機器。

VMWare是真正“同時”執行,多個作業系統在主系統的平臺上,就象標準Windows應用程式那樣切換。

而且每個作業系統你都可以進行虛擬的分割槽、配置而不影響真實硬碟的資料,

你甚至可以透過網絡卡將幾臺虛擬機器用網絡卡連線為一個區域網,極其方便。

安裝在VMware作業系統效能上比直接安裝在硬碟上的系統低不少,因此,比較適合學習和測試。

什麼是容器?

虛擬化技術,利用的是hypervisor。容器虛擬化,利用的是group(組)+namespace(名稱空間)分離技術。虛擬化技術隔離得更加徹底,但是容器虛擬化對硬體的利用更高,更靈活。

容器就是執行作業系統,可以是物理機作業系統,或者虛擬機器作業系統,是一個作業系統的程序,是程序級別的虛擬化技術。

容器的發展

LXC

堅持學習Java100天第015天 K8S入門

LXC指代的是Linux Containers,其功能透過Cgroups以及Linux Namespaces實現

。也是第一套完整的Linux容器管理實現方案。在LXC出現之前,Linux上已經有了類似 Linux-Vserver、OpenVZ 和 FreeVPS。雖然這些技術都已經成熟,但是這些解決方案還沒有將它們的容器支援整合到主流 Linux 核心。

相較於其它容器技術,LXC能夠在無需任何額外補丁的前提下執行在原版Linux核心之上

。目前LXC專案由Canonical有限公司負責贊助及託管。

Docker

堅持學習Java100天第015天 K8S入門

Docker專案最初是由一家名為DotCloud的平臺即服務廠商所打造,其後該公司更名為Docker。

Docker在起步階段使用LXC,而後利用自己的

Libcontainer

庫將其替換下來。與其它容器平臺不同,

Docker引入了一整套與容器管理相關的生態系統

。其中包括一套高效的分層式容器映象模型、一套全域性及本地容器登錄檔、一個精簡化REST API以及一套命令列介面等等。

與Docker具有同樣目標功能的另外一種容器技術就是CoreOS公司開發的Rocket。 Rocket基於App Container規範並使其成為一項更為開放的標準。

Docker容器技術

Docker歷史

2010年,幾個搞IT的年輕人,在美國舊金山成立了一家名叫“dotCloud”的公司。

這家公司主要提供基於PaaS的雲計算技術服務。具體來說,是和LXC有關的容器技術。LXC,就是Linux容器虛擬技術(Linux container)、後來,dotCloud公司將自己的容器技術進行了簡化和標準化,並命名為——Docker。

Docker技術誕生之後,並沒有引起行業的關注。而dotCloud公司,作為一家小型創業企業,在激烈的競爭之下,也步履維艱。正當他們快要堅持不下去的時候,腦子裡蹦出了“開源”的想法。

什麼是“開源”?開源,就是開放原始碼。也就是將原來內部保密的程式原始碼開放給所有人,然後讓大家一起參與進來,貢獻程式碼和意見。

Open Source,開源

有的軟體是一開始就開源的。也有的軟體,是混不下去,創造者又不想放棄,所以選擇開源。自己養不活,就吃“百家飯”嘛。

2013年3月,dotCloud公司的創始人之一,Docker之父,28歲的Solomon Hykes正式決定,將Docker專案開源。

不開則已,一開驚人。

越來越多的IT工程師發現了Docker的優點,然後蜂擁而至,加入Docker開源社群。

Docker的人氣迅速攀升,速度之快,令人瞠目結舌。

開源當月,Docker 0。1版本釋出。此後的每一個月,Docker都會發佈一個版本。到2014年6月9日,Docker 1。0版本正式釋出。

此時的Docker,已經成為行業里人氣最火爆的開源技術,沒有之一。甚至像Google、微軟、Amazon、VMware這樣的巨頭,都對它青睞有加,表示將全力支援。

Docker火了之後,dotCloud公司乾脆把公司名字也改成了Docker Inc。。

Docker和容器技術為什麼會這麼火爆?說白了,就是因為它“輕”。

Docker原理

容器是一種輕量級的虛擬化技術

,因為它跟虛擬機器比起來,

它少了一層hypervisor 層

。先看一下下面這張圖,這張圖簡單描述了一個容器的啟動過程。

堅持學習Java100天第015天 K8S入門

hypervisor:一種執行在物理伺服器和作業系統之間的中間層軟體,可以允許多個作業系統和應用共享一套基礎物理硬體。

可以將hypervisor看做是虛擬環境中的“元”作業系統,可以協調訪問伺服器上的所有物理裝置和虛擬機器,所以又稱為虛擬機器監視器(virtual machine monitor)。

hypervisor是所有虛擬化技術的核心

,非中斷的支援多工作負載遷移是hypervisor的基本功能。當伺服器啟動並執行hypervisor時,會給每一臺虛擬機器分配適量的記憶體,cpu,網路和磁碟資源,並且載入所有虛擬機器的客戶作業系統。

最下面是一個磁碟,容器的映象是儲存在磁碟上面的。上層是一個容器引擎,容器引擎可以是docker,也可以是其它的容器引擎。引擎向下發一個請求,比如說建立容器,這時候它就把磁碟上面的容器映象執行成在宿主機上的一個程序。

對於容器來說,最重要的是怎麼保證這個程序所用到的資源是被隔離和被限制住的,在Linux 核心上面是由 cgroup 和 namespace 這兩個技術來保證的

Namespace

namespace 是用來做資源隔離的,

在Linux 核心上有七種

namespace,docker 中用到了前六種。第七種 cgroup namespace 在 docker 本身並沒有用到,但是在 runC 實現中實現了 cgroup namespace。

l第一個是

mout namespace

。mout namespace 就是保證容器看到的檔案系統的檢視,是容器映象提供的一個檔案系統,也就是說它看不見宿主機上的其他檔案,除了透過 -v 引數 bound 的那種模式,是可以把宿主機上面的一些目錄和檔案,讓它在容器裡面可見的。

l第二個是

uts namespace

,這個namespace 主要是隔離了 hostname 和 domain。

l第三個是

pid namespace

,這個namespace 是保證了容器的 init 程序是以 1 號程序來啟動的。

l第四個是

網路namespace

,除了容器用host 網路這種模式之外,其他所有的網路模式都有一個自己的 network namespace 的檔案。

l第五個是

user namespace

,這個namespace 是控制使用者 UID 和 GID 在容器內部和宿主機上的一個對映,不過這個 namespace 用的比較少。

l第六個是

IPC namespace

,這個namespace 是控制了程序兼通訊的一些東西,比方說訊號量。

l第七個是

cgroup namespace

。用cgroup namespace 帶來的一個好處是容器中看到的 cgroup 檢視是以根的形式來呈現的,這樣的話就和宿主機上面程序看到的 cgroup namespace 的一個檢視方式是相同的;另外一個好處是讓容器內部使用 cgroup 會變得更安全。

Docker和KVM以及OpenStack

雲計算平臺實現方案有幾種?

主要有以下三種方案:

l物理機構建雲平臺環境。無法充分利用資源,造成資源浪費。

l虛擬化技術構建雲平臺環境。可以隔離資源,可以更充分的利用資源。但是虛擬機器本身就浪費資源。

l容器化技術構建雲平臺環境。輕量級的,非常好的雲平臺構建技術。

Docker和KVM

堅持學習Java100天第015天 K8S入門

VM 利用 Hypervisor 虛擬化技術來模擬 CPU、記憶體等硬體資源,這樣就可以在宿主機上建立一個 Guest OS,這是常說的安裝一個虛擬機器。

每一個Guest OS 都有一個獨立的核心,比如 Ubuntu、CentOS 甚至是 Windows 等,在這樣的 Guest OS 之下,每個應用都是相互獨立的,

VM 可以提供一個更好的隔離效果。但這樣的隔離效果需要付出一定的代價

,因為需要把一部分的計算資源交給虛擬化,這樣就很難充分利用現有的計算資源,並且每個Guest OS 都需要佔用大量的磁碟空間,比如 Windows 作業系統的安裝需要 10~30G 的磁碟空間,Ubuntu 也需要 5~6G,同時這樣的方式啟動很慢。正是因為虛擬機器技術的缺點,催生出了容器技術。

容器是針對於程序而言的,因此無需Guest OS,

只需要一個獨立的檔案系統提供其所需要檔案集合即可。所有的檔案隔離都是程序級別的

,因此啟動時間快於VM,並且所需的磁碟空間也小於 VM。當然了,程序級別的隔離並沒有想象中的那麼好,隔離效果相比 VM 要差很多。

總體而言,容器和VM 相比,各有優劣,因此容器技術也在向著強隔離方向發展。

Docker提供了一種程式執行的容器,同時保證這些容器相互隔離。虛擬機器也有類似的功能,但是它透過Hypervisor建立了一個完整的作業系統棧。不同於虛擬機器的方式,Docker依賴於Linux自帶的LXC(Linux Containers)技術。LXC利用了Linux可以對程序做記憶體、CPU、網路隔離的特性。Docker映象不需要新啟動一個作業系統,因此提供了一種輕量級的打包和執行程式的方式。而且Docker能夠直接訪問硬體,從而使它的I/O操作比虛擬機器要快得多。

疑問:Docker可以直接跑在物理伺服器上,這引起大家的疑問:假如已經用了Docker,還有必要使用OpenStack嗎?

堅持學習Java100天第015天 K8S入門

Docker和KVM的效能測試對比圖表。和預期的一樣,啟動KVM和Docker容器的時間差異非常顯著,而且在記憶體和CPU利用率上,雙方差距非常大。雙方巨大的效能差異,導致了在相同工作負載下,KVM需要更多的CPU和記憶體資源,導致成本上升。

KVM和openstack

堅持學習Java100天第015天 K8S入門

openstack是雲管理平臺,其本身並不提供虛擬化功能

真正的虛擬化能力是由底層的hypervisor(如KVM、Qemu、Xen等)提供

。所謂管理平臺,就是為了方便使用而已。如果沒有openstack,一樣可以透過virsh、virt-manager來實現建立虛擬機器的操作,只不過敲命令列的方式需要一定的學習成本,對於普通使用者不是很友好。

KVM是最底層的hypervisor,是用來模擬CPU的執行,然鵝一個使用者能在KVM上完成虛擬機器的操作還需要network及周邊的I/O支援,所以便借鑑了qemu進行一定的修改,形成qemu-kvm。但是openstack不會直接控制qemu-kvm,會用一個libvirt的庫去間接控制qemu-kvm。qemu-kvm的地位就像底層驅動來著。

OpenStack:開源管理專案。OpenStack是一個旨在為公共及私有云的建設與管理提供軟體的開源專案。它不是一個軟體,而是由幾個主要的元件組合起來完成一些具體的工作。OpenStack由以下五個相對獨立的元件構成:

lOpenStack Compute(Nova)是一套控制器,用於虛擬機器計算或使用群組啟動虛擬機器例項;

lOpenStack映象服務(Glance)是一套虛擬機器映象查詢及檢索系統,實現虛擬機器映象管理;

lOpenStack物件儲存(Swift)是一套用於在大規模可擴充套件系統中透過內建冗餘及容錯機制,以物件為單位的儲存系統,類似於Amazon S3;

lOpenStack Keystone,用於使用者身份服務與資源管理以及

lOpenStack Horizon,基於Django的儀表板介面,是個圖形化管理前端。

這個起初由美國國家航空航天局和Rackspace在2010年末合作研發的開源專案,旨在打造易於部署、功能豐富且易於擴充套件的雲計算平臺。OpenStack專案的首要任務是簡化雲的部署過程併為其帶來良好的可擴充套件性,企圖成為資料中心的作業系統,即雲作業系統。

KVM:開放虛擬化技術。KVM(Kernel-based Virtual Machine)是一個開源的系統虛擬化模組,它需要硬體支援,如Intel VT技術或者AMD V技術,是基於硬體的完全虛擬化,完全內置於Linux。

2008年,紅帽收購Qumranet獲得了KVM技術,並將其作為虛擬化戰略的一部分大力推廣,在2011年釋出RHEL6時支援KVM作為唯一的hypervisor。KVM主打的就是高效能、擴充套件性、高安全,以及低成本。

一個被某些熱心支持者成為雲時代的Linux,是公有云與私有云的開源作業系統。一個則是Linux核心的一部分,將Linux轉換成一個Type-1 hypervisor,無需任何變更就能享受現有的Linux核心程序排程、記憶體管理和裝置支援。

OpenStack炙手可熱,它如同Linux一樣,旨在構建一個核心,所有的軟體廠商都圍繞著它進行工作。OpenStack的許多子專案,對雲計算平臺中的各種資源(如計算能力、儲存、網路)提供敏捷管理。此外,OpenStack也提供對虛擬化技術的支援。

KVM整合在Linux的各個主要發行版本中,使用Linux自身的排程器進行管理。KVM專注於成為最好的虛擬機器監控器,是使用Linux企業的不二選擇,加上它還支援Windows平臺,所以也是異構環境的最佳選擇。

OpenStack是一個擁有眾多支持者的大專案。時至今日,已經有超過180家企業和400多位開發人員對這一專案積極地做著貢獻,而其生態系統甚至更為龐大,已經超過了5600人和850家機構。在今年9月,OpenStack基會正式成立。白金會員有紅帽、IBM與惠普等,黃金會員包括思科、戴爾與英特爾等。

OpenStack基本上是一個軟體專案,有近55萬行程式碼。分解成核心專案、孵化專案,以及支援專案和相關專案。除了以上提及的五大組成,與虛擬網路有關的Quantum首次被列為核心專案。

KVM是一個脫穎而出的開放虛擬化技術。它是由一個大型的、活躍的開放社群共同開發的,紅帽、IBM、SUSE等都是其成員。2011年,IBM、紅帽、英特爾與惠普等建立開放虛擬化聯盟(OVA),幫助構建KVM生態系統,提升KVM採用率。如今,OVA已經擁有超過250名成員公司,其中,IBM有60多位程式設計師專門工作於KVM開源社群。

Docker和openstack

OpenStack和Docker之間是很好的互補關係。Docker的出現能讓IaaS層的資源使用得更加充分,因為Docker相對虛擬機器來說更輕量,對資源的利用率會更加充分;

堅持學習Java100天第015天 K8S入門

平臺提供一個完整管理資料中心的解決方案,至於用哪種hypervisor或container只是雲平臺中的一個小部分。像OpenStack這樣的雲平臺包含了多租戶的安全、隔離、管理、監控、儲存、網路等其他部分。雲資料中心的管理需要很多服務支撐,但這和用Docker還是KVM其實沒多大關係。

Docker不是一個全功能的VM, 它有很多嚴重的缺陷,比如安全、Windows支援,因此不能完全替代KVM。現在Docker社群一直在彌補這些缺陷,當然這會帶來一定的效能損耗。

軟體開發思想

liaas:infrastructure as a service,基礎設施即服務。使用者租用或者購買雲主機,不需要考慮網路,儲存,DNS服務配置。減輕了使用者對硬體的維護成本。對於運營商來說,提供網路,儲存,DNS服務,這樣的服務叫做基礎設施及即服務。

lpaas:platform as a service,平臺即服務。

lfass:function as a service,函式即服務,微服務架構,按照function拆分。

lservice mesh:服務網格架構,服務治理,服務限流,服務降級,服務監控,istio。

lserverless:無服務架構,程式設計師開發完全不需要關心伺服器的事情,只需要開發業務程式碼即可。