kubernetes(k8s)容器编排工具基础概念
Kubernetes (K8s):
中文社區(qū):https://www.kubernetes.org.cn/replication-controller-kubernetes
官網(wǎng):https://kubernetes.io/
是一個開源系統(tǒng),用于容器化應(yīng)用的自動部署、擴(kuò)縮和管理。Kubernetes 將構(gòu)成應(yīng)用的容器按邏輯單位進(jìn)行分組以便于管理和發(fā)現(xiàn)。 Kubernetes 基于谷歌公司在運行生產(chǎn)負(fù)載上的 15 年經(jīng)驗打造,并融合了來自社區(qū)的最佳建議與實踐。我們先來看看他的架構(gòu)圖:
要使用 Kubernetes,你需要用Kubernetes API 對象來描述集群的預(yù)期狀態(tài)(desired state):包括你需要運行的應(yīng)用或者負(fù)載,它們使用的鏡像、副本數(shù),以及所需網(wǎng)絡(luò)和磁盤資源等等。你可以使用命令行工具kubectl來調(diào)用 Kubernetes API 創(chuàng)建對象,通過所創(chuàng)建的這些對象來配置預(yù)期狀態(tài)。你也可以直接調(diào)用 Kubernetes API 和集群進(jìn)行交互,設(shè)置或者修改預(yù)期狀態(tài)。
一旦你設(shè)置了你所需的目標(biāo)狀態(tài),Kubernetes 控制面(control plane)會通過 Pod 生命周期事件生成器( PLEG ),促成集群的當(dāng)前狀態(tài)符合其預(yù)期狀態(tài)。為此,Kubernetes 會自動執(zhí)行各類任務(wù),比如運行或者重啟容器、調(diào)整給定應(yīng)用的副本數(shù)等等。Kubernetes 控制面由一組運行在集群上的進(jìn)程組成:
Kubernetes Master(管理節(jié)點) 節(jié)點:
Kubernetes master 節(jié)點負(fù)責(zé)維護(hù)集群的目標(biāo)狀態(tài)。當(dāng)你要與 Kubernetes 通信時,使用如kubectl的命令行工具,就可以直接與 Kubernetes master 節(jié)點進(jìn)行通信。“master” 是指管理集群狀態(tài)的一組進(jìn)程的集合。通常這些進(jìn)程都跑在集群中一個單獨的節(jié)點上,并且這個節(jié)點被稱為 master 節(jié)點。master 節(jié)點也可以擴(kuò)展副本數(shù),來獲取更好的可用性及冗余。用于控制 Kubernetes 節(jié)點的計算機(jī),所有任務(wù)分配都來自于此。
Kubernetes 主控組件(Master)包含三個進(jìn)程,都運行在集群中的某個節(jié)上,通常這個節(jié)點被稱為 master 節(jié)點。這些進(jìn)程包括:
kube-apiserver:Kubernetes API服務(wù)器會驗證和配置api對象的數(shù)據(jù),這些對象包括容器,服務(wù),復(fù)制控制器等。API Server為REST操作提供服務(wù),并為群集的共享狀態(tài)提供前端,所有其他組件都通過該前端進(jìn)行交互。
kube-controller-manager:Kubernetes控制器管理器是一個守護(hù)程序,它嵌入了Kubernetes隨附的核心控制循環(huán)。在機(jī)器人技術(shù)和自動化應(yīng)用中,控制回路是一個非終止回路,用于調(diào)節(jié)系統(tǒng)狀態(tài)。在Kubernetes中,控制器是一個控制循環(huán),它通過apiserver監(jiān)視集群的共享狀態(tài),并進(jìn)行更改以嘗試將當(dāng)前狀態(tài)移向所需狀態(tài)。今天,Kubernetes附帶的控制器示例包括復(fù)制控制器,端點控制器,名稱空間控制器和serviceaccounts控制器。用來執(zhí)行整個系統(tǒng)中的后臺任務(wù),包括節(jié)點狀態(tài)狀況、Pod 個數(shù)、Pods 和 Service 的關(guān)聯(lián)等。
kube-scheduler:負(fù)責(zé)節(jié)點資源管理,接受來自 kube-apiserver 創(chuàng)建 Pods 任務(wù),并分配到某個節(jié)點。Kubernetes調(diào)度程序是一個策略豐富,可感知拓?fù)洌囟ㄓ诠ぷ髫?fù)載的功能,會顯著影響可用性,性能和容量。調(diào)度程序需要考慮單個和集體資源需求,服務(wù)質(zhì)量需求,硬件/軟件/策略約束,親和力和反親和力規(guī)范,數(shù)據(jù)本地性,工作間干擾,期限等。特定于工作負(fù)載的需求將在必要時通過API公開。
Kubernetes Node(工作節(jié)點) 節(jié)點
執(zhí)行請求和分配任務(wù)的計算機(jī),由 Kubernetes 主機(jī)負(fù)責(zé)對節(jié)點進(jìn)行控制。集群中的 node 節(jié)點(虛擬機(jī)、物理機(jī)等等)都是用來運行你的應(yīng)用和云工作流的機(jī)器。Kubernetes master 節(jié)點控制所有 node 節(jié)點;你很少需要和 node 節(jié)點進(jìn)行直接通信。
集群中的每個非 master 節(jié)點都運行兩個進(jìn)程:
kubelet,和 master 節(jié)點進(jìn)行通信。
kube-proxy,一種網(wǎng)絡(luò)代理,將 Kubernetes 的網(wǎng)絡(luò)服務(wù)代理到每個節(jié)點上。
Kubernetes 對象:
Kubernetes 包含若干抽象用來表示系統(tǒng)狀態(tài),包括:已部署的容器化應(yīng)用和負(fù)載、與它們相關(guān)的網(wǎng)絡(luò)和磁盤資源以及有關(guān)集群正在運行的其他操作的信息。這些抽象使用 Kubernetes API 對象來表示。參閱Kubernetes 對象概述以了解詳細(xì)信息。基本的 Kubernetes 對象包括:
Pod(容器集):被部署在單個節(jié)點上的,且包含一個或多個容器的容器組,Pod 是可以被創(chuàng)建,調(diào)度,并與 Kubernetes 管理最小部署單元,同一容器集中的所有容器共享同一個 IP 地址、IPC、主機(jī)名稱及其它資源。容器集會將網(wǎng)絡(luò)和存儲從底層容器中抽象出來,這樣,您就能更加輕松地在集群中移動容器。
Service(服務(wù)):服務(wù)為一組 Pod 提供單一穩(wěn)定的名稱和地址,服務(wù)可將工作定義與容器集分離,Kubernetes 服務(wù)代理會自動將服務(wù)請求分配到正確的容器集 — 無論這個容器集會移到集群中的哪個位置,即使它已被替換,也是如此。
Label(標(biāo)簽):標(biāo)簽用于組織和選擇基于鍵值對的對象組,它們被用于每一個 Kubernetes 組件。
Volume:Volume 是pod中能夠被多個容器訪問的共享目錄。概念、用途和目的與docker的vlume相似但不等價。
Namespace(命名空間):Namespace 是對一組資源和對象的抽象集合,比如可以用來將系統(tǒng)內(nèi)部的對象劃分為不同的項目組或用戶組。常見的 pods, services, replication controllers 和 deployments 等都是屬于某一個 namespace 的(默認(rèn)是 default),而 node, persistentVolumes 等則不屬于任何 namespace。
另外,Kubernetes 包含大量的被稱作控制器(controllers)的高級抽象。控制器基于基本對象構(gòu)建并提供額外的功能和方便使用的特性。具體包括:
Replication Controller(復(fù)制控制器):復(fù)制控制器管理 Pod 的生命周期,它們保證指定數(shù)量的 Pod 在任何給定的時間都在運行,他們通過創(chuàng)建或刪除 Pod 做到這一點。
ReplicaSet:ReplicaSet是kubernetes中的一種副本控制器,主要作用是控制由其管理的pod,使pod副本的數(shù)量始終維持在預(yù)設(shè)的個數(shù)。
Deployment(部署):Deployment 是新一代用于 Pod 管理的對象,與 Replication Controller 相比,它提供了更加完善的功能,使用起來更加簡單方便。
StatefulSet:StatefulSet是Kubernetes提供的管理有狀態(tài)應(yīng)用的負(fù)載管理控制器API。在Pods管理的基礎(chǔ)上,保證Pods的順序和一致性。與Deployment一樣,StatefulSet也是使用容器的Spec來創(chuàng)建Pod,與之不同StatefulSet創(chuàng)建的Pods在生命周期中會保持持久的標(biāo)記(例如Pod Name)。
DaemonSet:DaemonSet確保全部(或者一些)Node 上運行一個 Pod 的副本。當(dāng)有 Node 加入集群時,也會為他們新增一個 Pod 。當(dāng)有 Node 從集群移除時,這些 Pod 也會被回收。刪除 DaemonSet 將會刪除它創(chuàng)建的所有 Pod。
Job:Job對象通常用于運行那些僅需要執(zhí)行一次的任務(wù)(例如數(shù)據(jù)庫遷移,批處理腳本等等)。通過Job對象創(chuàng)建運行的Pod具有高可靠性,因為Job Controller會自動重啟運行失敗的Pod(例如Pod所在Node重啟或宕機(jī))。
Kubernetes 組件:
kubectl:客戶端命令行工具,將接受的命令格式化后發(fā)送給 kube-apiserver,作為整個系統(tǒng)的操作入口。
kube-apiserver:作為整個系統(tǒng)的控制入口,以 REST API 服務(wù)提供接口。
kube-controller-manager:用來執(zhí)行整個系統(tǒng)中的后臺任務(wù),包括節(jié)點狀態(tài)狀況、Pod 個數(shù)、Pods 和 Service 的關(guān)聯(lián)等。
kube-scheduler(將 Pod 調(diào)度到 Node 上):負(fù)責(zé)節(jié)點資源管理,接受來自 kube-apiserver 創(chuàng)建 Pods 任務(wù),并分配到某個節(jié)點。
etcd:負(fù)責(zé)節(jié)點間的服務(wù)發(fā)現(xiàn)和配置共享。集群中這些數(shù)據(jù)保存,分布式存儲
kube-proxy:運行在每個計算節(jié)點上,負(fù)責(zé) Pod 網(wǎng)絡(luò)代理。定時從 etcd 獲取到 Service 信息來做相應(yīng)的策略。
kubelet:運行在每個計算節(jié)點上,作為 agent,接受分配該節(jié)點的 Pods 任務(wù)及管理容器,周期性獲取容器狀態(tài),反饋給 kube-apiserver。
DNS:一個可選的DNS服務(wù),用于為每個 Service 對象創(chuàng)建 DNS 記錄,這樣所有的 Pod 就可以通過 DNS 訪問服務(wù)了。
flannel:Flannel 是 CoreOS 團(tuán)隊針對 Kubernetes 設(shè)計的一個覆蓋網(wǎng)絡(luò)(Overlay Network)工具,需要另外下載部署。我們知道當(dāng)我們啟動 Docker 后會有一個用于和容器進(jìn)行交互的 IP 地址,如果不去管理的話可能這個 IP 地址在各個機(jī)器上是一樣的,并且僅限于在本機(jī)上進(jìn)行通信,無法訪問到其他機(jī)器上的 Docker 容器。Flannel 的目的就是為集群中的所有節(jié)點重新規(guī)劃 IP 地址的使用規(guī)則,從而使得不同節(jié)點上的容器能夠獲得同屬一個內(nèi)網(wǎng)且不重復(fù)的 IP 地址,并讓屬于不同節(jié)點上的容器能夠直接通過內(nèi)網(wǎng) IP 通信。
來看一下官方提供的架構(gòu)圖:
到此為止我們只需要對k8s有個感性的認(rèn)識就行。畢竟我們還沒有進(jìn)行實操。
使用Minikube搭建單節(jié)點K8s:
kubectl官網(wǎng) :https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-on-linux
minikube官網(wǎng) :https://kubernetes.io/docs/tasks/tools/install-minikube/
安裝kubectl
# 01 curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.17.0/bin/linux/amd64/kubectl # 02 授權(quán) chmod +x ./kubectl # 03 添加到環(huán)境變量 sudo mv ./kubectl /usr/local/bin/kubectl # 04 檢查 kubectl version
安裝minikube:
# 01 下載 wget https://github.com/kubernetes/minikube/releases/download/v1.5.2/minikube- linux-amd64 # 02 配置環(huán)境變量 sudo mv minikube-linux-amd64 minikube && chmod +x minikube && mv minikube /usr/local/bin/ # 03 檢查 minikube version
使用minikube創(chuàng)建單節(jié)點的k8s:
minikube start --vm-driver=none --image-repository=gcr.azk8s.cn/google-containers
由于網(wǎng)絡(luò)問題,我這邊就沒有實操,網(wǎng)絡(luò)通暢的小伙伴可以自己去試試。接下去可以做一下操作來熟悉k8s。
總結(jié)
以上是生活随笔為你收集整理的kubernetes(k8s)容器编排工具基础概念的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: top详解--查看cpu及内存使用情况
- 下一篇: 内网穿透原理及实现一:C/S,P2P模式