我第一次接觸容器編排調(diào)度工具是 Docker 自家的 Docker Swarm,主要解決當(dāng)時(shí)公司內(nèi)部業(yè)務(wù)項(xiàng)目部署繁瑣的問(wèn)題,我記得當(dāng)時(shí)項(xiàng)目實(shí)現(xiàn)容器化之后,花在項(xiàng)目部署運(yùn)維的時(shí)間大大減少了,當(dāng)時(shí)覺(jué)得這玩意還挺新鮮的,原來(lái)自動(dòng)化運(yùn)維可以這么玩。后面由于工作原因,很久沒(méi)碰過(guò)容器方面的知識(shí)了。最近在公司的數(shù)據(jù)同步項(xiàng)目中,需要使用到分布式調(diào)度數(shù)據(jù)同步執(zhí)行單元,目前使用的方案是將數(shù)據(jù)同步執(zhí)行單元打包成鏡像,使用 K8s 進(jìn)行調(diào)度,正好趁這個(gè)機(jī)會(huì)了解一下 K8s,下面我就用圖解的形式將我所理解的 K8s 分享給大家。
K8s 三大核心功能
K8s 是一個(gè)輕便的和可擴(kuò)展的開(kāi)源平臺(tái),用于管理容器化應(yīng)用和服務(wù)。通過(guò) K8s 能夠進(jìn)行應(yīng)用的自動(dòng)化部署和擴(kuò)縮容。
K8s 是比容器更上一層的架構(gòu),它可以支持多種容器技術(shù),比如我們熟悉的 Docker,K8s 定位是一個(gè)容器調(diào)度工具,它主要具備以下三大核心能力:
1、自動(dòng)調(diào)度
k8s 將用戶部署提交的容器放到 k8s 集群的任意一個(gè)節(jié)點(diǎn)中,k8s 可以根據(jù)容器所需要的資源大小,以及節(jié)點(diǎn)的負(fù)載情況來(lái)決定容器放在哪個(gè)節(jié)點(diǎn)上面。

2、自動(dòng)修復(fù)
當(dāng) k8s 的健康檢查機(jī)制發(fā)現(xiàn)某個(gè)節(jié)點(diǎn)出現(xiàn)問(wèn)題,它會(huì)自動(dòng)將該節(jié)點(diǎn)上的資源轉(zhuǎn)移到其它節(jié)點(diǎn)上面完成自動(dòng)恢復(fù)。

3、橫向自動(dòng)擴(kuò)縮容
在 k8s 1.1+ 版本中,有一個(gè)功能叫 “ Horizontal Pod Autoscaler”,簡(jiǎn)稱 “HPA”,意思是 Pod自動(dòng)擴(kuò)容,它可以預(yù)先定義 Pod 的負(fù)載指標(biāo),當(dāng)達(dá)到預(yù)期設(shè)定的負(fù)載指標(biāo)后,就會(huì)根據(jù)指標(biāo)自動(dòng)觸發(fā)自動(dòng)動(dòng)態(tài)擴(kuò)容/縮容行為。
1)橫向自動(dòng)擴(kuò)容

2)橫向自動(dòng)縮容

節(jié)點(diǎn)
從上面的圖可以看出來(lái),k8s 集群的節(jié)點(diǎn)有兩個(gè)角色,分別為 Master 節(jié)點(diǎn)和 Node 節(jié)點(diǎn),整個(gè) K8s 集群Master 和 Node 節(jié)點(diǎn)關(guān)系如下圖所示:

1、Master 節(jié)點(diǎn)
Master 節(jié)點(diǎn)也稱為控制節(jié)點(diǎn),每個(gè) k8s 集群都有一個(gè) Master 節(jié)點(diǎn)負(fù)責(zé)整個(gè)集群的管理控制,我們上面介紹的 k8s 三大能力都是經(jīng)過(guò) Master 節(jié)點(diǎn)發(fā)起的,Master 節(jié)點(diǎn)包含了以下幾個(gè)組件:

- API Server:提供了 HTTP Rest 接口的服務(wù)進(jìn)程,所有資源對(duì)象的增、刪、改、查等操作的唯一入口;
- Controller Manager:k8s 集群所有資源對(duì)象的自動(dòng)化控制中心;
- Scheduler:k8s 集群所有資源對(duì)象自動(dòng)化調(diào)度控制中心;
- ETCD:k8s 集群注冊(cè)服務(wù)發(fā)現(xiàn)中心,可以保存 k8s 集群中所有資源對(duì)象的數(shù)據(jù)。
2、Node
Node 節(jié)點(diǎn)的作用是承接 Master 分配的工作負(fù)載,它主要有以下幾個(gè)關(guān)鍵組件:

