學習kubernetes有一段時間了,好記性不如爛筆頭,如果不把學習到的這些知識系統(tǒng)總結歸納,最后隨著時間推移,又忘得干干凈凈。于是,2018年給自己定個小目標就是,每學習一門新技術就記錄下來,給自己做個筆記,也可以分享給其他有共同愛好的人。
一、什么是kubernetes
網(wǎng)上介紹架構的文章很多,大多數(shù)也是從官網(wǎng)翻譯過來。這里我把一些基礎概念和架構列在這里,一看到就知道怎么回事了,不用再去一遍一遍的google。
Kubernetes是Google開源的容器集群管理系統(tǒng),在此由衷的感謝我心目中最崇拜的公司Google。為啥叫k8s,因為kubernetes的k和最后一個s之間有8個字母,所以簡寫k8s。
k8s是一種容器編排技術。一般大家接觸的k8s基于docker容器,其實Kubernetes不僅僅支持Docker,還支持Rocket,這是另一種容器技術。
使用Kubernetes的好處是什么呢?
--自動化容器的部署和復制
--隨時擴展或收縮容器規(guī)模
--將容器組織成組,并且提供容器間的負載均衡
--很容易地升級應用程序容器的新版本
--提供容器彈性,如果容器失效就替換它,等等.
二、k8s架構原理
Kubernetes中的大部分概念Node、Pod、Replication Controller、Service等都可以看作一種“資源對象”,幾乎所有的資源對象都可以通過kubectl工具(API調用)執(zhí)行增、刪、改、查等操作并將其保存在etcd中持久化存儲。從這個角度來看,kubernetes其實是一個高度自動化的資源控制系統(tǒng),通過跟蹤對比etcd庫里保存的“資源期望狀態(tài)”與當前環(huán)境中的“實際資源狀態(tài)”的差異來實現(xiàn)自動控制和自動糾錯的高級功能。

Pod
Pod是在K8s集群中運行部署應用或服務的最小單元,它是可以支持多容器的。Pod的設計理念是支持多個容器在一個Pod中共享網(wǎng)絡地址和文件系統(tǒng),可以通過進程間通信和文件共享這種簡單高效的方式組合完成服務。
Pod是K8s集群中所有業(yè)務類型的基礎,可以看作運行在K8s集群中的小機器人,不同類型的業(yè)務就需要不同類型的小機器人去執(zhí)行。
復制控制器(Replication Controller,RC)
RC是K8s集群中最早的保證Pod高可用的API對象。通過監(jiān)控運行中的Pod來保證集群中運行指定數(shù)目的Pod副本。指定的數(shù)目可以是多個也可以是1個;少于指定數(shù)目,RC就會啟動運行新的Pod副本;多于指定數(shù)目,RC就會殺死多余的Pod副本。即使在指定數(shù)目為1的情況下,通過RC運行Pod也比直接運行Pod更明智,因為RC也可以發(fā)揮它高可用的能力,保證永遠有1個Pod在運行。RC是K8s較早期的技術概念,只適用于長期伺服型的業(yè)務類型,比如控制小機器人提供高可用的Web服務。
副本集(Replica Set,RS)
RS是新一代RC,提供同樣的高可用能力,區(qū)別主要在于RS后來居上,能支持更多種類的匹配模式。副本集對象一般不單獨使用,而是作為Deployment的理想狀態(tài)參數(shù)使用。
部署(Deployment)
部署表示用戶對K8s集群的一次更新操作。部署是一個比RS應用模式更廣的API對象,可以是創(chuàng)建一個新的服務,更新一個新的服務,也可以是滾動升級一個服務。滾動升級一個服務,實際是創(chuàng)建一個新的RS,然后逐漸將新RS中副本數(shù)增加到理想狀態(tài),將舊RS中的副本數(shù)減小到0的復合操作;這樣一個復合操作用一個RS是不太好描述的,所以用一個更通用的Deployment來描述。以K8s的發(fā)展方向,未來對所有長期伺服型的的業(yè)務的管理,都會通過Deployment來管理。
服務(Service)
RC、RS和Deployment只是保證了支撐服務的微服務Pod的數(shù)量,但是沒有解決如何訪問這些服務的問題。一個Pod只是一個運行服務的實例,隨時可能在一個節(jié)點上停止,在另一個節(jié)點以一個新的IP啟動一個新的Pod,因此不能以確定的IP和端口號提供服務。要穩(wěn)定地提供服務需要服務發(fā)現(xiàn)和負載均衡能力。服務發(fā)現(xiàn)完成的工作,是針對客戶端訪問的服務,找到對應的的后端服務實例。在K8s集群中,客戶端需要訪問的服務就是Service對象。每個Service會對應一個集群內部有效的虛擬IP,集群內部通過虛擬IP訪問一個服務。在K8s集群中微服務的負載均衡是由Kube-proxy實現(xiàn)的。Kube-proxy是K8s集群內部的負載均衡器。它是一個分布式代理服務器,在K8s的每個節(jié)點上都有一個;這一設計體現(xiàn)了它的伸縮性優(yōu)勢,需要訪問服務的節(jié)點越多,提供負載均衡能力的Kube-proxy就越多,高可用節(jié)點也隨之增多。
存儲卷(Volume)
K8s集群中的存儲卷跟Docker的存儲卷有些類似,只不過Docker的存儲卷作用范圍為一個容器,而K8s的存儲卷的生命周期和作用范圍是一個Pod。每個Pod中聲明的存儲卷由Pod中的所有容器共享。K8s支持非常多的存儲卷類型,特別的,支持多種公有云平臺的存儲,包括AWS,Google和Azure云;支持多種分布式存儲包括GlusterFS和Ceph;也支持較容易使用的主機本地目錄hostPath和NFS。K8s還支持使用Persistent Volume Claim即PVC這種邏輯存儲,使用這種存儲,使得存儲的使用者可以忽略后臺的實際存儲技術(例如AWS,Google或GlusterFS和Ceph),而將有關存儲實際技術的配置交給存儲管理員通過Persistent Volume來配置。
上圖是架構圖,一個k8s集群中包括master和node兩個部分。
Kubernetes Master
集群擁有一個Kubernetes Master(紫色方框)。Kubernetes Master提供集群的獨特視角,并且擁有一系列組件,比如Kubernetes API Server。API Server提供可以用來和集群交互的REST端點。master節(jié)點包括用來創(chuàng)建和復制Pod的Replication Controller。
Node
節(jié)點(上圖橘色方框)是物理或者虛擬機器,作為Kubernetes worker,通常稱為Minion。每個節(jié)點都運行如下Kubernetes關鍵組件:
Kubelet:是主節(jié)點代理。
Kube-proxy:Service使用其將鏈接路由到Pod,如上文所述。
Docker或Rocket:Kubernetes使用的容器技術來創(chuàng)建容器。
kubelet

