一. 什么是kubernetes?
kubernetes是一個可移植的,可擴展的開源平臺恨豁,是Google開源的容器集群管理系統(tǒng)(谷歌內(nèi)部:Borg)围段,用于管理容器化的工作負載和服務(wù),可促進聲明式配置和自動化。
二. 為什么使用kubernetes?
k8s在Docker技術(shù)的基礎(chǔ)上,為容器化的應(yīng)用提供部署運行谬俄、資源調(diào)度、服務(wù)發(fā)現(xiàn)和動態(tài)伸縮等一系列完整功能弃理,提高了大規(guī)模容器集群管理的便捷性溃论。同時Kubernetes是一個完備的分布式系統(tǒng)支撐平臺,具有完備的集群管理能力痘昌,多擴多層次的安全防護和準入機制蔬芥、多租戶應(yīng)用支撐能力、透明的服務(wù)注冊和發(fā)現(xiàn)機制控汉、內(nèi)建智能負載均衡器笔诵、強大的故障發(fā)現(xiàn)和自我修復能力、服務(wù)滾動升級和在線擴容能力姑子、可擴展的資源自動調(diào)度機制以及多粒度的資源配額管理能力乎婿。同時Kubernetes提供完善的管理工具,涵蓋了包括開發(fā)街佑、部署測試谢翎、運維監(jiān)控在內(nèi)的各個環(huán)節(jié)。
三. 集群架構(gòu)及組件
1. 集群架構(gòu)
Master
負責管理集群沐旨,部署集群所需組件etcd森逮,apiserver,controller manager磁携,scheduler
褒侧。master 協(xié)調(diào)集群中的所有活動,例如調(diào)度應(yīng)用程序谊迄、維護應(yīng)用程序的所需狀態(tài)闷供、擴展應(yīng)用程序和滾動更新。
Node
節(jié)點是 Kubernetes 集群中的工作節(jié)點统诺,用于托管正在運行的應(yīng)用程序歪脏,可以是物理機或虛擬機。 每個工作節(jié)點都有一個 kubelet
和kube-proxy
粮呢,它是管理節(jié)點并與 Kubernetes Master 節(jié)點進行通信的代理婿失。節(jié)點上還應(yīng)具有處理容器操作的容器運行時钞艇,例如 Docker 或 rkt。一個 Kubernetes 工作集群至少有三個節(jié)點豪硅。
2. 集群組件
- etcd: 鍵值存儲數(shù)據(jù)庫哩照,維護集群內(nèi)各個節(jié)點狀態(tài)的一致性,保存集群的狀態(tài)及配置舟误;
- apiserver:處理資源操作的請求葡秒,并提供認證姻乓、授權(quán)嵌溢、訪問控制、API 注冊和發(fā)現(xiàn)等機制蹋岩;
- controller manager: 控制器管理赖草,負責維護集群的狀態(tài),如故障檢測剪个、自動擴展秧骑、滾動更新等;
- scheduler:調(diào)度器扣囊,負責資源的調(diào)度乎折,按照預(yù)定的調(diào)度策略將 Pod 調(diào)度到相應(yīng)的節(jié)點;
- kubelet:負責維護容器的生命周期侵歇, Pod 的創(chuàng)建骂澄、啟動、監(jiān)控惕虑、重啟坟冲、銷毀等工作,處理Master節(jié)點下發(fā)到本節(jié)點的任務(wù)溃蔫;
- Container runtime: 負責鏡像管理以及 Pod 和容器的真正運行(CRI)健提;
- kube-proxy: 負責為 Service 提供 cluster 內(nèi)部的服務(wù)發(fā)現(xiàn)和負載均衡;
- Flannel/calico:網(wǎng)絡(luò)插件伟叛, 負責為整個集群提供 IP 服務(wù)私痹;
- kube-dns/coredns: 負責為整個集群提供 DNS 服務(wù);
- Ingress Controller: 為服務(wù)提供外網(wǎng)入口统刮;
四. 集群工作流程
集群各組件的通信原理侄榴,以創(chuàng)建Pod為例:
- 使用REST API 創(chuàng)建Pod,即(kubectl create pod)請求apiserver网沾。
- apiserver接收到pod創(chuàng)建請求后癞蚕,寫入到Etcd,會存在記錄但不會創(chuàng)建辉哥。
- scheduluer 檢測到有未綁定 Node 的 Pod桦山,查找集群中資源充足的Node綁定攒射,并將調(diào)度信息寫入到Etcd。
- kubelet 通過監(jiān)測etcd數(shù)據(jù)庫恒水,檢測到有綁定該節(jié)點的Pod調(diào)度過來需要創(chuàng)建会放,調(diào)用container runtime 運行該 Pod。
- kubelet 通過 container runtime 取到 Pod 狀態(tài)钉凌,并更新到 apiserver 中咧最。
五. 基本概念
Kubernetes中的絕大部分概念都會被抽象成Kubernetes管理的一種資源對象,下圖為k8s資源對象全景圖
1. 相關(guān)名詞
NameSpace
Namespace 命名空間是對一組資源和對象的抽象集合御雕, 是 Linux 內(nèi)核用來隔離內(nèi)核資源的方式矢沿。NameSpace做隔離,Cgroups 做限制酸纲,rootfs 做文件系統(tǒng)捣鲸。
Label
Label 標簽以 key/value 的方式附加到資源對象上如Pod, 其他對象可以使用 Label Selector 來選擇一組相同 label 的對象闽坡。
2.編排對象
Pod
Pod是 Kubernetes 項目中最小的 API 資源對象栽惶,Pod可以由一個或多個業(yè)務(wù)容器和一個根容器(Pause容器)組成。一個Pod表示某個應(yīng)用的一個實例疾嗅。Kubernetes 項目的調(diào)度器外厂,是統(tǒng)一按照 Pod 而非容器的資源需求進行計算的,凡是調(diào)度代承、網(wǎng)絡(luò)汁蝶、存儲,以及安全相關(guān)的屬性次泽,基本上是 Pod 級別的穿仪。
可以這樣理解,云計算系統(tǒng)的操作系統(tǒng)是 k8s 意荤,容器就相當于是其進程啊片,而 Pod 則是進程組,容器鏡像就是這個系統(tǒng)里的“.exe”安裝包玖像。Pod 里的所有容器紫谷,它們共享PID、IPC捐寥、Network和UTS namespace笤昨,可以聲明共享同一個 Volume。
ReplicaSet
ReplicaSet是Pod副本的抽象握恳,用于解決Pod的擴容和伸縮瞒窒。
Deployment
Deployment通常用來部署無狀態(tài)應(yīng)用,如Web服務(wù)乡洼, 該服務(wù)運行的實例不會在本地存儲需要持久化的數(shù)據(jù)崇裁,并且多個實例對于同一個請求響應(yīng)的結(jié)果是完全一致的匕坯。在內(nèi)部使用ReplicaSet來實現(xiàn)Pod副本的創(chuàng)建。Deployment確保指定數(shù)量的Pod“副本”在運行拔稳,并且支持回滾和滾動升級葛峻。
創(chuàng)建Deployment時,需要指定 Pod模板和Label標簽巴比。
StatefulSet
StatefulSet通常用來部署有狀態(tài)應(yīng)用术奖,如Mysql服務(wù),服務(wù)運行的實例需要在本地存儲持久化數(shù)據(jù)轻绞,多個實例之間有依賴拓撲關(guān)系采记,比如:主從關(guān)系、主備關(guān)系铲球。如果停止掉依賴中的一個Pod挺庞,就會導致數(shù)據(jù)丟失或者集群崩潰晰赞。他的核心功能就是通過某種方式記錄這些狀態(tài)稼病,然后在 Pod 被重新創(chuàng)建時,能夠為新 Pod 恢復這些狀態(tài)掖鱼。它包含Deployment控制器ReplicaSet的所有功能然走,增加可以處理Pod的啟動順序,為保留每個Pod的狀態(tài)設(shè)置唯一標識戏挡,同時具有以下功能:
- 穩(wěn)定的芍瑞、唯一的網(wǎng)絡(luò)標識符
- 穩(wěn)定的、持久化的存儲
- 有序的褐墅、優(yōu)雅的部署和縮放
DaemonSet
DaemonSet:服務(wù)守護進程拆檬,它的主要作用是在Kubernetes集群的所有節(jié)點中運行我們部署的守護進程,相當于在集群節(jié)點上分別部署Pod副本妥凳,如果有新節(jié)點加入集群竟贯,Daemonset會自動的在該節(jié)點上運行我們需要部署的Pod副本,相反如果有節(jié)點退出集群逝钥,Daemonset也會移除掉部署在舊節(jié)點的Pod副本屑那。
DaemonSet的主要特征:
- 這個 Pod 運行在 Kubernetes 集群里的每一個節(jié)點(Node)上;
- 每個節(jié)點上只會運行一個這樣的 Pod 實例艘款;
- 如果新的節(jié)點加入 Kubernetes 集群后持际,該 Pod 會自動地在新節(jié)點上被創(chuàng)建出來;
- 而當舊節(jié)點被刪除后哗咆,它上面的 Pod 也相應(yīng)地會被回收掉蜘欲。
DaemonSet常用場景:
- 網(wǎng)絡(luò)插件的 Agent 組件,如(Flannel晌柬,Calico)需要運行在每一個節(jié)點上姥份,用來處理這個節(jié)點上的容器網(wǎng)絡(luò)呜叫;
- 存儲插件的 Agent 組件,如(Ceph殿衰,Glusterfs)需要運行在每一個節(jié)點上朱庆,用來在這個節(jié)點上掛載F遠程存儲目錄;
- 監(jiān)控系統(tǒng)的數(shù)據(jù)收集組件闷祥,如(Prometheus Node Exporter娱颊,Cadvisor)需要運行在每一個節(jié)點上,負責這個節(jié)點上的監(jiān)控信息搜集凯砍。
- 日志系統(tǒng)的數(shù)據(jù)收集組件箱硕,如(Fluent,Logstash)需要運行在每一個節(jié)點上悟衩,負責這個節(jié)點上的日志信息搜集剧罩。
Job/CronJob
- Job負責處理任務(wù),即僅執(zhí)行一次的任務(wù)座泳,它保證批處理任務(wù)的一個或多個Pod成功結(jié)束惠昔,解決一些需要進行批量數(shù)據(jù)處理和分析的需求,挑势,比如Jenkins Slave镇防,發(fā)布完代碼后任務(wù)結(jié)束,Pod自動銷毀潮饱;
- CronJob則就是在Job上加上了時間調(diào)度来氧,用來執(zhí)行一些周期性的任務(wù)。
HPA
Horizontal Pod Autoscaling(Pod水平自動伸縮)香拉,簡稱HPA啦扬。通過監(jiān)控分析RC或者Deployment控制的所有Pod的負載變化情況來確定是否需要調(diào)整Pod的副本數(shù)量,這是HPA最基本的原理凫碌。
3. 其他對象
ConfigMap
ConfigMap:就是為了讓鏡像和配置文件解耦扑毡,以便實現(xiàn)鏡像的可移植性和可復用性,因為一個configMap其實就是一系列配置信息的集合证鸥,將來可直接注入到Pod中的容器使用僚楞,而注入方式有兩種,一種將configMap做為存儲卷枉层,一種是將configMap通過env中configMapKeyRef注入到容器中泉褐;
RBAC
RBAC:基于角色的訪問控制,可以用來給用戶授予對集群操作不同的權(quán)限鸟蜡。
Secret
Secret:用來保存敏感信息膜赃,例如密碼、OAuth 令牌和 ssh key等等揉忘,將這些信息放在Secret中比放在Pod的定義中或者docker鏡像中來說更加安全和靈活跳座。
4. 服務(wù)發(fā)現(xiàn)
Service
Service:是一種抽象的對象端铛,它定義了一組Pod的邏輯集合和一個用于訪問它們的策略,我們可以通過訪問Service來訪問到后端的Pod服務(wù)疲眷,其實這個概念和微服務(wù)非常類似禾蚕。一個Serivce下面包含的Pod集合一般是由Label Selector來決定的。
Ingress
Ingress:就是從 kuberenets 集群外部訪問集群的一個入口狂丝,將外部的請求轉(zhuǎn)發(fā)到集群內(nèi)不同的 Service 上换淆,其實就相當于 nginx、haproxy 等負載均衡代理服務(wù)器几颜,目前選擇有很多: traefik倍试、nginx-controller、Kubernetes Ingress Controller for Kong蛋哭、HAProxy Ingress controller县习。
5. 存儲對象
PV/PVC
- PV 的全稱是:PersistentVolume(持久化卷),是對底層的共享存儲的一種抽象谆趾,PV 由管理員進行創(chuàng)建和配置躁愿,它和具體的底層的共享存儲技術(shù)的實現(xiàn)方式有關(guān),比如 Ceph棺妓、GlusterFS攘已、NFS 等炮赦,都是通過插件機制完成與共享存儲的對接怜跑。
- PVC 的全稱是:PersistentVolumeClaim(持久化卷聲明),PVC 是用戶存儲的一種聲明吠勘,PVC 和 Pod 比較類似性芬,Pod 消耗的是節(jié)點,PVC 消耗的是 PV 資源剧防,Pod 可以請求 CPU 和內(nèi)存植锉,而 PVC 可以請求特定的存儲空間和訪問模式。對于真正使用存儲的用戶不需要關(guān)心底層的存儲實現(xiàn)細節(jié)峭拘,只需要直接使用 PVC 即可俊庇。
StorageClass
StorageClass:動態(tài) PV,可以自動幫我們創(chuàng)建 PV鸡挠,不再需要手動創(chuàng)建PV辉饱。
6. 其他概念
Helm
Helm:包管理工具,相當于kubernetes環(huán)境下的yum包管理工具拣展。
CRD
CRD是對 Kubernetes API 的擴展彭沼,Kubernetes 中的每個資源都是一個 API 對象的集合,例如我們在YAML文件里定義的那些spec都是對 Kubernetes 中的資源對象的定義备埃,所有的自定義資源可以跟 Kubernetes 中內(nèi)建的資源一樣使用 kubectl 操作姓惑。
Operator
Operator是由CoreOS公司開發(fā)的褐奴,用來擴展 Kubernetes API,特定的應(yīng)用程序控制器于毙,它用來創(chuàng)建敦冬、配置和管理復雜的有狀態(tài)應(yīng)用,如數(shù)據(jù)庫唯沮、緩存和監(jiān)控系統(tǒng)匪补。Operator基于 Kubernetes 的資源和控制器概念之上構(gòu)建,但同時又包含了應(yīng)用程序特定的一些專業(yè)知識烂翰,比如創(chuàng)建一個數(shù)據(jù)庫的Operator夯缺,則必須對創(chuàng)建的數(shù)據(jù)庫的各種運維方式非常了解,創(chuàng)建Operator的關(guān)鍵是CRD(自定義資源)的設(shè)計甘耿。Operator是將運維人員對軟件操作的知識給代碼化踊兜,同時利用 Kubernetes 強大的抽象來管理大規(guī)模的軟件應(yīng)用。
下篇文章:使用kubeadm快速部署K8S集群
系列文章:深入理解Kuerneters