- kubelet:負(fù)責(zé) Pod 對(duì)應(yīng)容器的創(chuàng)建、啟停等操作,與 Master 節(jié)點(diǎn)緊密協(xié)作;
- kube-porxy:實(shí)現(xiàn) k8s 集群通信與負(fù)載均衡的組件。
從圖上可看出,在 Node 節(jié)點(diǎn)上面,還需要一個(gè)容器運(yùn)行環(huán)境,如果使用 Docker 技術(shù)棧,則還需要在 Node 節(jié)點(diǎn)上面安裝 Docker Engine,專門負(fù)責(zé)該節(jié)點(diǎn)容器管理工作。
Pod
Pod 是 k8s 最重要而且是最基本的一個(gè)資源對(duì)象,它的結(jié)構(gòu)如下:

從以上 Pod 的結(jié)構(gòu)圖可以看出,它其實(shí)是容器的一個(gè)上層包裝結(jié)構(gòu),這也就是為什么 K8s 可以支持多種容器類型的原因,基于這方面,我理解 k8s 的定位就是一個(gè)編排與調(diào)度工具,而容器只是它調(diào)度的一個(gè)資源對(duì)象而已。
Pod 可包含多個(gè)容器在里面,每個(gè) Pod 至少會(huì)有一個(gè) Pause 容器,其它用戶定義的容器都共享該 Pause 容器,Pause 容器的主要作用是用于定義 Pod 的 ip 和 volume。
Pod 在 k8s 集群中的位置如下圖所示:

Label
Label 在 k8s 中是一個(gè)非常核心的概念,我們可以將 Label 指定到對(duì)應(yīng)的資源對(duì)象中,例如 Node、Pod、Replica Set、Service 等,一個(gè)資源可以綁定任意個(gè) Label,k8s 通過(guò) Label 可實(shí)現(xiàn)多維度的資源分組管理,后續(xù)可通過(guò) Label Selector 查詢和篩選擁有某些 Label 的資源對(duì)象,例如創(chuàng)建一個(gè) Pod,給定一個(gè) Label,workerid=123,后續(xù)可通過(guò) workerid=123 刪除擁有該標(biāo)簽的 Pod 資源。

Replica Set
Replica Set 目的是為了定義一個(gè)期望的場(chǎng)景,比如定義某種 Pod 的副本數(shù)量在任意時(shí)刻都處于 Peplica Set 期望的值,假設(shè) Replica Set 定義 Pod 的副本數(shù)目為:replicas=2,當(dāng)該 Replica Set 提交給 Master 后,Master 會(huì)定期巡檢該 Pod 在集群中的數(shù)目,如果發(fā)現(xiàn)該 Pod 掛掉了一個(gè),Master 就會(huì)嘗試依據(jù) Replica Set 設(shè)置的 Pod 模板創(chuàng)建 Pod,以維持 Pod 的數(shù)量與 Replica Set 預(yù)期的 Pod 數(shù)量相同。
通過(guò) Replica Set,k8s 集群實(shí)現(xiàn)了用戶應(yīng)用的高可用性,而且大大減少了運(yùn)維工作量。因此生產(chǎn)環(huán)境一般用 Deployment 或者 Replica Set 去控制 Pod 的生命周期和期望值,而不是直接單獨(dú)創(chuàng)建 Pod。

類似 Replica Set 的還有 Deployment,它的內(nèi)部實(shí)現(xiàn)也是通過(guò) Replica Set 實(shí)現(xiàn)的,可以說(shuō) Deployment 是 Replica Set 的升級(jí)版,它們之間的 yaml 配置文件格式大部分都相同。
Service
Service 是 k8s 能夠?qū)崿F(xiàn)微服務(wù)集群的一個(gè)非常重要的概念,顧名思義,k8s 的 Service 就是我們平時(shí)所提及的微服務(wù)架構(gòu)中的“微服務(wù)”,本文上面提及的 Pod、Replica Set 等都是為 Service 服務(wù)的資源, 如下圖表示 Service、Pod、Replica Set 的關(guān)系:

從上圖可看出,Service 定義了一個(gè)服務(wù)訪問(wèn)的入口,客戶端通過(guò)這個(gè)入口即可訪問(wèn)服務(wù)背后的應(yīng)用集群實(shí)例,而 Service 則是通過(guò) Label Selector 實(shí)現(xiàn)關(guān)聯(lián)與對(duì)接的,Replica Set 保證服務(wù)集群資源始終處于期望值。
以上只是一個(gè)微服務(wù),通常來(lái)說(shuō)一個(gè)應(yīng)用項(xiàng)目會(huì)由多個(gè)不同業(yè)務(wù)能力而又彼此獨(dú)立的微服務(wù)組成,多個(gè)微服務(wù)間組成了一個(gè)強(qiáng)大而又高可用的應(yīng)用服務(wù)集群。

Namespace
Namespace 顧名思義是命名空間的意思,在 k8s 中主要用于實(shí)現(xiàn)資源隔離的目的,用戶可根據(jù)不同項(xiàng)目創(chuàng)建不同的 Namespace,通過(guò) k8s 將資源分配到不同 Namespace 中,即可實(shí)現(xiàn)不同項(xiàng)目的資源隔離:
