什么是kubernetes?
Kubernetes是一個全新的基于容器技術(shù)的分布式架構(gòu)領(lǐng)先方案。是Google內(nèi)部集群管理系統(tǒng)Borg的一個開源版本。直到2015年4月,隨著論文發(fā)布,才被眾人熟知。Kubernetes是一個開放的開發(fā)平臺。不局限于任何一種語言,沒有限定任何編程接口。是一個完備的分布式系統(tǒng)支撐平臺。它構(gòu)建在docker之上,提供應(yīng)用部署、維護(hù)、擴(kuò)展機(jī)制等功能,利用Kubernetes能方便地管理跨機(jī)器運行容器化的應(yīng)用。Kubernetes在大概兩三周前,正式發(fā)布1.5版本。
主要功能體現(xiàn)在如下:
–使用Docker對應(yīng)用程序包裝、實例化
–以集群的方式運行、管理跨機(jī)器的容器
–解決Docker跨機(jī)器容器之間的通訊問題
–Kubernetes的自我修復(fù)機(jī)制使得容器集群總是運行在用戶期望的狀態(tài)
基本概念:
Kubernetes中的大部分概念Node、Pod、Replication Controller、Service等都可以看作一種“資源對象”,幾乎所有的資源對象都可以通過kubectl工具(API調(diào)用)執(zhí)行增、刪、改、查等操作并將其保存在etcd中持久化存儲。從這個角度來看,kubernetes其實是一個高度自動化的資源控制系統(tǒng),通過跟蹤對比etcd庫里保存的“資源期望狀態(tài)”與當(dāng)前環(huán)境中的“實際資源狀態(tài)”的差異來實現(xiàn)自動控制和自動糾錯的高級功能。
Master:集群控制管理節(jié)點,所有的命令都經(jīng)由master處理。
Node:是kubernetes集群的工作負(fù)載節(jié)點。Master為其分配工作,當(dāng)某個Node宕機(jī)時,Master會將其工作負(fù)載自動轉(zhuǎn)移到其他節(jié)點。
Node節(jié)點可動態(tài)增加到kubernetes集群中,前提是這個節(jié)點已經(jīng)正確安裝、配置和啟動了上述的關(guān)鍵進(jìn)程,默認(rèn)情況下,kubelet會向Master注冊自己,這也kubernetes推薦的Node管理方式。一旦Node被納入集群管理范圍,kubelet會定時向Master匯報自身的情況,以及之前有哪些Pod在運行等,這樣Master可以獲知每個Node的資源使用情況,并實現(xiàn)高效均衡的資源調(diào)度策略。如果Node沒有按時上報信息,則會被Master判斷為失聯(lián),Node狀態(tài)會被標(biāo)記為Not
Ready,隨后Master會觸發(fā)工作負(fù)載轉(zhuǎn)移流程。
Pod:是kubernetes最重要也是最基本的概念。每個Pod都會包含一個 “根容器”,還會包含一個或者多個緊密相連的業(yè)務(wù)容器。
Kubernetes為每個Pod都分配了唯一的IP地址,稱之為PodIP,一個Pod里的多個容器共享PodIP地址。要求底層網(wǎng)絡(luò)支持集群內(nèi)任意兩個Pod之間的直接通信,通常采用虛擬二層網(wǎng)絡(luò)技術(shù)來實現(xiàn)(Flannel)。
Label:是一個key=value的鍵值對,其中key與value由用戶自己指定??梢愿郊拥礁鞣N資源對象上,一個資源對象可以定義任意數(shù)量的Label??梢酝ㄟ^LabelSelector(標(biāo)簽選擇器)查詢和篩選資源對象。
RC:Replication Controller聲明某個Pod的副本數(shù)在任意時刻都符合某個預(yù)期值。定義包含如下:
(1)Pod期待的副本數(shù)(replicas)
(2)用于篩選目標(biāo)Pod的Label Selector
(3)當(dāng)Pod副本數(shù)小于期望時,用于新的創(chuàng)建Pod的模板template
(4)通過改變RC里的Pod副本數(shù)量,可以實現(xiàn)Pod的擴(kuò)容或縮容功能
(5)通過改變RC里Pod模板中的鏡像版本,可以實現(xiàn)Pod的滾動升級功能
思考:如果Node2上的pod死掉怎么辦?
Service:“微服務(wù)”,kubernetes中的核心。通過分析、識別并建模系統(tǒng)中的所有服務(wù)為微服務(wù),最終系統(tǒng)有多個提供不同業(yè)務(wù)能力而又彼此獨立的微服務(wù)單元所組成,服務(wù)之間通過TCP/IP進(jìn)行通信。每個Pod都會被分配一個單獨的IP地址,而且每個Pod都提供了一個獨立的Endpoint以被客戶端訪問。
思考:客戶端如何訪問?
部署負(fù)載均衡器,為Pod開啟對外服務(wù)端口,將Pod的Endpoint列表加入轉(zhuǎn)發(fā)列表中,客戶端通過負(fù)載均衡器的對外IP+Port來訪問此服務(wù)。每個Service都有一個全局唯一的虛擬ClusterIP,這樣每個服務(wù)就變成了具備唯一IP地址的“通信節(jié)點”,服務(wù)調(diào)用就變成了最基礎(chǔ)的TCP網(wǎng)絡(luò)通信問題。
Volume:是Pod中能夠被多個容器訪問的共享目錄。定義在Pod之上,被一個Pod里的多個容器掛載到具體的文件目錄之下;與Pod生命周期相同。
可以讓一個Pod里的多個容器共享文件、讓容器的數(shù)據(jù)寫到宿主機(jī)的磁盤上或者寫文件到 網(wǎng)絡(luò)存儲中,具體如下圖所示:
在kubernetes1.2的時候,RC就由Replication Controller升級成Replica Set,“下一代RC”。命令兼容適用,Replica Set主要被Deployment這個更高層的資源對象所使用,從而形成一套Pod創(chuàng)建、刪除、更新的編排機(jī)制。當(dāng)我們使用Deployment時,無需關(guān)心它是如何創(chuàng)建和維護(hù)ReplicaSet的,這一切是自動發(fā)生的。
docker
既然k8s是基于容器的,那么就不得不提到docker。2013年初,docker橫空出世,孕育著新思想的“容器”,Docker選擇容器作為核心和基礎(chǔ),以容器為資源分割和調(diào)度的基本單位,封裝整個軟件運行時環(huán)境,為開發(fā)者和系統(tǒng)管理員設(shè)計,用于構(gòu)建、發(fā)布和運行分布式應(yīng)用的平臺。是一個跨平臺、可移植并且簡單易用的容器解決方案。通過操作系統(tǒng)內(nèi)核技術(shù)(namespaces、cgroups等)為容器提供資源隔離與安全保障。
上圖是一個image的簡單使用。我們可以通過一個dockerfile來build自己的image??梢园裪mage上傳(push)到自己的私有鏡像倉庫,也可以從私有倉庫pull到本地進(jìn)行使用。可以單獨使用命令行,直接run container,可以對container進(jìn)行stop、start、restart操作。也可以對image進(jìn)行save保存操作以及加載load操作,大家具體可以根據(jù)自己的使用,選擇不同的操作即可。
docker資源隔離技術(shù)
2013年初,docker橫空出世,孕育著新思想的“容器”,Docker選擇容器作為核心和基礎(chǔ),以容器為資源分割和調(diào)度的基本單位,封裝整個軟件運行時環(huán)境,為開發(fā)者和系統(tǒng)管理員設(shè)計,用于構(gòu)建、發(fā)布和運行分布式應(yīng)用的平臺。是一個跨平臺、可移植并且簡單易用的容器解決方案。通過操作系統(tǒng)內(nèi)核技術(shù)(namespaces、cgroups等)為容器提供資源隔離與安全保障。(關(guān)于這兩種資源隔離技術(shù),本人只能從功能上說明兩者相當(dāng)于就是分組,隔離,但是具體的內(nèi)部原理還不甚了解,所以此處只提下概念,如皋想要深入了解,可搜集其他資料)
docker監(jiān)控
cAdvisor(Container Advisor)是Google開發(fā)的用于分析運行中容器的資源占用和性能指標(biāo)的開源工具。cAdvisor是一個運行時的守護(hù)進(jìn)程,負(fù)責(zé)收集、聚合、處理和輸出運行中容器的信息。對于每個容器,cAdvisor都有資源隔離參數(shù)、資源使用歷史情況以及完整的歷史資源使用和網(wǎng)絡(luò)統(tǒng)計信息的柱狀圖。
cAdvisor不但可以為用戶提供監(jiān)控服務(wù),還可以結(jié)合其他應(yīng)用為用戶提供良好的服務(wù)移植和定制。包括結(jié)合InfluxDB對數(shù)據(jù)進(jìn)行存儲,以及結(jié)合Grafana提供web控制臺,自定義查詢指標(biāo),并進(jìn)行展示。
etcd
etcd是一個鍵值存儲倉庫,用于配置共享和服務(wù)發(fā)現(xiàn)。etcd受Zookeeper與doozer啟發(fā)而催生的項目。
etcd架構(gòu)
etcd存儲
etcd的存儲分為內(nèi)部存儲和持久化(硬盤)存儲兩部分。內(nèi)存中的存儲除了順序化地記錄所有用戶對節(jié)點數(shù)據(jù)變更的記錄外,還會對用戶數(shù)據(jù)進(jìn)行索引、建堆等方便查詢的操作。而持久化則使用WAL進(jìn)行記錄存儲。在k8s中,所有數(shù)據(jù)的存儲以及操作記錄都在etcd中進(jìn)行存儲,所以對于k8s集群來說,etcd是相當(dāng)重要的,一旦故障,可能導(dǎo)致整個集群的癱瘓或者數(shù)據(jù)丟失。
在WAL體系中,所有的數(shù)據(jù)在提交之前都會進(jìn)行日志記錄。持久化存儲的目錄分為兩個:snap和wal。snapshot相當(dāng)于數(shù)據(jù)壓縮,默認(rèn)會將10000條wal操作記錄merge成snapshot,節(jié)省存儲,又保證數(shù)據(jù)不會丟失。
WAL:存儲所有事務(wù)的變化記錄
Snapshot:用于存放某一時刻etcd所有目錄的數(shù)據(jù)
思考:數(shù)據(jù)損壞或者機(jī)器故障怎么辦???
etcd核心算法
etcd的核心算法是raft算法,強(qiáng)一致性算法。具體如下圖所示
注意:由于etcd是負(fù)責(zé)存儲,所以不建議搭建單點集群,如zookeeper一樣,由于存在選舉策略,所以一般推薦奇數(shù)個集群,如3,5,7。只要集群半數(shù)以上的結(jié)點存活,那么集群就可以正常運行,否則集群可能無法正常使用。
k8s集群部署方案
如下是我的集群部署策略,1個master + 2個node(minion1.2之前的叫法)。我的存儲集群etcd是單點集群,不推薦此做法,你懂得,哈哈。網(wǎng)絡(luò)使用的是flannel虛擬二次網(wǎng)絡(luò)。
如何驗證?
搭建完成之后,命令行執(zhí)行:kubectl get no 查看節(jié)點狀態(tài)是否ready。
其他的大家可以通過代碼來進(jìn)行驗證,看是否可以成功訪問各個服務(wù)以及成功運行。
ok,以上是我的初步總結(jié),歡迎留言指導(dǎo)。順便吐槽下,個人覺得csdn真的太難用了,么有預(yù)覽,還有格式排版好難用,看看我的上一篇格式都成啥了,唉,吐槽?。?!
|