Kubernetes 簡(jiǎn)介
導(dǎo)讀:Kubernetes(K8s)是開源的拼卵,用于管理云平臺(tái)中多個(gè)主機(jī)上的容器化的應(yīng)用硕并,應(yīng)用操作包括部署纳猪,調(diào)度和節(jié)點(diǎn)集群間擴(kuò)展陋葡。如果你曾經(jīng)用過 Docker 容器技術(shù)部署容器,那么可以將 Docker 看成 Kubernetes 內(nèi)部使用的低級(jí)別組件救拉。(Kubernetes 不僅僅支持 Docker难审,還支持 Rocket,這是另一種容器技術(shù))
小貼士:K8s 是 Kubernetes 的縮寫亿絮,其中 8 是指 K 后面的 8 個(gè)字母
Kubernetes 的作用
- 自動(dòng)化容器的部署和復(fù)制
- 隨時(shí)擴(kuò)展或收縮容器規(guī)模
- 將容器組織成組告喊,并且提供容器間的負(fù)載均衡
- 很容易地升級(jí)應(yīng)用程序容器的新版本
- 提供容器彈性,如果容器失效就替換它
...
K8s 基本介紹
架構(gòu)圖
[站外圖片上傳中...(image-ed1ab9-1564482843628)]
組件
- etcd 保存了整個(gè)集群的狀態(tài)派昧;
- apiserver 用于暴露 Kubernetes API黔姜,提供了資源操作的唯一入口。任何的資源請(qǐng)求/調(diào)用操作都是通過kube-apiserver提供的接口進(jìn)行蒂萎;
- controller manager 負(fù)責(zé)維護(hù)集群的狀態(tài)秆吵,比如故障檢測(cè)、自動(dòng)擴(kuò)展五慈、滾動(dòng)更新等纳寂;
- scheduler 負(fù)責(zé)資源的調(diào)度实苞,按照預(yù)定的調(diào)度策略將 Pod 調(diào)度到相應(yīng)的機(jī)器上;
- kubelet 負(fù)責(zé)維護(hù)容器的生命周期烈疚,同時(shí)也負(fù)責(zé) Volume(CVI)和網(wǎng)絡(luò)(管理 Kubernetes Master 和 Node 之間的通信)的管理;
- Container runtime 負(fù)責(zé)鏡像管理以及 Pod 和容器的真正運(yùn)行(CRI)聪轿;
- kube-proxy 負(fù)責(zé)為 Service 提供 cluster 內(nèi)部的服務(wù)發(fā)現(xiàn)和負(fù)載均衡爷肝;
- kube-dns 負(fù)責(zé)為整個(gè)集群提供 DNS 服務(wù)
名詞解釋
[圖片上傳失敗...(image-5a1676-1564482843628)]
Node
節(jié)點(diǎn)是物理或者虛擬機(jī)器,作為 Kubernetes worker陆错,通常稱為 Minion灯抛。每個(gè)節(jié)點(diǎn)都運(yùn)行如下 Kubernetes 關(guān)鍵組件:
kubelet:是主節(jié)點(diǎn)代理。
kube-proxy:Service 使用其將鏈接路由到 Pod音瓷,如上文所述对嚼。
Docker 或 Rocket:Kubernetes 使用的容器技術(shù)來創(chuàng)建容器。
集群擁有一個(gè) Kubernetes Master绳慎。Kubernetes Master 提供集群管理控制纵竖,并且擁有一系列組件,比如 Kubernetes API Server 與 Replication Controller杏愤。API Server 提供可以用來和集群交互的接口靡砌;Replication Controller 用于創(chuàng)建和復(fù)制 Pod。
Pod
Pod 應(yīng)用于節(jié)點(diǎn)上珊楼,包含一組容器和卷通殃,一個(gè) Pod 是一個(gè)容器環(huán)境下的“邏輯主機(jī)”(類似模具下生產(chǎn)出的玩具),它可能包含一個(gè)或者多個(gè)緊密相連的應(yīng)用厕宗。同一個(gè) Pod 里的容器和應(yīng)用共享同一個(gè)網(wǎng)絡(luò)命名空間(可以使用 localhost 互相通信)画舌。Pod 中的應(yīng)用也可以共享磁盤(Volumes)。
Pod 是短暫的(無狀態(tài))已慢,不是持續(xù)性實(shí)體曲聂。
提出問題:
- 如果 Pod 是短暫的,那么我怎么才能持久化容器數(shù)據(jù)使其能夠跨重啟而存在呢蛇受?
雖然 Kubernetes 支持卷的概念句葵,但共享磁盤目錄(EmptyDir)的生命周期和所屬的 Pod 是完全一致的,因此 Pod 中的數(shù)據(jù)并不能跨重啟而存在兢仰。 - 是否手動(dòng)創(chuàng)建 Pod乍丈,如果想要?jiǎng)?chuàng)建同一個(gè)容器的多份拷貝,需要一個(gè)個(gè)分別創(chuàng)建出來么把将?
可以手動(dòng)創(chuàng)建單個(gè) Pod轻专,但是也可以使用 Replication Controller 使用 Pod 模板創(chuàng)建出多份拷貝,下文會(huì)詳細(xì)介紹察蹲。 - 如果 Pod 是短暫的请垛,那么重啟時(shí) IP 地址可能會(huì)改變催训,那么怎么才能從前端容器正確可靠地指向后臺(tái)容器呢?
這時(shí)可以使用 Service宗收,下文會(huì)詳細(xì)介紹
Label
正如圖所示漫拭,一些 Pod 有 Label(pod description)。一個(gè) Label 是附加(attach)到Pod的一對(duì)鍵/值對(duì)混稽,用來傳遞用戶定義的屬性采驻。比如,你可能創(chuàng)建了一個(gè)“tier”和“app”標(biāo)簽匈勋,通過 Label(tier = backend, app = myapp)來標(biāo)記后端 Pod 容器礼旅。然后可以使用 Selectors 選擇帶有特定 Label 的 Pod 進(jìn)行相關(guān)操作,比如將 Service 或者 Replication Controller 應(yīng)用到上面洽洁。
Service
Service 定義了訪問這些 Pod 的策略的一層抽象痘系。Service 通過 Label 找到 Pod 組。
現(xiàn)在饿自,假定有 2 個(gè)后臺(tái) Pod汰翠,并且定義后臺(tái) Service 的名稱為“backend-service”,Label 選擇器為(tier = backend, app = myapp)璃俗。backend-service 的 Service 會(huì)完成如下兩件重要的事情:
- 服務(wù)發(fā)現(xiàn)
將新的 Pod 服務(wù)放入其負(fù)載均衡的體系中 - DNS 尋址
會(huì)為 Service 創(chuàng)建一個(gè)本地集群的 DNS 入口奴璃,因此前端 Pod 只需要通過組件 DNS 查找主機(jī)名為“backend-service”(此過程由 kube-dns 組件實(shí)現(xiàn)),就能夠解析出前端應(yīng)用程序可用的 IP 地址城豁。
得到了后臺(tái)服務(wù)的 IP 地址后苟穆,Service 在這 2 個(gè)后臺(tái) Pod 之間提供透明的負(fù)載均衡,會(huì)將請(qǐng)求分發(fā)給其中的任意一個(gè)(如下面的動(dòng)畫所示)唱星。通過每個(gè) Node 上運(yùn)行的代理(kube-proxy)完成雳旅。
[圖片上傳失敗...(image-f29038-1564482843628)]
有一個(gè)特別類型的 Kubernetes Service,稱為“LoadBalancer”间聊,作為外部負(fù)載均衡器使用攒盈,在一定數(shù)量的 Pod 之間均衡流量。
Replication Controller
Replication Controller(簡(jiǎn)單理解為上文提到的模具)確保任意時(shí)間都有指定數(shù)量的 Pod“副本”在運(yùn)行哎榴。如果為某個(gè) Pod 創(chuàng)建了 Replication Controller 并且指定 3 個(gè)副本型豁,它會(huì)創(chuàng)建 3 個(gè) Pod,并且持續(xù)監(jiān)控它們尚蝌。如果某個(gè) Pod 不響應(yīng)迎变,那么 Replication Controller 會(huì)替換它,保持總數(shù)永遠(yuǎn)為 3飘言。
如果之前不響應(yīng)的 Pod 恢復(fù)了衣形,Replication Controller 會(huì)將其中一個(gè)終止保持總數(shù)為 3。如果在運(yùn)行中將副本總數(shù)改為 5姿鸿,Replication Controller會(huì)立刻啟動(dòng) 2 個(gè)新 Pod谆吴,保證總數(shù)為 5倒源。還可以按照這樣的方式縮小 Pod。在節(jié)點(diǎn)掛掉重啟時(shí)句狼,可以自動(dòng)創(chuàng)建 Pod 及相關(guān)應(yīng)用服務(wù)笋熬。
創(chuàng)建 Replication Controller 需要的條件:
Pod 模板(模具):用來創(chuàng)建 Pod 副本的模板
Label:Replication Controller 需要監(jiān)控的 Pod 的標(biāo)簽。
ReplicaSet(RS)
Replication Controller(RC)的升級(jí)版本腻菇。ReplicaSet 和 Replication Controller 之間的唯一區(qū)別是對(duì)選擇器的支持突诬。ReplicaSet 支持 labels user guide 中描述的 set-based 選擇器要求, 而 Replication Controller 僅支持 equality-based 的選擇器要求芜繁。
Deployment
Deployment 為 Pod 和 Replica Set 提供聲明式更新。
你只需要在 Deployment 中描述您想要的目標(biāo)狀態(tài)是什么绒极,Deployment controller 就會(huì)幫您將 Pod 和 ReplicaSet 的實(shí)際狀態(tài)改變到您的目標(biāo)狀態(tài)骏令。您可以定義一個(gè)全新的 Deployment 來創(chuàng)建 ReplicaSet 或者刪除已有的 Deployment 并創(chuàng)建一個(gè)新的來替換。
注意:一般情況下不該手動(dòng)管理由 Deployment 創(chuàng)建的 Replica Set垄提,否則就篡越了 Deployment controller 的職責(zé)榔袋!
kubectl
kubectl 用于運(yùn)行 Kubernetes 集群命令的管理工具。
eg:
- kubectl run nginx --image=nginx
命令參考手冊(cè)
ConfigMap 與 Secret
ConfigMap 與 Secret 用于保存配置數(shù)據(jù)的鍵值對(duì)铡俐,可以用來保存單個(gè)屬性凰兑,也可以用來保存配置文件。ConfigMap 跟 Secret 很類似审丘,但它可以更方便地處理不包含敏感信息的字符串吏够。