我們專門為 VMware 用戶寫了這篇文章,利用你所熟悉的 vSphere 平臺來跟 K8s 作一個類比,從而幫助你快速了解 K8s。
Kubernetes 和 vSphere 的總體架構(gòu)對比
VSPHERE 平臺和 KUBERNETES 的總體對比
那么到底什么是 Kubernetes 呢? 簡單來說,K8s 和容器的關系就相當于vSphere和虛機的關系。在 VMware 發(fā)展早期的時候,那時候只有 VMware Workstation,后來出現(xiàn)了基于vCenter 和ESXi 的VI/vSphere 體系架構(gòu),從而使虛擬化步入了數(shù)據(jù)中心。同樣的,容器一開始的時候只有一個簡單的容器引擎 Docker,K8s 的出現(xiàn)為容器提供了一個生產(chǎn)級的運行環(huán)境。把 vSphere 和 K8s 平臺肩并肩放在一起比較的話,你會發(fā)現(xiàn)它們的概念有很多類似之處,這可以幫助我們很快地理解 K8s 技術的各種細節(jié)。
虛擬化技術和容器技術演進的對比
系統(tǒng)架構(gòu)
就像 vSphere 平臺上的 vCenter 和 ESXi 主機, K8s 平臺上也有對應的概念:Master 和節(jié)點 (node), Master 起到的作用就跟 vCenter 一樣,對整個 K8s 集群進行管理,它也是工作負載管理 API 的訪問入口。跟 ESXi 主機對應的就是K8s節(jié)點,節(jié)點是 K8s 集群中的計算資源,容器就是運行在節(jié)點上,節(jié)點可以是虛機或者物理服務器。K8s 也有一個類似于 vCenter DB 的數(shù)據(jù)庫 “etcd”,它以的“鍵-值”方式存儲了整個集群的配置和狀態(tài)。
跟 vSphere 不同的是,K8s Master上也能運行容器負載,當然 vCenter Server 上是不運行虛機的。雖然 K8s Master 也是一種計算資源,但是一般只在上面運行系統(tǒng)管理相關的容器應用,普通的應用負載不應該放在 Master 上。
vSphere 有GUI 管理界面 Web Client 和命令行管理接口 vCLI 和 Power CLI,K8s 也提供了GUI 界面或命令行來管理 K8s 集群。下面截屏是使用命令 “kubectl.exe” 來管理K8s 集群的例子,我們可以看到這個集群有一個 Master (vkubemaster007) 和4個節(jié)點 (vkubemode017~18),K8s 的版本是v1.6.5,節(jié)點上的操作系統(tǒng)是Ubuntu 16.04。
截屏:K8s 的命令行管理界面
工作負載
vSphere 中的工作負載調(diào)度單位是虛機, K8s 中的調(diào)度單位是 Pod;一臺 ESXi 主機上可以運行多個虛機,一個 K8s 節(jié)點上也可以運行多個 Pod,每個 Pod 都有一個獨立的 IP 地址來跟其他的 Pod 相通訊。在 vSphere 環(huán)境中,應用運行在虛機的操作系統(tǒng)中,K8s 平臺上應用運行在容器里;一個虛機中只能運行一個操作系統(tǒng)實例,而一個 Pod 中可以運行多個容器實例。K8s 會考慮到 Pod 的關聯(lián)性而把 Pod 中的容器實例運行在同一個節(jié)點上,從而讓他們共享同一個運行環(huán)境;一般是把一個應用和它相關的輔助模塊設計在同一個 Pod 中,然后作為一個整體來進行調(diào)度運行。
系統(tǒng)管理
我們使用 Web Client 來管理 vSphere 集群,K8s 也有一個圖形化的管理界面Dashboard,同 Web Client 一樣,這也是一個基于 Web 的應用。Dashboard 的功能也變得越來越強大,它可以實現(xiàn)大部分的 K8s 集群管理功能,而不用輸入很長的 kubectl 命令。
系統(tǒng)配置
K8s 可以通過一個YAML (Yet Another Markup Language) 文件來定義和描述 K8s 集群的配置和狀態(tài),然后就可以基于該文件創(chuàng)建整個 K8s 集群,K8s 會盡力地保持集群運行在指定的狀態(tài)。例如,如果你指定了某一個 Pod 要有4個副本,K8s 就會監(jiān)控所有這些 Pod 的運行,如果有任何一個 Pod 工作異常的話,它就會設法修復這個狀態(tài),實在不行的話就另啟一個 Pod 副本。
要理解 YAML 配置文件的話,你可以把它對應為虛機的 .VMX 文件,或是 Virtual Appliance 的OVF 文件。當然,YAML 配置文件在 K8s 中不僅用于定義集群,也用于定義其他的組件,如: 副本集合、服務、部署等。
虛擬集群
vSphere 中為了管理資源的分配專門有一個“資源池 (Resource Pool)”的概念,就像是在物理集群中劃分出了一些小的虛擬集群,vSphere 利用資源池來控制資源的分配。K8s 也有類似的概念叫“namespaces”,namespace 的主要用途是創(chuàng)建多租戶環(huán)境,也可以在上面指定資源配額 (Resource Quota) 。
資源管理
vSphere 需要指定每一個 Resource Pool 的資源分配限額,K8s 可以在 namespace 上設置資源配額 (Resource Quotas) 來控制資源分配,這是在 YAML 配置文件中定義的。
工作負載標記
這在 vSphere 和 K8s 中幾乎是完全一致的,vSphere 使用 tag 標簽來標識虛機,而 K8s 使用標簽 (label) 來標識容器。所不同的是,K8s 中標簽是必須的,而不是可選的。
計算冗余
vSphere 中有 Fault Tolerance 技術來提供計算資源的冗余,受保護的虛機運行在一臺服務器上,另一臺服務器上有一個從被保護虛機復制而來的影子 (Shadow),F(xiàn)T 技術通過 Lockstep 來同步主虛機和影子虛機之間的數(shù)據(jù)和狀態(tài)。正常情況下影子虛機是不工作的,當主服務器宕機時,影子虛機立刻被激活成主虛機,并繼續(xù)主虛機工作;這時 vSphere 會設法在集群中找到另一臺合適的服務器,在上面從新的主虛機復制出新的影子虛機,以繼續(xù)對主虛機進行保護。
K8s 中也有相應的資源冗余機制,ReplicaSets 用于指定一個 Pod 需要運行的實例數(shù)量,K8s 會自動維持實例的數(shù)量,任何一個實例由于故障原因宕掉了,K8s 馬上會自動啟動一個新的實例補上。當然兩者基本的工作原理是不一樣的,K8s 中的所有實例正常情況都是在工作的,在多個實例間均衡工作負載,而不存在主備的概念,這是由云原生應用的本質(zhì)所決定的。
負載均衡
vSphere 并不內(nèi)置有負載均衡功能,一般是通過虛擬的 (如 NSX) 或物理的 (如 F5) 負載均衡器來把服務請求平均分配給多臺虛機。負載均衡也有多種配置模式,以單肩模式 (one-armed) 為例,我們把網(wǎng)絡流量東西向地均衡分配給虛機。
K8s 中也有類似的概念“Service”,是一組一起協(xié)作的 Pod,每個 Pod 都被定義了一個標簽選擇器 (label selector)。K8s Service 也有多種配置模式,例如“ClusterIP“模式,每個 Service 都被分配了一個外部可見的靜態(tài) IP 地址和 DNS 域名以便于被訪問到,負載流量以輪循 (round-robin) 的方式分配給每一個 Pod。其他的模式如 “NodePort” ,以不同端口訪問節(jié)點的流量會被映射到不同的 Pod;當然也可以配成 “LoadBalancer” 模式來使用外部的負載均衡器。
K8s 還有另外一種非常重要的負載均衡機制 “Ingress Controller”,一個 ingress-controller 以 Pod 的形式存在,并且分配有一個外部可見的 IP 地址,該 IP 地址對應著一個含有通配符的 DNS 記錄,ingress-controller 根據(jù)預先設定的規(guī)則來把流量分配給不同的 Pod。例如下圖中的 IP 地址 192.168.100.244 對應 DNS 域名 sphinx-v*.esxcloud.net,訪問sphinx-v1.esxcloud.net 的流量會被重定向給 “sphinx-svc-1”,而訪問sphinx-v2.esxcloud.net 的流量被重定向給 “sphinx-svc2”。