我們專(zhuān)門(mén)為 VMware 用戶(hù)寫(xiě)了這篇文章,利用你所熟悉的 vSphere 平臺來(lái)跟 K8s 作一個(gè)類(lèi)比,從而幫助你快速了解 K8s。

Kubernetes 和 vSphere 的總體架構對比
VSPHERE 平臺和 KUBERNETES 的總體對比
那么到底什么是 Kubernetes 呢? 簡(jiǎn)單來(lái)說(shuō),K8s 和容器的關(guān)系就相當于vSphere和虛機的關(guān)系。在 VMware 發(fā)展早期的時(shí)候,那時(shí)候只有 VMware Workstation,后來(lái)出現了基于vCenter 和ESXi 的VI/vSphere 體系架構,從而使虛擬化步入了數據中心。同樣的,容器一開(kāi)始的時(shí)候只有一個(gè)簡(jiǎn)單的容器引擎 Docker,K8s 的出現為容器提供了一個(gè)生產(chǎn)級的運行環(huán)境。把 vSphere 和 K8s 平臺肩并肩放在一起比較的話(huà),你會(huì )發(fā)現它們的概念有很多類(lèi)似之處,這可以幫助我們很快地理解 K8s 技術(shù)的各種細節。

虛擬化技術(shù)和容器技術(shù)演進(jìn)的對比
系統架構
就像 vSphere 平臺上的 vCenter 和 ESXi 主機, K8s 平臺上也有對應的概念:Master 和節點(diǎn) (node), Master 起到的作用就跟 vCenter 一樣,對整個(gè) K8s 集群進(jìn)行管理,它也是工作負載管理 API 的訪(fǎng)問(wèn)入口。跟 ESXi 主機對應的就是K8s節點(diǎn),節點(diǎn)是 K8s 集群中的計算資源,容器就是運行在節點(diǎn)上,節點(diǎn)可以是虛機或者物理服務(wù)器。K8s 也有一個(gè)類(lèi)似于 vCenter DB 的數據庫 “etcd”,它以的“鍵-值”方式存儲了整個(gè)集群的配置和狀態(tài)。

跟 vSphere 不同的是,K8s Master上也能運行容器負載,當然 vCenter Server 上是不運行虛機的。雖然 K8s Master 也是一種計算資源,但是一般只在上面運行系統管理相關(guān)的容器應用,普通的應用負載不應該放在 Master 上。
vSphere 有GUI 管理界面 Web Client 和命令行管理接口 vCLI 和 Power CLI,K8s 也提供了GUI 界面或命令行來(lái)管理 K8s 集群。下面截屏是使用命令 “kubectl.exe” 來(lái)管理K8s 集群的例子,我們可以看到這個(gè)集群有一個(gè) Master (vkubemaster007) 和4個(gè)節點(diǎn) (vkubemode017~18),K8s 的版本是v1.6.5,節點(diǎn)上的操作系統是Ubuntu 16.04。

截屏:K8s 的命令行管理界面
工作負載
vSphere 中的工作負載調度單位是虛機, K8s 中的調度單位是 Pod;一臺 ESXi 主機上可以運行多個(gè)虛機,一個(gè) K8s 節點(diǎn)上也可以運行多個(gè) Pod,每個(gè) Pod 都有一個(gè)獨立的 IP 地址來(lái)跟其他的 Pod 相通訊。在 vSphere 環(huán)境中,應用運行在虛機的操作系統中,K8s 平臺上應用運行在容器里;一個(gè)虛機中只能運行一個(gè)操作系統實(shí)例,而一個(gè) Pod 中可以運行多個(gè)容器實(shí)例。K8s 會(huì )考慮到 Pod 的關(guān)聯(lián)性而把 Pod 中的容器實(shí)例運行在同一個(gè)節點(diǎn)上,從而讓他們共享同一個(gè)運行環(huán)境;一般是把一個(gè)應用和它相關(guān)的輔助模塊設計在同一個(gè) Pod 中,然后作為一個(gè)整體來(lái)進(jìn)行調度運行。

系統管理
我們使用 Web Client 來(lái)管理 vSphere 集群,K8s 也有一個(gè)圖形化的管理界面Dashboard,同 Web Client 一樣,這也是一個(gè)基于 Web 的應用。Dashboard 的功能也變得越來(lái)越強大,它可以實(shí)現大部分的 K8s 集群管理功能,而不用輸入很長(cháng)的 kubectl 命令。

