Kubernetes(簡稱 K8s) 是一個開源(遵循 Apache 2.0 協(xié)議)的容器集群管理系統(tǒng)切黔,源自 Google 15 年生產(chǎn)環(huán)境的運(yùn)維經(jīng)驗(yàn)酗电,用于實(shí)現(xiàn)自動部署月洛,擴(kuò)展和管理容器化應(yīng)用程序婉徘。K8s 提供了容器編排藏研,資源調(diào)度敬矩,彈性伸縮,部署管理和服務(wù)發(fā)現(xiàn)等一系列功能蠢挡,使容器化應(yīng)用的部署工作更加簡單和高效弧岳。
1.K8s 特性
1、自我修復(fù)
在節(jié)點(diǎn)故障時(shí)重新啟動失敗的容器业踏,替換和重新部署禽炬,保證預(yù)期的副本數(shù)量;殺死健康檢查失敗的容器勤家,并且在未準(zhǔn)備好之前不會處理客戶端的請求腹尖,確保線上服務(wù)不中斷。
2伐脖、彈性收縮
使用命令热幔、UI 或者基于 CPU 使用情況自動快速擴(kuò)容和縮容應(yīng)用程序?qū)嵗WC應(yīng)用業(yè)務(wù)高峰并發(fā)時(shí)的高可用性讼庇;業(yè)務(wù)低峰時(shí)回收資源绎巨,以最小成本運(yùn)行服務(wù)。
3蠕啄、自動部署和回滾
采用滾動更新策略更新應(yīng)用场勤,一次更新一個 Pod,而不是同時(shí)刪除所有 Pod歼跟,如果更新過程中出現(xiàn)問題和媳,將回滾更改,確保升級升級過程中不影響業(yè)務(wù)運(yùn)行嘹承。
4窗价、服務(wù)發(fā)現(xiàn)和負(fù)載均衡
能夠?yàn)槎鄠€容器提供統(tǒng)一訪問入庫(內(nèi)部 IP 地址和一個 DNS 名稱),并且負(fù)載均衡關(guān)聯(lián)所有容器叹卷,使用戶無需考慮容器 IP 的問題撼港。
5坪它、機(jī)密數(shù)據(jù)和配置管理
能夠管理機(jī)密數(shù)據(jù)和應(yīng)用程序配置,不需要把敏感數(shù)據(jù)暴露在鏡像里帝牡,提高敏感數(shù)據(jù)安全性往毡,并可以存儲一些常用的配置,方便應(yīng)用和使用靶溜。
6开瞭、存儲編排
能夠掛載外部存儲系統(tǒng),無論是來自本地存儲罩息,公有云(如:AWS)嗤详,還是網(wǎng)絡(luò)存儲(如:NFS、ClusterFS瓷炮、Ceph)都可以作為集群資源的一部分使用葱色,極大提供存儲使用的靈活性。
7娘香、批處理
提供一次性任務(wù)苍狰、定時(shí)任務(wù);滿足批量數(shù)據(jù)處理和分析的場景烘绽。
2淋昭、核心概念
1、Pod
Pod 是在 K8s 集群中運(yùn)行部署應(yīng)用或服務(wù)的最小單元安接,它是可以支持多容器的翔忽。Pod 的設(shè)計(jì)理念是支持多個容器在一個 Pod 中共享網(wǎng)絡(luò)地址和文件系統(tǒng),可以通過進(jìn)程間通信和文件共享這種簡單高效的方式組合完成服務(wù)赫段。Pod 對多容器的支持是 K8s 最基礎(chǔ)的設(shè)計(jì)理念呀打,如:運(yùn)行一個操作系統(tǒng)發(fā)行版的軟件倉庫,一個 Nginx 容器用來發(fā)布軟件糯笙,另一個容器專門用來從源倉庫做同步贬丛,這兩個容器的鏡像不太可能是一個團(tuán)隊(duì)開發(fā)的,但是他們一塊兒工作才能提供一個微服務(wù)给涕;這種情況下豺憔,不同的團(tuán)隊(duì)各自開發(fā)構(gòu)建自己的容器鏡像,在部署的時(shí)候組合成一個微服務(wù)對外提供服務(wù)够庙。
2恭应、副本集(Replica Set,RS)
RS 是 K8s 集群中保證 Pod 高可用的 API 對象耘眨。通過監(jiān)控運(yùn)行中的 Pod 來保證集群中運(yùn)行指定數(shù)目的 Pod 副本昼榛。指定的數(shù)目可以是多個也可以是 1 個;少于指定數(shù)目剔难,RS 就會啟動運(yùn)行新的 Pod 副本胆屿;多于指定數(shù)目奥喻,RS 就會殺死多余的 Pod 副本。即使在指定數(shù)目為 1 的情況下非迹,通過 RS 運(yùn)行 Pod 也比直接運(yùn)行 Pod 更明智环鲤,因?yàn)?RS 也可以發(fā)揮它高可用的能力,保證永遠(yuǎn)有 1 個 Pod 在運(yùn)行憎兽。
3冷离、部署(Deployment)
Deployment 表示用戶對 K8s 集群的一次更新操作。部署是一個比 RS 應(yīng)用模式更廣的 API 對象纯命,可以是創(chuàng)建一個新的服務(wù)西剥,更新一個新的服務(wù),也可以是滾動升級一個服務(wù)扎附。滾動升級一個服務(wù)蔫耽,實(shí)際是創(chuàng)建一個新的 RS,然后逐漸將新 RS 中副本數(shù)增加到理想狀態(tài)留夜,將舊 RS 中的副本數(shù)減小到 0 的復(fù)合操作;這樣一個復(fù)合操作用一個 RS 是不太好描述的图甜,所以用一個更通用的 Deployment 來描述碍粥。
4、服務(wù)(Service)
RS 和 Deployment 只是保證了支撐服務(wù)的微服務(wù) Pod 的數(shù)量黑毅,但是沒有解決如何訪問這些服務(wù)的問題嚼摩。一個 Pod 只是一個運(yùn)行服務(wù)的實(shí)例,隨時(shí)可能在一個節(jié)點(diǎn)上停止矿瘦,在另一個節(jié)點(diǎn)以一個新的 IP 啟動一個新的 Pod枕面,因此不能以確定的 IP 和端口號提供服務(wù)。要穩(wěn)定地提供服務(wù)需要服務(wù)發(fā)現(xiàn)和負(fù)載均衡能力缚去,服務(wù)發(fā)現(xiàn)完成的工作潮秘,是針對客戶端訪問的服務(wù),找到對應(yīng)的的后端服務(wù)實(shí)例易结。在 K8s 集群中枕荞,客戶端需要訪問的服務(wù)就是 Service 對象。每個 Service 會對應(yīng)一個集群內(nèi)部有效的虛擬 IP搞动,集群內(nèi)部通過虛擬 IP 訪問一個服務(wù)躏精。在 K8s 集群中微服務(wù)的負(fù)載均衡是由 Proxy 實(shí)現(xiàn)的,Proxy 是 K8s 集群內(nèi)部的負(fù)載均衡器鹦肿。它是一個分布式代理服務(wù)器矗烛,在 K8s 的每個節(jié)點(diǎn)上都有一個,需要訪問服務(wù)的節(jié)點(diǎn)越多箩溃,提供負(fù)載均衡能力的 Proxy 就越多瞭吃,高可用節(jié)點(diǎn)也隨之增多碌嘀。
5、任務(wù)(Job)和定時(shí)任務(wù)(Cronjob)
Job 是 K8s 用來控制批處理型任務(wù)的 API 對象虱而。批處理業(yè)務(wù)與長期伺服業(yè)務(wù)的主要區(qū)別是批處理業(yè)務(wù)的運(yùn)行有頭有尾筏餐,而長期伺服業(yè)務(wù)在用戶不停止的情況下永遠(yuǎn)運(yùn)行。Job 管理的 Pod 根據(jù)用戶的設(shè)置把任務(wù)成功完成就自動退出了牡拇。成功完成的標(biāo)志根據(jù)不同的策略而不同:單 Pod 型任務(wù)有一個 Pod 成功就標(biāo)志完成魁瞪;定數(shù)成功型任務(wù)保證有 N 個任務(wù)全部成功;工作隊(duì)列型任務(wù)根據(jù)應(yīng)用確認(rèn)的全局成功而標(biāo)志成功惠呼。任務(wù)可以設(shè)置成定時(shí)執(zhí)行的模式导俘。
6、后臺支撐服務(wù)集(DaemonSet)
長期伺服型和批處理型服務(wù)的核心在業(yè)務(wù)應(yīng)用剔蹋,可能有些節(jié)點(diǎn)運(yùn)行多個同類業(yè)務(wù)的 Pod旅薄,有些節(jié)點(diǎn)上又沒有這類 Pod 運(yùn)行;而后臺支撐型服務(wù)的核心關(guān)注點(diǎn)在 K8s 集群中的節(jié)點(diǎn)(物理機(jī)或虛擬機(jī))泣崩,要保證每個節(jié)點(diǎn)上都有一個此類 Pod 運(yùn)行少梁。節(jié)點(diǎn)可能是所有集群節(jié)點(diǎn)也可能是選定的一些特定節(jié)點(diǎn)。典型的后臺支撐型服務(wù)包括矫付,存儲凯沪,日志和監(jiān)控等在每個節(jié)點(diǎn)上支持 K8s 集群運(yùn)行的服務(wù)。
7买优、存儲卷(Volume)
K8s 集群中的存儲卷跟 Docker 的存儲卷有些類似妨马,只不過 Docker 的存儲卷作用范圍為一個容器,而 K8s 的存儲卷的生命周期和作用范圍是一個 Pod杀赢。每個 Pod 中聲明的存儲卷由 Pod 中的所有容器共享烘跺。K8s 支持非常多的存儲卷類型,特別的脂崔,支持多種公有云平臺的存儲滤淳,包括 AWS,Google 和 Azure 云脱篙;支持多種分布式存儲包括 GlusterFS 和 Ceph娇钱;也支持較容易使用的主機(jī)本地目錄 hostPath 和 NFS 。
8绊困、持久存儲卷(Persistent Volume文搂,PV)和持久存儲卷聲明(Persistent Volume Claim,PVC)
PV 和 PVC 使得 K8s 集群具備了存儲的邏輯抽象能力秤朗,使得在配置 Pod 的邏輯里可以忽略對實(shí)際后臺存儲技術(shù)的配置煤蹭,而把這項(xiàng)配置的工作交給 PV 的配置者,即集群的管理者。存儲的 PV 和 PVC 的這種關(guān)系硝皂,跟計(jì)算的 Node 和 Pod 的關(guān)系是非常類似的常挚;PV 和 Node 是資源的提供者,根據(jù)集群的基礎(chǔ)設(shè)施變化而變化稽物,由 K8s 集群管理員配置奄毡;而 PVC 和 Pod 是資源的使用者,根據(jù)業(yè)務(wù)服務(wù)的需求變化而變化贝或,有K8s集群的使用者即服務(wù)的管理員來配置吼过。
9、工作節(jié)點(diǎn)(Node)
K8s 集群中的計(jì)算能力由 Node 提供咪奖,K8s集群中的 Node 是所有 Pod 運(yùn)行所在的工作主機(jī)盗忱,可以是物理機(jī)也可以是虛擬機(jī)。不論是物理機(jī)還是虛擬機(jī)羊赵,工作主機(jī)的統(tǒng)一特征是上面要運(yùn)行 kubelet 管理節(jié)點(diǎn)上運(yùn)行的容器趟佃。
10、密鑰對象(Secret)
Secret 是用來保存和傳遞密碼昧捷、密鑰闲昭、認(rèn)證憑證這些敏感信息的對象。使用 Secret 的好處是可以避免把敏感信息明文寫在配置文件里靡挥。在 K8s 集群中配置和使用服務(wù)不可避免的要用到各種敏感信息實(shí)現(xiàn)登錄汤纸、認(rèn)證等功能,例如訪問 AWS 存儲的用戶名密碼芹血。為了避免將類似的敏感信息明文寫在所有需要使用的配置文件中,可以將這些信息存入一個 Secret 對象楞慈,而在配置文件中通過 Secret 對象引用這些敏感信息幔烛。這種方式的好處包括:意圖明確,避免重復(fù)囊蓝,減少暴漏機(jī)會饿悬。
11、用戶帳戶(User Account)和服務(wù)帳戶(Service Account)
用戶帳戶為人提供賬戶標(biāo)識聚霜,而服務(wù)賬戶為計(jì)算機(jī)進(jìn)程和 K8s 集群中運(yùn)行的 Pod 提供賬戶標(biāo)識狡恬。用戶帳戶和服務(wù)帳戶的一個區(qū)別是作用范圍;用戶帳戶對應(yīng)的是人的身份蝎宇,人的身份與服務(wù)的名字空間無關(guān)弟劲,所以用戶賬戶是跨名字空間的;而服務(wù)帳戶對應(yīng)的是一個運(yùn)行中程序的身份姥芥,與特定名字空間是相關(guān)的兔乞。
12、名字空間(Namespace)
Namespace 為 K8s 集群提供虛擬的隔離作用,K8s 集群初始有兩個名字空間庸追,分別是默認(rèn)名字空間 "default" 和系統(tǒng)名字空間 "kube-system"霍骄,除此以外,管理員可以可以創(chuàng)建新的名字空間滿足需要淡溯。
13读整、標(biāo)簽(Label)
Label 附加在資源上,用于關(guān)聯(lián)對象的查詢和篩選咱娶。
3米间、K8s 架構(gòu)和組件
1、主控節(jié)點(diǎn) / Master 組件:
1)API Server
集群統(tǒng)一入口豺总,各組件的協(xié)調(diào)者车伞,提供認(rèn)證、授權(quán)喻喳、訪問控制另玖、API注冊和發(fā)現(xiàn)等機(jī)制,以 RESTful API 的方式提供接口服務(wù)表伦,所有對象資源的增刪改查和監(jiān)聽都由 API Server 處理后提交給 Etcd 存儲谦去。
2)Etcd Cluster
分布式鍵值存儲系統(tǒng)集群,用于保存集群狀態(tài)數(shù)據(jù)蹦哼,如:Pod鳄哭、Service 等資源對象信息。
3)Controller Manager
控制器管理程序纲熏,負(fù)責(zé)控制器的管理妆丘,控制器和資源一一對應(yīng),控制器用于維護(hù)集群的狀態(tài)局劲,如:故障檢測勺拣、自動擴(kuò)展、滾動更新等常規(guī)后臺任務(wù)鱼填。
4)Scheduler
調(diào)度程序,負(fù)責(zé)資源的調(diào)度苹丸,按照預(yù)定的調(diào)度策略將 Pod 調(diào)度到相應(yīng)的機(jī)器上愤惰,調(diào)度程序根據(jù)調(diào)度算法為新創(chuàng)建的 Pod 選擇一個 Node 節(jié)點(diǎn)赘理,可以任意部署,可以部署在同一個節(jié)點(diǎn)上感憾,也可以部署在不同的節(jié)點(diǎn)上令花。
2、工作節(jié)點(diǎn) / Node 組件:
1)Kubelet
主控節(jié)點(diǎn)代理程序凉倚,在 Node 節(jié)點(diǎn)上執(zhí)行 Master 節(jié)點(diǎn)安排的任務(wù),它將每個 Pod 轉(zhuǎn)換成一組容器稽寒,用于管理本節(jié)點(diǎn)運(yùn)行容器的生命周期,如:創(chuàng)建容器杏糙、Pod 掛載數(shù)據(jù)卷慎王、下載 Secret 、獲取容器和節(jié)點(diǎn)狀態(tài)等工作宏侍。
2)Proxy
網(wǎng)絡(luò)代理程序赖淤,在 Node 節(jié)點(diǎn)上實(shí)現(xiàn) Pod 網(wǎng)絡(luò)代理,負(fù)責(zé)為 Service 提供 Cluster 內(nèi)部的服務(wù)發(fā)現(xiàn)谅河、網(wǎng)絡(luò)規(guī)劃和負(fù)載均衡咱旱。
3)Docker
容器引擎,負(fù)責(zé)所有具體的映像下載和容器運(yùn)行绷耍。
3吐限、第三方插件:
1)Flannel
Finnal 是一個為 K8s 原生集成的三層網(wǎng)絡(luò)解決方案,主要用于解決容器之間的網(wǎng)絡(luò)(CNI 網(wǎng)絡(luò))通信問題褂始,F(xiàn)lannel 為每個 Node 工作節(jié)點(diǎn)分配獨(dú)立的子網(wǎng)網(wǎng)段诸典,并將所有的網(wǎng)絡(luò)信息存儲在 Etcd 數(shù)據(jù)庫中。脫離 CNI 網(wǎng)絡(luò)的 K8s 集群是無法工作的崎苗,因此在部署 K8s 集群時(shí)必須部署 Flannel 插件狐粱。
2)CoreDNS
CoreDNS 是一個為 K8s 原生集成的域名發(fā)現(xiàn)解決方案,主要用于將 K8s 服務(wù)的動態(tài) IP 地址自動映射成為 "<service-name>:<service-namespace>" 規(guī)則的 DNS 域名胆数。因 K8s 在創(chuàng)建服務(wù)時(shí)會分配動態(tài)的 IP 地址脑奠,因此當(dāng)在【B 容器 】中使用【A 容器】發(fā)布的服務(wù),因?yàn)椤続 容器】的服務(wù)對應(yīng)的 IP 是動態(tài)可變的幅慌,所以應(yīng)當(dāng)通過該服務(wù)對應(yīng)的 DNS 獲取,例如:"http(s)://<service-name>:<service-namespace>"轰豆。
3)Dashboard
Dashboard 是一個為 K8s 原生集成的用戶界面胰伍,主要用于 K8s 的可視化管理。使用 Dashboard 可以監(jiān)控酸休、管理 K8s 集群和集群中的各類資源(如 Deployment骂租,Job,DaemonSet 等等)斑司,還可以完成對 Deployment 實(shí)現(xiàn)彈性伸縮渗饮、發(fā)起滾動升級、重啟 Pod 或者使用向?qū)?chuàng)建新應(yīng)用等管理行為。
4)Ingress-Nginx
Ingress-Nginx 是一個為 K8s 原生集成的服務(wù)網(wǎng)關(guān)互站,主要用于對集群中的服務(wù)(通常是 Http 或 Https 服務(wù))的外部訪問的 API 對象私蕾,以及提供負(fù)載平衡、SSL 終端和基于名稱的虛擬主機(jī)胡桃。
4踩叭、應(yīng)用場景
K8s 主要應(yīng)用于云架構(gòu)和云原生的部署場景。“云” 是使用容器構(gòu)建的一套服務(wù)集群網(wǎng)絡(luò)翠胰,它由很多的容器構(gòu)成容贝;“K8s” 則是用來管理云中的容器平臺工具。
1之景、云架構(gòu)
- PaaS(平臺即服務(wù)): 運(yùn)營商提供 MySQL 斤富、Redis、MQ锻狗、Elasticsearch 等數(shù)據(jù)庫或中間件等服務(wù)满力;用戶租用(購買或分配權(quán)限)后直接使用。
- SaaS(軟件即服務(wù)):運(yùn)營商提供應(yīng)用系統(tǒng)的部署和發(fā)布等服務(wù)脚囊;用戶租用(購買或分配權(quán)限)后直接使用滑沧。
2惫叛、云原生
為了讓應(yīng)用程序(項(xiàng)目翁锡,服務(wù)軟件)都運(yùn)行在云上的解決方案李根,這樣方案叫做云原生校摩,有以下特點(diǎn):
- 容器化:所有的服務(wù)都必須部署在容器中;
- 微服務(wù):Web 服務(wù)架構(gòu)是微服務(wù)架構(gòu)衙吩;
- CI/CD:可持續(xù)交互和可持續(xù)部署;
- DevOps:開發(fā)和運(yùn)維密不可分坤塞。