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