Kubernete導(dǎo)圖
Kubernete簡介
建于 Docker 之上的 Kubernetes 可以構(gòu)建一個容器的調(diào)度服務(wù)柬泽,其目的是讓用戶透過Kubernetes集群來進行云端容器集群的管理会烙,而無需用戶進行復(fù)雜的設(shè)置工作。系統(tǒng)會自動選取合適的工作節(jié)點來執(zhí)行具體的容器集群調(diào)度處理工作眉厨。
Kubernetes架構(gòu)
etcd
Kubernetes默認使用etcd作為集群整體存儲。etcd是一個簡單的、分布式的熟嫩、一致的key-value存儲宅此,主要被用來共享配置和服務(wù)發(fā)現(xiàn)机错。etcd提供了一個CRUD操作的REST API,以及提供了作為注冊的接口父腕,以監(jiān)控指定的Node弱匪。集群的所有狀態(tài)都存儲在etcd實例中,并具有監(jiān)控的能力璧亮,因此當etcd中的信息發(fā)生變化時萧诫,就能夠快速的通知集群中相關(guān)的組件。
Master Node
API Server (資源操作入口)
提供了資源對象的唯一操作入口枝嘶,其它所有組件都必須通過它提供的 API 來操作資源數(shù)據(jù)帘饶。只有 API Server 會與存儲通信,其它模塊都必須通過 API Server 訪問集群狀態(tài)群扶。 API Server 作為 Kubernetes 系統(tǒng)的入口及刻,封裝了核心對象的增刪改查操作镀裤。API Server 以 RESTFul 接口方式提供給外部客戶和內(nèi)部組件調(diào)用,API Server 再對相關(guān)的資源數(shù)據(jù)(全量查詢 + 變化監(jiān)聽)進行操作缴饭,以達到實時完成相關(guān)的業(yè)務(wù)功能暑劝。
Controller Manager (內(nèi)部管理控制中心)
Controller Manager 用于實現(xiàn) Kubernetes 集群故障檢測和恢復(fù)的自動化工作。Controller Manager 主要負責執(zhí)行以下各種控制器:
Scheduler (集群分發(fā)調(diào)度器)
scheduler組件為容器自動選擇運行的主機茴扁。依據(jù)請求資源的可用性铃岔,服務(wù)請求的質(zhì)量等約束條件,scheduler監(jiān)控未綁定的pod峭火,并將其綁定至特定的node節(jié)點毁习。Kubernetes也支持用戶自己提供的調(diào)度器,Scheduler負責根據(jù)調(diào)度策略自動將Pod部署到合適Node中卖丸,調(diào)度策略分為預(yù)選策略和優(yōu)選策略纺且,Pod的整個調(diào)度過程分為兩步:
預(yù)選Node:遍歷集群中所有的Node,按照具體的預(yù)選策略篩選出符合要求的Node列表稍浆。如沒有Node符合預(yù)選策略規(guī)則载碌,該Pod就會被掛起,直到集群中出現(xiàn)符合要求的Node衅枫。
優(yōu)選Node:預(yù)選Node列表的基礎(chǔ)上嫁艇,按照優(yōu)選策略為待選的Node進行打分和排序,從中獲取最優(yōu)Node弦撩。
Worker node
Kubelet
Kubelet是Kubernetes中最主要的控制器步咪,它是Pod和Node API的主要實現(xiàn)者,Kubelet負責驅(qū)動容器執(zhí)行層益楼。在Kubernetes中猾漫,應(yīng)用容器彼此是隔離的,并且與運行其的主機也是隔離的感凤,這是對應(yīng)用進行獨立解耦管理的關(guān)鍵點悯周。
Kubelet 在 Node 上做的主要工作具體如下:
- 設(shè)置容器的環(huán)境變量、給容器綁定 Volume陪竿、給容器綁定 Port禽翼、根據(jù)指定的 Pod 運行一個單一容器、給指定的 Pod 創(chuàng)建 Network 容器族跛。
- 同步 Pod 的狀態(tài)捐康,從 cAdvisor 獲取 Container Info、 Pod Info庸蔼、 Root Info解总、 Machine info。
- 在容器中運行命令姐仅、殺死容器花枫、刪除 Pod 的所有容器刻盐。
kube proxy
基于一種公共訪問策略(例如:負載均衡),服務(wù)提供了一種訪問一群pod(集群中容器提供的應(yīng)用服務(wù))的途徑劳翰。此方式通過創(chuàng)建一個虛擬的IP來實現(xiàn)敦锌,客戶端能夠訪問此IP,并能夠?qū)⒎?wù)透明的代理至Pod佳簸。每一個Node都會運行一個kube-proxy乙墙,kube proxy通過iptables規(guī)則引導(dǎo)訪問至服務(wù)IP,并將重定向至正確的后端應(yīng)用生均,通過這種方式kube-proxy提供了一個高可用的負載均衡解決方案听想。
核心概念
Namespace&ResourceQuota
Namespace物理集群上的虛擬集群,用戶級別的資源限制
Namespace是對一組資源和對象的抽象集合,比如可以用來將系統(tǒng)內(nèi)部的對象劃分為不同的項目組或用戶組马胧。常見的pods, services, replication controllers和deployments等都是屬于某一個namespace的汉买,而node, persistentVolumes等則不屬于任何namespace。
資源配額(Resource Quotas)是用來限制用戶資源用量的一種機制佩脊。資源配額應(yīng)用在Namespace上蛙粘,并且每個Namespace最多只能有一個ResourceQuota對象,開啟計算資源配額后,創(chuàng)建容器時必須配置計算資源請求或限制威彰。并且用戶超額后禁止創(chuàng)建新的資源出牧。
資源配額的類型包括:計算資源(cpu和memory),存儲資源(存儲資源的總量以及指定storage class的總量)歇盼,對象數(shù)(可創(chuàng)建的對象的個數(shù))舔痕。
Lable& Selector
Label以key/value鍵值對的形式附加到任何對象上,如Pod旺遮,Service,Node盈咳,RC(ReplicationController)/RS(ReplicaSet)等耿眉。Label可以在創(chuàng)建對象時就附加到對象上,也可以在對象創(chuàng)建后通過API進行額外添加或修改鱼响。
我們通常使用metadata.labels字段鸣剪,來為對象添加Label。Label可以為多個丈积。一般來說筐骇,我們會給一個Pod(或其他對象)定義多個Label,以便于配置江滨,部署等管理工作铛纬。
帶有Label的對象創(chuàng)建好之后,我們就可以通過Label Selector來引用這些對象唬滑。
Kubernetes目前支持兩種類型的Label Selector:
基于等式的Selector(Equality-based)
基于集合的Selector(Set-based)[RC不支持]
Pod
一個pod相當于一個共享context的配置組告唆,在同一個context下棺弊,應(yīng)用可能還會有獨立的cgroup隔離機制,一個Pod是一個容器環(huán)境下的“邏輯主機”擒悬,它可能包含一個或者多個緊密相連的應(yīng)用模她,這些應(yīng)用可能是在同一個物理主機或虛擬機上。同一個Pod中的應(yīng)用可以共享磁盤懂牧,磁盤是Pod級的侈净。
Pod 的context可以理解成多個linux命名空間的聯(lián)合
PID 命名空間(同一個Pod中應(yīng)用可以看到其它進程)
網(wǎng)絡(luò) 命名空間(同一個Pod的中的應(yīng)用對相同的IP地址和端口有權(quán)限)
IPC 命名空間(同一個Pod中的應(yīng)用可以通過VPC或者POSIX進行通信)
UTS 命名空間(同一個Pod中的應(yīng)用共享一個主機名稱)
和相互獨立的容器一樣,Pod是一種相對短暫的存在僧凤,而不是持久存在的畜侦,正如我們在Pod的生命周期中提到的,Pod被安排到結(jié)點上拼弃,并且保持在這個節(jié)點上直到被終止(根據(jù)重啟的設(shè)定)或者被刪除夏伊,當一個節(jié)點死掉之后,上面的所有Pod均會被刪除吻氧。
資源限制
Kubernetes通過cgroups限制容器的CPU和內(nèi)存等計算資源溺忧,包括requests(請求,調(diào)度器保證調(diào)度到資源充足的Node上)和limits(上限)
環(huán)境變量
環(huán)境變量為容器提供了一些重要的資源盯孙,包括容器和Pod的基本信息以及集群中服務(wù)的信息等鲁森。如hostName,Pod的名字振惰、命名空間歌溉、IP以及容器的計算資源限制等可以以Downward API的方式獲取并存儲到環(huán)境變量中。
Docker中程序的配置文件可以通過配置環(huán)境變量或者將配置文件掛載到宿主機上實現(xiàn)一個容器在不同的場景下使用不同的配置文件骑晶。Kubernetes中也已通過配置環(huán)境變量為Pod中容器傳遞參數(shù)痛垛。
Volume
為容器提供持久化存儲
健康檢查
為了確保容器在部署后確實處在正常運行狀態(tài),Kubernetes提供了兩種探針(Probe桶蛔,支持exec匙头、tcp和httpGet方式)來探測容器的狀態(tài):
LivenessProbe:探測應(yīng)用是否處于健康狀態(tài),如果不健康則刪除重建改容器
ReadinessProbe:探測應(yīng)用是否啟動完成并且處于正常服務(wù)狀態(tài)仔雷,如果不正常則更新容器的狀態(tài)
ImagePullPolicy
Always:不管鏡像是否存在都會進行一次拉取蹂析。
Never:不管鏡像是否存在都不會進行拉取
IfNotPresent:只有鏡像不存在時,才會進行鏡像拉取碟婆。
Capabilities
默認情況下电抚,容器都是以非特權(quán)容器的方式運行。比如竖共,不能在容器中創(chuàng)建虛擬網(wǎng)卡蝙叛、配置虛擬網(wǎng)絡(luò)。Kubernetes提供了修改Capabilities的機制公给。
Node
Node是Pod真正運行的主機甥温,可以物理機锻煌,也可以是虛擬機。為了管理Pod姻蚓,每個Node節(jié)點上至少要運行container runtime(比如docker或者rkt)宋梧、kubelet和kube-proxy服務(wù)。
Service
k8s的Service定義了一個服務(wù)的訪問入口地址(k8s分配給Service一個固定IP狰挡,這是一個虛擬IP)捂龄,前端的應(yīng)用通過這個入口地址訪問其背后的一組由Pod副本組成的集群實例,來自外部的訪問請求被負載均衡到后端的各個容器應(yīng)用上加叁。Service與其后端Pod副本集群之間則是通過Label Selector來實現(xiàn)對接的倦沧。而RC的作用相當于是保證Service的服務(wù)能力和服務(wù)質(zhì)量始終處于預(yù)期的標準。Service 定義可以基于 POST 方式它匕,請求 apiserver 創(chuàng)建新的實例展融。一個 Service 在 Kubernetes 中是一個 REST 對象。
Replication Controller
Replication Controller 保證了在所有時間內(nèi)豫柬,都有特定數(shù)量的Pod副本正在運行告希。一個RC通過模版來創(chuàng)建pod,這個是RC對象內(nèi)置的功能,RC 創(chuàng)建的的Pod 是可以相互替代和語義上相同的烧给。
ReplicaSet
ReplicaSet是下一代復(fù)本控制器燕偶。ReplicaSet和 Replication Controller之間的唯一區(qū)別是現(xiàn)在的選擇器支持。Replication Controller只支持基于等式的selector(env=dev或environment!=qa)础嫡,但ReplicaSet還支持新的指么,基于集合的selector(version in (v1.0, v2.0)或env notin (dev, qa))。
Deployment
Deployment為Pod和Replica Set(下一代Replication Controller)提供聲明式更新榴鼎。你只需要在Deployment中描述你想要的目標狀態(tài)是什么伯诬,Deployment controller就會幫你將Pod和Replica Set的實際狀態(tài)改變到你的目標狀態(tài)。你可以定義一個全新的Deployment巫财,也可以創(chuàng)建一個新的替換舊的Deployment盗似。
一個典型的用例如下:
使用Deployment來創(chuàng)建ReplicaSet。ReplicaSet在后臺創(chuàng)建pod翁涤。檢查啟動狀態(tài)桥言,看它是成功還是失敗萌踱。
然后葵礼,通過更新Deployment的PodTemplateSpec字段來聲明Pod的新狀態(tài)。這會創(chuàng)建一個新的ReplicaSet并鸵,Deployment會按照控制的速率將pod從舊的ReplicaSet移動到新的ReplicaSet中鸳粉。
如果當前狀態(tài)不穩(wěn)定,回滾到之前的Deployment revision园担。每次回滾都會更新Deployment的revision届谈。
擴容Deployment以滿足更高的負載枯夜。
暫停Deployment來應(yīng)用PodTemplateSpec的多個修復(fù),然后恢復(fù)上線艰山。
根據(jù)Deployment 的狀態(tài)判斷上線是否hang住了湖雹。
清除舊的不必要的ReplicaSet。
Volumes
Volumes:在Kubernetes中曙搬,當Pod重建的時候摔吏,數(shù)據(jù)是會丟失的,Kubernetes也是通過數(shù)據(jù)卷掛載來提供Pod數(shù)據(jù)的持久化的纵装。Kubernetes數(shù)據(jù)卷是對Docker數(shù)據(jù)卷的擴展征讲,是Pod級別的,可以用來實現(xiàn)Pod中容器的文件共享橡娄。
Kubernete 支持的volume類型:
本地數(shù)據(jù)卷: emptyDir诗箍, hostPath
網(wǎng)絡(luò)數(shù)據(jù)卷: NFS、iSCISI挽唉、GlusterFS滤祖、RBD(Ceph Block Device)、Flocker橱夭、AWS Elastic Block Store氨距、GCE Persistent Disk
Persistent Volume和Persistent Volume Claim**
信息數(shù)據(jù)卷: Secret, Downward API棘劣, Git Repo
StatefulSet
RC俏让、Deployment、DaemonSet都是面向無狀態(tài)的服務(wù)茬暇,它們所管理的Pod的IP首昔、名字,啟停順序等都是隨機的糙俗,而StatefulSet是什么勒奇?顧名思義,有狀態(tài)的集合巧骚,管理所有有狀態(tài)的服務(wù)赊颠,比如MySQL、MongoDB集群等劈彪。 StatefulSet本質(zhì)上是Deployment的一種變體竣蹦,在v1.9版本中已成為GA版本,它為了解決有狀態(tài)服務(wù)的問題沧奴,它所管理的Pod擁有固定的Pod名稱痘括,啟停順序,在StatefulSet中,Pod名字稱為網(wǎng)絡(luò)標識(hostname)纲菌,還必須要用到共享存儲挠日。 在Deployment中,與之對應(yīng)的服務(wù)是service翰舌,而在StatefulSet中與之對應(yīng)的headless service嚣潜,headless service,即無頭服務(wù)椅贱,與service的區(qū)別就是它沒有Cluster IP郑原,解析它的名稱時將返回該Headless Service對應(yīng)的全部Pod的Endpoint列表。 ? 除此之外夜涕,StatefulSet在Headless Service的基礎(chǔ)上又為StatefulSet控制的每個Pod副本創(chuàng)建了一個DNS域名犯犁,這個域名的格式為:
$(podname).(headless server name)
FQDN: $(podname).(headless server name).namespace.svc.cluster.loca