雖然Docker已經(jīng)很強大了,但是在實際使用上還是有諸多不便,比如集群管理,資源調(diào)度文件管理等等,那么在這樣一個百花齊放的容器時代涌現(xiàn)出了很多解決方案,比如Swarm,Mesos,Kubernetes等等,其中谷歌開源的Kubernetes是作為老大哥的存在,從本節(jié)開始將介紹如何打造自己的Kubernetes,并且了解它各個組件的用途
Kubernetes官方文檔:https://kubernetes.io/docs/reference/
Kubernetes官方Git地址:https://github.com/kubernetes/kubernetes
1. 為什么選擇kubernetes容器管理
Docker宣布在下一個企業(yè)版本開始支持Kubernetes。然而在Dockercon Europe 2017之前勘畔,Kuberenetes是人們避而不談的大象黍檩。
三個主要云提供商都加入了由Kubernetes主持的開源基金會交惯,即云原生基金會(CNCF),這讓其勢不可擋痴突。
Docker讓容器變成了主流用爪。自從項目發(fā)布以來,Docker著重于提升開發(fā)者的體驗哈恰。基本理念是可以在整個行業(yè)中华望,
在一個標準的框架上蕊蝗,構建仅乓、交付并且運行應用赖舟。通常來講,我們部署項目會構建出一個持續(xù)集成和持續(xù)開發(fā)的流程夸楣,然后將其應用到生產(chǎn)環(huán)境宾抓。
作為編排工具,從社區(qū)的年齡來講豫喧,Kubernetes不占優(yōu)勢石洗。畢竟Kubernetes才兩歲而已(從作為開源項目算起),而Apache的Mesos已經(jīng)推出7年之久紧显。Docker Swarm雖然是比Kubernetes更年輕的項目讲衫,但是它的背后是來自于Docker官方容器中心的全方位支持。
然由于Kubernetes社區(qū)在基礎云平臺的管理下正在不斷變得豐富多彩孵班。
Kubernetes是活躍在Github中前幾名的項目之一:占有在所有項目中排名0.01%的star涉兽,而且在所有團隊項目活躍度排名第一。
雖然Kubernetes的文檔欠佳篙程,但是Kubernetes有自己的Slack和Stack Overflow社區(qū)作為補充枷畏,幫助解決問題優(yōu)于其競爭對手。
在LinkedIn上有更專業(yè)的Kubernetes專家虱饿,相比其他工具拥诡,Kubernetes通過LinkedIn為使用者提供了更廣闊的解決問題空間触趴。
通過OpenHub的數(shù)據(jù)卻顯示了Apache Mesos正在走向衰落,Docker Swarm增長也開始放緩渴肉。從原始社區(qū)的貢獻來講冗懦,Kubernetes正在迅速增長,從1000+貢獻者34000+的提交貢獻仇祭,遠遠超過了其他像Mesos競爭對手的四倍之多批狐。
這樣的原因肯定是因為谷歌,或者是說谷歌的選擇開源前塔。雖然其他的每一個編排項目背后都有一個供應商公司在影響著嚣艇,但是Kubernetes受益于谷歌的不干涉開發(fā),以及比較優(yōu)秀的原始引擎华弓。
與此同時食零,Docker擁有實際上的容器標準,Docker也一直在努力構建與Kubernetes一樣廣泛深入的容器社區(qū)寂屏》∫ィ基于以上原因,谷歌的Kelsey Hightower指出迁霎,Docker本身在阻止競爭對手進入構建容器標準吱抚。
相對于原生容器來說,在本地跑跑環(huán)境還行但是不熟到生產(chǎn)環(huán)境可是要打一個問號,穩(wěn)定性?健壯性?可監(jiān)控?部署?這些都是需要解決問題,以下三點其實就包括了為什么需要Kubernetes容器管理:
Kubernetes是一個開源的,用于管理云平臺中多個主機上的容器化的應用考廉,Kubernetes的目標是讓部署容器化的應用簡單并且高效(powerful),Kubernetes提供了應用部署秘豹,規(guī)劃,更新昌粤,維護的一種機制既绕。
Kubernetes一個核心的特點就是能夠自主的管理容器來保證云平臺中的容器按照用戶的期望狀態(tài)運行著(比如用戶想讓apache一直運行,用戶不需要關心怎么去做涮坐,Kubernetes會自動去監(jiān)控凄贩,然后去重啟,新建袱讹,總之疲扎,讓apache一直提供服務),管理員可以加載一個微型服務捷雕,讓規(guī)劃器來找到合適的位置椒丧,同時,Kubernetes也系統(tǒng)提升工具以及人性化方面非区,讓用戶能夠方便的部署自己的應用(就像canary deployments)瓜挽。
Kubernetes是為生產(chǎn)環(huán)境而設計的容器調(diào)度管理系統(tǒng),對于負載均衡征绸、服務發(fā)現(xiàn)久橙、高可用俄占、滾動升級、自動伸縮等容器云平臺的功能要求有原生支持淆衷。
2.Kubernetes解決的核心問題
- 負載均衡 - 多個同樣的容器運行著多套,Kube-Service提供了統(tǒng)一的訪問定義,以負載均衡的方式來提供訪問
- 服務發(fā)現(xiàn) - Kube-Service和Kube-DNS結合,只需要通過固定的Kube-Service名稱就可以訪問到對應的容器,不需要獨立尋找使用服務發(fā)現(xiàn)組件
- 高可用 - Kube會檢查服務的健康狀態(tài),會不停嘗試重新啟動服務,保障正常運行
- 滾動升級 - 在升級過程中Kube會有規(guī)劃的挨個容器滾動升級,把升級帶來的影響降低到最小
- 自動伸縮 - 可以配置策略當容器資源使用較高會自動增加一個新的容器來分擔壓力,當資源使用率降低會回收容器
- 快速部署 - 使用Kube編寫好對應的編排問題,可以在及短的時間部署一套環(huán)境
- 資源限制 - 對程序限制最大資源使用量避免搶占資源遇到事故或壓力也能從容保障基礎服務不受影響
下圖是Kube內(nèi)部組件協(xié)助運行圖:
3.Kubernetes組件和核心技術概念
一個K8s集群是由分布式存儲(etcd)缸榄、服務節(jié)點(Minion,etcd現(xiàn)在稱為Node)和控制節(jié)點(Master)構成的祝拯。所有的集群狀態(tài)都保存在etcd中甚带,Master節(jié)點上則運行集群的管理控制模塊。Node節(jié)點是真正運行應用容器的主機節(jié)點佳头,在每個Minion節(jié)點上都會運行一個Kubelet代理鹰贵,控制該節(jié)點上的容器、鏡像和存儲卷等康嘉。
Kubernetes主要由以下幾個核心組件組成:
etcd保存了整個集群的狀態(tài)碉输;
apiserver提供了資源操作的唯一入口,并提供認證亭珍、授權敷钾、訪問控制、API注冊和發(fā)現(xiàn)等機制肄梨;
controller manager負責維護集群的狀態(tài)阻荒,比如故障檢測、自動擴展众羡、滾動更新等侨赡;
scheduler負責資源的調(diào)度,按照預定的調(diào)度策略將Pod調(diào)度到相應的機器上纱控;
kubelet負責維護容器的生命周期辆毡,同時也負責Volume(CVI)和網(wǎng)絡(CNI)的管理;
Container runtime負責鏡像管理以及Pod和容器的真正運行(CRI)甜害;
此外Kubernetes中使用的各個組件的主要概念:
- Cluster : 集群是指由Kubernetes使用一系列的物理機、虛擬機和其他基礎資源來運行你的應用程序球昨。
- Node : 一個node就是一個運行著Kubernetes的物理機或虛擬機尔店,并且pod可以在其上面被調(diào)度.
- Pod : 一個pod對應一個由相關容器和卷組成的容器組.
- Label : 一個label是一個被附加到資源上的鍵/值對,譬如附加到一個Pod上主慰,為它傳遞一個用戶自定的并且可識別的屬性.Label還可以被應用來組織和選擇子網(wǎng)中的資源.
- selector是一個通過匹配labels來定義資源之間關系得表達式嚣州,例如為一個負載均衡的service指定所目標Pod.
- Replication Controller : replication controller 是為了保證一定數(shù)量被指定的Pod的復制品在任何時間都能正常工作.它不僅允許復制的系統(tǒng)易于擴展,還會處理當pod在機器在重啟或發(fā)生故障的時候再次創(chuàng)建一個.
- Service : 一個service定義了訪問pod的方式共螺,就像單個固定的IP地址和與其相對應的DNS名之間的關系该肴。
- Volume: 一個volume是一個目錄,可能會被容器作為未見系統(tǒng)的一部分來訪問藐不。Kubernetes volume 構建在Docker Volumes之上,并且支持添加和配置volume目錄或者其他存儲設備.
- Secret : Secret 存儲了敏感數(shù)據(jù)匀哄,例如能允許容器接收請求的權限令牌秦效。
- Name : 用戶為Kubernetes中資源定義的名字.
- Namespace : Namespace 好比一個資源名字的前綴。它幫助不同的項目涎嚼、團隊或是客戶可以共享cluster,例如防止相互獨立的團隊間出現(xiàn)命名沖突.
- Annotation : 相對于label來說可以容納更大的鍵值對阱州,它對我們來說可能是不可讀的數(shù)據(jù),只是為了存儲不可識別的輔助數(shù)據(jù)法梯,尤其是一些被工具或系統(tǒng)擴展用來操作的數(shù)據(jù).
Kubernetes設計理念和功能其實就是一個類似Linux的分層架構:
核心層:Kubernetes最核心的功能苔货,對外提供API構建高層的應用,對內(nèi)提供插件式應用執(zhí)行環(huán)境
應用層:部署(無狀態(tài)應用立哑、有狀態(tài)應用夜惭、批處理任務、集群應用等)和路由(服務發(fā)現(xiàn)铛绰、DNS解析等)
管理層:系統(tǒng)度量(如基礎設施滥嘴、容器和網(wǎng)絡的度量),自動化(如自動擴展至耻、動態(tài)Provision等)以及策略管理(RBAC若皱、Quota、PSP尘颓、NetworkPolicy等)
接口層:kubectl命令行工具走触、客戶端SDK以及集群聯(lián)邦
-
生態(tài)系統(tǒng):在接口層之上的龐大容器集群管理調(diào)度的生態(tài)系統(tǒng),可以劃分為兩個范疇
- Kubernetes外部:日志疤苹、監(jiān)控互广、配置管理、CI卧土、CD惫皱、Workflow、FaaS尤莺、OTS應用旅敷、ChatOps等
- Kubernetes內(nèi)部:CRI、CNI颤霎、CVI媳谁、鏡像倉庫、Cloud Provider友酱、集群自身的配置和管理等