根據(jù)上圖可知Kubelet是Kubernetes集群中每個Minion和Master API Server的連接點,Kubelet運行在每個Minion上,是Master API Server和Minion之間的橋梁,接收Master API Server分配給它的commands和work,與持久性鍵值存儲etcd、file、server和http進行交互,讀取配置信息。Kubelet的主要工作是管理Pod和容器的生命周期,其包括Docker Client、Root Directory、Pod Workers、Etcd Client、Cadvisor Client以及Health Checker組件,具體工作如下:
1) 通過Worker給Pod異步運行特定的Action。
2) 設置容器的環(huán)境變量。
3) 給容器綁定Volume。
4) 給容器綁定Port。
5) 根據(jù)指定的Pod運行一個單一容器。
6) 殺死容器。
7) 給指定的Pod創(chuàng)建network 容器。
8) 刪除Pod的所有容器。
9) 同步Pod的狀態(tài)。
10) 從Cadvisor獲取container info、 pod info、root info、machine info。
11) 檢測Pod的容器健康狀態(tài)信息。
12) 在容器中運行命令。
三、k8s安裝模塊
其中master需要安裝:
- docker
- etcd
- flannel
- kube-apiserver
- kube-scheduler
- kube-controller-manager
node需要安裝:
- docker
- flannel
- kubelet
- kube-proxy
k8s安裝方式有很多種,可以在單機或虛擬機centos、ubuntu上安裝,Mac下可以單機minikube方式安裝,也可以kubeadm用docker方式安裝。
這里有個比較詳細的kubeadm安裝介紹,我就是用這個方式在我兩臺vm centos上安裝的。
總結,雖然這些概念不去運行k8s,不去啟動各種功能的容器,你還是不太理解他們。關鍵動手去做一些實例,參考一些簡單的yaml文件,用k8s創(chuàng)建啟動各類應用,才會更深刻的理解這些基本概念。
參考:
http://dockone.io/article/932
http://www.infoq.com/cn/articles/Kubernetes-system-architecture-introduction
https://feisky.gitbooks.io/kubernetes/architecture/
http://m.itdecent.cn/p/5b0cd99e0332