系統配置
K8s 可以通過(guò)一個(gè)YAML (Yet Another Markup Language) 文件來(lái)定義和描述 K8s 集群的配置和狀態(tài),然后就可以基于該文件創(chuàng )建整個(gè) K8s 集群,K8s 會(huì )盡力地保持集群運行在指定的狀態(tài)。例如,如果你指定了某一個(gè) Pod 要有4個(gè)副本,K8s 就會(huì )監控所有這些 Pod 的運行,如果有任何一個(gè) Pod 工作異常的話(huà),它就會(huì )設法修復這個(gè)狀態(tài),實(shí)在不行的話(huà)就另啟一個(gè) Pod 副本。
要理解 YAML 配置文件的話(huà),你可以把它對應為虛機的 .VMX 文件,或是 Virtual Appliance 的OVF 文件。當然,YAML 配置文件在 K8s 中不僅用于定義集群,也用于定義其他的組件,如: 副本集合、服務(wù)、部署等。

虛擬集群
vSphere 中為了管理資源的分配專(zhuān)門(mén)有一個(gè)“資源池 (Resource Pool)”的概念,就像是在物理集群中劃分出了一些小的虛擬集群,vSphere 利用資源池來(lái)控制資源的分配。K8s 也有類(lèi)似的概念叫“namespaces”,namespace 的主要用途是創(chuàng )建多租戶(hù)環(huán)境,也可以在上面指定資源配額 (Resource Quota) 。

資源管理
vSphere 需要指定每一個(gè) Resource Pool 的資源分配限額,K8s 可以在 namespace 上設置資源配額 (Resource Quotas) 來(lái)控制資源分配,這是在 YAML 配置文件中定義的。
工作負載標記
這在 vSphere 和 K8s 中幾乎是完全一致的,vSphere 使用 tag 標簽來(lái)標識虛機,而 K8s 使用標簽 (label) 來(lái)標識容器。所不同的是,K8s 中標簽是必須的,而不是可選的。

計算冗余
vSphere 中有 Fault Tolerance 技術(shù)來(lái)提供計算資源的冗余,受保護的虛機運行在一臺服務(wù)器上,另一臺服務(wù)器上有一個(gè)從被保護虛機復制而來(lái)的影子 (Shadow),FT 技術(shù)通過(guò) Lockstep 來(lái)同步主虛機和影子虛機之間的數據和狀態(tài)。正常情況下影子虛機是不工作的,當主服務(wù)器宕機時(shí),影子虛機立刻被激活成主虛機,并繼續主虛機工作;這時(shí) vSphere 會(huì )設法在集群中找到另一臺合適的服務(wù)器,在上面從新的主虛機復制出新的影子虛機,以繼續對主虛機進(jìn)行保護。
K8s 中也有相應的資源冗余機制,ReplicaSets 用于指定一個(gè) Pod 需要運行的實(shí)例數量,K8s 會(huì )自動(dòng)維持實(shí)例的數量,任何一個(gè)實(shí)例由于故障原因宕掉了,K8s 馬上會(huì )自動(dòng)啟動(dòng)一個(gè)新的實(shí)例補上。當然兩者基本的工作原理是不一樣的,K8s 中的所有實(shí)例正常情況都是在工作的,在多個(gè)實(shí)例間均衡工作負載,而不存在主備的概念,這是由云原生應用的本質(zhì)所決定的。

負載均衡
vSphere 并不內置有負載均衡功能,一般是通過(guò)虛擬的 (如 NSX) 或物理的 (如 F5) 負載均衡器來(lái)把服務(wù)請求平均分配給多臺虛機。負載均衡也有多種配置模式,以單肩模式 (one-armed) 為例,我們把網(wǎng)絡(luò )流量東西向地均衡分配給虛機。
K8s 中也有類(lèi)似的概念“Service”,是一組一起協(xié)作的 Pod,每個(gè) Pod 都被定義了一個(gè)標簽選擇器 (label selector)。K8s Service 也有多種配置模式,例如“ClusterIP“模式,每個(gè) Service 都被分配了一個(gè)外部可見(jiàn)的靜態(tài) IP 地址和 DNS 域名以便于被訪(fǎng)問(wèn)到,負載流量以輪循 (round-robin) 的方式分配給每一個(gè) Pod。其他的模式如 “NodePort” ,以不同端口訪(fǎng)問(wèn)節點(diǎn)的流量會(huì )被映射到不同的 Pod;當然也可以配成 “LoadBalancer” 模式來(lái)使用外部的負載均衡器。

K8s 還有另外一種非常重要的負載均衡機制 “Ingress Controller”,一個(gè) ingress-controller 以 Pod 的形式存在,并且分配有一個(gè)外部可見(jiàn)的 IP 地址,該 IP 地址對應著(zhù)一個(gè)含有通配符的 DNS 記錄,ingress-controller 根據預先設定的規則來(lái)把流量分配給不同的 Pod。例如下圖中的 IP 地址 192.168.100.244 對應 DNS 域名 sphinx-v*.esxcloud.net,訪(fǎng)問(wèn)sphinx-v1.esxcloud.net 的流量會(huì )被重定向給 “sphinx-svc-1”,而訪(fǎng)問(wèn)sphinx-v2.esxcloud.net 的流量被重定向給 “sphinx-svc2”。